Beispiel #1
0
        public EntitySchema MapAttributeSchemaDefinition(AttributeSchemaDefinition attributeSchemaDefinition, AbstractLookupHelper lookupHelper, AbstractMappingEngine masterMapper)
        {
            //TODO
            //- Map AttributeGroupDefinitions - how to track changes?
            //- Add DateModified to Rdbms model
            var mapped = new EntitySchema();

            MapAttributeSchemaDefinition(attributeSchemaDefinition, mapped, lookupHelper, masterMapper);
            return(mapped);
        }
Beispiel #2
0
 private static IQueryOver <NodeVersion, NodeVersion> AddSchemasToOuterQuery(IQueryOver <NodeVersion, NodeVersion> mainLoaderQuery, NhCriteriaVisitor.FilterResult filteringSubquery)
 {
     if (filteringSubquery.RequiredSchemaAliases != null && filteringSubquery.RequiredSchemaAliases.Any())
     {
         AttributeSchemaDefinition schema = null;
         mainLoaderQuery = mainLoaderQuery
                           .JoinAlias(x => x.AttributeSchemaDefinition, () => schema)
                           .Where(() => schema.Alias.IsIn(filteringSubquery.RequiredSchemaAliases.ToArray()));
     }
     if (filteringSubquery.RequiredNodeIds != null && filteringSubquery.RequiredNodeIds.Any())
     {
         mainLoaderQuery = mainLoaderQuery
                           .Where(x => x.Node.Id.IsIn(filteringSubquery.RequiredNodeIds.ToArray()));
     }
     return(mainLoaderQuery);
 }
Beispiel #3
0
 private static IQueryOver <AggregateNodeStatus, AggregateNodeStatus> AddSchemasToOuterQuery(IQueryOver <AggregateNodeStatus, AggregateNodeStatus> aggQuery, NhAggregateCriteriaVisitor.FilterResult filteringSubquery)
 {
     if (filteringSubquery.RequiredSchemaAliases != null && filteringSubquery.RequiredSchemaAliases.Any())
     {
         AttributeSchemaDefinition schema = null;
         NodeVersion v = null;
         aggQuery = aggQuery
                    .JoinAlias(x => x.NodeVersion, () => v)
                    .JoinAlias(() => v.AttributeSchemaDefinition, () => schema)
                    .Where(() => schema.Alias.IsIn(filteringSubquery.RequiredSchemaAliases.ToArray()));
     }
     if (filteringSubquery.RequiredNodeIds != null && filteringSubquery.RequiredNodeIds.Any())
     {
         aggQuery = aggQuery
                    .Where(x => x.Node.Id.IsIn(filteringSubquery.RequiredNodeIds.ToArray()));
     }
     return(aggQuery);
 }
        public void From_AttributeSchemaDefinition_With_Relations_To_EntitySchema()
        {
            //Arrange

            var mapper = new ManualMapper(new FakeLookupHelper(), new FakeHiveProvider());

            mapper.Configure();

            var entityParent = new AttributeSchemaDefinition()
            {
                Id = Guid.NewGuid(), Alias = "test-parent"
            };
            var entityChild = new AttributeSchemaDefinition()
            {
                Id = Guid.NewGuid(), Alias = "test-child"
            };

            entityParent.OutgoingRelations.Add(new NodeRelation()
            {
                StartNode        = entityParent,
                EndNode          = entityChild,
                NodeRelationType = new NodeRelationType()
                {
                    Alias = FixedRelationTypes.SchemaTreeRelationType.RelationName,
                    Id    = FixedRelationTypes.SchemaTreeRelationType.RelationName.EncodeAsGuid()
                }
            });

            //Act

            var resultParent = mapper.Map <AttributeSchemaDefinition, EntitySchema>(entityParent);

            //var resultChild = mapper.Map<TypedEntity, NodeVersion>(entityChild);

            //Assert

            Assert.AreEqual(entityParent.Alias, resultParent.Alias);
            Assert.AreEqual(entityParent.OutgoingRelations.Count(), resultParent.Relations.Count());
            Assert.AreEqual(entityParent.OutgoingRelations.Single().StartNode.Id, (Guid)resultParent.Relations.Single().Source.Id.Value);
            Assert.AreEqual(entityParent.OutgoingRelations.Single().EndNode.Id, (Guid)resultParent.Relations.Single().Destination.Id.Value);

            //BUG: If you call entityChild.Relations.Count() an infinite loop occurs :(
            //Assert.AreEqual(entityChild.Relations.Count(), resultChild.Node.IncomingRelations.Count);
        }
Beispiel #5
0
        //public void MapAttributeGroup(AttributeGroup destination, AttributeDefinitionGroup source)
        //{
        //    destination.Alias = source.Alias;
        //    destination.Id = source.Id;
        //    destination.Name = source.Name;
        //    destination.UtcCreated = source.DateCreated;
        //}

        //public AttributeGroup MapAttributeGroup(AttributeDefinitionGroup attributeGroup)
        //{
        //    // TODO:
        //    // - Attributes and AttributeDefinitions navigator on the stack model will be tricky to track changes
        //    // - Add Ordinal to Rdbms model
        //    var mapped = new AttributeGroup();
        //    MapAttributeGroup(mapped, attributeGroup);
        //    return mapped;
        //}

        public void MapAttributeSchemaDefinition(AttributeSchemaDefinition source, EntitySchema destination, AbstractLookupHelper lookupHelper, AbstractMappingEngine masterMapper)
        {
            destination.Alias      = source.Alias;
            destination.Id         = (HiveId)source.Id;
            destination.Name       = source.Name;
            destination.UtcCreated = source.DateCreated;
            destination.SchemaType = source.SchemaType;

            if (!string.IsNullOrEmpty(source.XmlConfiguration))
            {
                destination.XmlConfiguration = XDocument.Parse(source.XmlConfiguration); // else the constructor will initialize it
            }
            destination.AttributeGroups.Clear();
            destination.AttributeDefinitions.Clear();
            //destination.AttributeTypes.Clear();

            foreach (var attributeDefinitionGroup in source.AttributeDefinitionGroups)
            {
                var mappedGroup = MapAttributeGroupDefinition(attributeDefinitionGroup, lookupHelper, masterMapper);
                destination.AttributeGroups.Add(mappedGroup);
            }

            //create a local cache of AttributeTypes to pass to the mappers so that we can
            //ensure that the same AttributeType based on the alias is the same used across all
            //AttributeDefinitions.
            var attributeTypeCache = new List <Model.Attribution.MetaData.AttributeType>();

            foreach (var attributeDefinition in source.AttributeDefinitions)
            {
                var localAttribCopy = attributeDefinition;
                var newDef          = MapAttributeDefinition(localAttribCopy, lookupHelper, masterMapper, attributeTypeCache);
                newDef.AttributeGroup = destination.AttributeGroups.SingleOrDefault(x => x.Alias == localAttribCopy.AttributeDefinitionGroup.Alias);
                if (newDef.AttributeGroup == null)
                {
                    throw new InvalidOperationException(
                              "Could not find group with alias {0} for mapping".InvariantFormat(
                                  localAttribCopy.AttributeDefinitionGroup.Alias));
                }
                destination.AttributeDefinitions.Add(newDef);
            }

            MapRelations(source, destination, lookupHelper, masterMapper);
        }
        public static void MapAttributeSchemaDefinition(EntitySchema source, AttributeSchemaDefinition destinationSchema, AbstractLookupHelper lookupHelper, AbstractMappingEngine masterMapper)
        {
            destinationSchema.Alias            = source.Alias;
            destinationSchema.Id               = (Guid)source.Id.Value;
            destinationSchema.Name             = source.Name;
            destinationSchema.DateCreated      = source.UtcCreated;
            destinationSchema.XmlConfiguration = source.XmlConfiguration.ToString();
            destinationSchema.SchemaType       = source.SchemaType;

            // Find groups in both source and destination that exist, and remap them at the destination
            // Then find groups only at the source, and add them
            // Then find groups only at the destination, and remove them
            var groupsToRemove = MergeMapCollections(
                source.AttributeGroups,
                destinationSchema.AttributeDefinitionGroups,
                (sourceGroup, destGroup) => MapAttributeDefinitionGroup(sourceGroup, destGroup, lookupHelper, masterMapper),
                sourceGroup => MapAttributeDefinitionGroup(sourceGroup, lookupHelper, masterMapper),
                (sourceGroup, destGroup) => destGroup.AttributeSchemaDefinition = destinationSchema,
                (sourceGroup, destGroup) => sourceGroup.Alias == destGroup.Alias
                );

            // Now do the same for the attribute definitions
            var defsToRemove = MergeMapCollections(
                source.AttributeDefinitions,
                destinationSchema.AttributeDefinitions,
                (sourceDef, destDef) => MapAttributeDefinition(sourceDef, destDef, lookupHelper, masterMapper),
                sourceDef => MapAttributeDefinition(sourceDef, lookupHelper, masterMapper),
                (sourceDef, destDef) =>
            {
                destDef.AttributeSchemaDefinition = destinationSchema;
                if (sourceDef.AttributeGroup == null)
                {
                    return;
                }

                var localDefCopy = sourceDef;
                var mappedGroup  = destinationSchema.AttributeDefinitionGroups.Single(x => x.Alias == localDefCopy.AttributeGroup.Alias);
                destDef.AttributeDefinitionGroup = mappedGroup;
            },
                (sourceGroup, destGroup) => sourceGroup.Alias == destGroup.Alias
                );

            // Hack for beta: make sure if there are any remaining AttributeDefinitions referenced via a group, but not in the AttributeDefinitions collection,
            // we delete it from the group
            var defsToDelete = new List <AttributeDefinition>();

            foreach (var attributeDefinitionGroup in destinationSchema.AttributeDefinitionGroups)
            {
                foreach (var attributeDefinition in attributeDefinitionGroup.AttributeDefinitions)
                {
                    if (!destinationSchema.AttributeDefinitions.Contains(attributeDefinition))
                    {
                        defsToDelete.Add(attributeDefinition);
                    }
                }
            }
            foreach (var attributeDefinition in defsToDelete)
            {
                foreach (var attributeDefinitionGroup in destinationSchema.AttributeDefinitionGroups)
                {
                    attributeDefinitionGroup.AttributeDefinitions.Remove(attributeDefinition);
                }
            }

            MapRelations(destinationSchema, source, lookupHelper, masterMapper);
        }
        public void SavingNodeVersion_ViaAddingToNodeCollection_UpdatesExistingInstance_WhenMerging()
        {
            var setup = new NhibernateTestSetupHelper();
            var node = new Node() { IsDisabled = false };

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                node = setup.SessionForTest.Merge(node) as Node;
                //setup.SessionForTest.SaveOrUpdate(node);
                tran.Commit();
            }

            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));
            setup.SessionForTest.Clear();

            Assert.That(setup.SessionForTest.QueryOver<Node>().List().Count, Is.EqualTo(1));
            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));

            NodeVersion nodeVersion = null;

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                // Get the node from the cleared session to mimic what the NH revision repository is doing
                node = setup.SessionForTest.Get<Node>(node.Id);

                var currentNodeId = node.Id;
                Assert.That(currentNodeId, Is.Not.EqualTo(Guid.Empty));

                var schema = new AttributeSchemaDefinition { Alias = "tes1", SchemaType = "content" };
                nodeVersion = new NodeVersion { DefaultName = "test", Node = node, AttributeSchemaDefinition = schema };

                nodeVersion = setup.SessionForTest.Merge(nodeVersion) as NodeVersion;


                node.NodeVersions.Add(nodeVersion);
                
                node = setup.SessionForTest.Merge(node) as Node;

                tran.Commit();
                Assert.That(currentNodeId, Is.EqualTo(node.Id));
                Assert.That(node.NodeVersions.Count, Is.EqualTo(1));
                Assert.That(node.NodeVersions.First().Id, Is.EqualTo(nodeVersion.Id));
                Assert.That(nodeVersion.Id, Is.Not.EqualTo(Guid.Empty));
            }

            setup.SessionForTest.Clear();

            Assert.That(setup.SessionForTest.QueryOver<Node>().List().Count, Is.EqualTo(2)); // One for the Node, one for the Schema
            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));

            node = setup.SessionForTest.Get<Node>(node.Id);

            Assert.That(node.NodeVersions, Is.Not.Empty);
            Assert.That(node.NodeVersions.Count, Is.EqualTo(1));
            Assert.That(nodeVersion.Id, Is.Not.EqualTo(Guid.Empty));
            Assert.That(node.NodeVersions.First().Id, Is.EqualTo(nodeVersion.Id));
        }
        public void WhenAddingNodeVersionToSession_ThenClearingAndResettingAttributesCollection_BeforeCommitting_AttributesCollectionIsCorrect()
        {
            var setup = new NhibernateTestSetupHelper();
            var node = new Node() { IsDisabled = false };

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                node = setup.SessionForTest.Merge(node) as Node;
                tran.Commit();
            }
            setup.SessionForTest.Clear();

            NodeVersion nodeVersion = null;

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                // Get the node from the cleared session to mimic what the NH revision repository is doing
                node = setup.SessionForTest.Get<Node>(node.Id);

                var currentNodeId = node.Id;
                Assert.That(currentNodeId, Is.Not.EqualTo(Guid.Empty));

                var schema = new AttributeSchemaDefinition { Alias = "tes1", SchemaType = "content" };
                var type = new AttributeType { Alias = "type1" };
                var def = new AttributeDefinition
                    { Alias = "def1", AttributeDefinitionGroup = new AttributeDefinitionGroup { Alias = "group1", AttributeSchemaDefinition = schema}, AttributeSchemaDefinition = schema, AttributeType = type};
                schema.AttributeDefinitions.Add(def);
                nodeVersion = new NodeVersion { DefaultName = "test", Node = node, AttributeSchemaDefinition = schema };
                nodeVersion.Attributes.Add(new Attribute { AttributeDefinition = def, NodeVersion = nodeVersion });
                nodeVersion.Node = node;

                // Merge the version into the session, which will add it to 1st-level cache but we haven't committed to db yet
                nodeVersion = setup.SessionForTest.Merge(nodeVersion) as NodeVersion;

                var persister = setup.SessionForTest.GetSessionImplementation().PersistenceContext;

                nodeVersion.Attributes.Clear();
                nodeVersion.Attributes.Add(new Attribute { AttributeDefinition = def, NodeVersion = nodeVersion });

                nodeVersion = setup.SessionForTest.Merge(nodeVersion) as NodeVersion;

                node.NodeVersions.Add(nodeVersion);

                setup.SessionForTest.Merge(node);

                tran.Commit();
            }
            setup.SessionForTest.Clear();

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                var reloadVersion = setup.SessionForTest.Get<NodeVersion>(nodeVersion.Id);
                reloadVersion.Attributes.Clear();
                setup.SessionForTest.Merge(reloadVersion);
                tran.Commit();
            }

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                var reloadVersion = setup.SessionForTest.Get<NodeVersion>(nodeVersion.Id);
                Assert.That(reloadVersion.Attributes.Count, Is.EqualTo(1));
            }
        }
        public void WhenAddingNodeVersionToSession_ThenClearingAndResettingAttributesCollection_BeforeCommitting_AttributesCollectionIsCorrect()
        {
            var setup = new NhibernateTestSetupHelper();
            var node  = new Node()
            {
                IsDisabled = false
            };

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                node = setup.SessionForTest.Merge(node) as Node;
                tran.Commit();
            }
            setup.SessionForTest.Clear();

            NodeVersion nodeVersion = null;

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                // Get the node from the cleared session to mimic what the NH revision repository is doing
                node = setup.SessionForTest.Get <Node>(node.Id);

                var currentNodeId = node.Id;
                Assert.That(currentNodeId, Is.Not.EqualTo(Guid.Empty));

                var schema = new AttributeSchemaDefinition {
                    Alias = "tes1", SchemaType = "content"
                };
                var type = new AttributeType {
                    Alias = "type1"
                };
                var def = new AttributeDefinition
                {
                    Alias = "def1", AttributeDefinitionGroup = new AttributeDefinitionGroup {
                        Alias = "group1", AttributeSchemaDefinition = schema
                    }, AttributeSchemaDefinition = schema, AttributeType = type
                };
                schema.AttributeDefinitions.Add(def);
                nodeVersion = new NodeVersion {
                    DefaultName = "test", Node = node, AttributeSchemaDefinition = schema
                };
                nodeVersion.Attributes.Add(new Attribute {
                    AttributeDefinition = def, NodeVersion = nodeVersion
                });
                nodeVersion.Node = node;

                // Merge the version into the session, which will add it to 1st-level cache but we haven't committed to db yet
                nodeVersion = setup.SessionForTest.Merge(nodeVersion) as NodeVersion;

                var persister = setup.SessionForTest.GetSessionImplementation().PersistenceContext;

                nodeVersion.Attributes.Clear();
                nodeVersion.Attributes.Add(new Attribute {
                    AttributeDefinition = def, NodeVersion = nodeVersion
                });

                nodeVersion = setup.SessionForTest.Merge(nodeVersion) as NodeVersion;

                node.NodeVersions.Add(nodeVersion);

                setup.SessionForTest.Merge(node);

                tran.Commit();
            }
            setup.SessionForTest.Clear();

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                var reloadVersion = setup.SessionForTest.Get <NodeVersion>(nodeVersion.Id);
                reloadVersion.Attributes.Clear();
                setup.SessionForTest.Merge(reloadVersion);
                tran.Commit();
            }

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                var reloadVersion = setup.SessionForTest.Get <NodeVersion>(nodeVersion.Id);
                Assert.That(reloadVersion.Attributes.Count, Is.EqualTo(1));
            }
        }
        public void SavingNodeVersion_ViaAddingToNodeCollection_UpdatesExistingInstance_WhenMerging()
        {
            var setup = new NhibernateTestSetupHelper();
            var node  = new Node()
            {
                IsDisabled = false
            };

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                node = setup.SessionForTest.Merge(node) as Node;
                //setup.SessionForTest.SaveOrUpdate(node);
                tran.Commit();
            }

            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));
            setup.SessionForTest.Clear();

            Assert.That(setup.SessionForTest.QueryOver <Node>().List().Count, Is.EqualTo(1));
            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));

            NodeVersion nodeVersion = null;

            using (var tran = setup.SessionForTest.BeginTransaction())
            {
                // Get the node from the cleared session to mimic what the NH revision repository is doing
                node = setup.SessionForTest.Get <Node>(node.Id);

                var currentNodeId = node.Id;
                Assert.That(currentNodeId, Is.Not.EqualTo(Guid.Empty));

                var schema = new AttributeSchemaDefinition {
                    Alias = "tes1", SchemaType = "content"
                };
                nodeVersion = new NodeVersion {
                    DefaultName = "test", Node = node, AttributeSchemaDefinition = schema
                };

                nodeVersion = setup.SessionForTest.Merge(nodeVersion) as NodeVersion;


                node.NodeVersions.Add(nodeVersion);

                node = setup.SessionForTest.Merge(node) as Node;

                tran.Commit();
                Assert.That(currentNodeId, Is.EqualTo(node.Id));
                Assert.That(node.NodeVersions.Count, Is.EqualTo(1));
                Assert.That(node.NodeVersions.First().Id, Is.EqualTo(nodeVersion.Id));
                Assert.That(nodeVersion.Id, Is.Not.EqualTo(Guid.Empty));
            }

            setup.SessionForTest.Clear();

            Assert.That(setup.SessionForTest.QueryOver <Node>().List().Count, Is.EqualTo(2)); // One for the Node, one for the Schema
            Assert.That(node.Id, Is.Not.EqualTo(Guid.Empty));

            node = setup.SessionForTest.Get <Node>(node.Id);

            Assert.That(node.NodeVersions, Is.Not.Empty);
            Assert.That(node.NodeVersions.Count, Is.EqualTo(1));
            Assert.That(nodeVersion.Id, Is.Not.EqualTo(Guid.Empty));
            Assert.That(node.NodeVersions.First().Id, Is.EqualTo(nodeVersion.Id));
        }