/// <summary> /// Function to find if the operations collection has a foreign key /// </summary> /// <param name="operations"></param> /// <returns></returns> private static bool HasForeignKeyOperations(CdmOperationCollection operations) { List <CdmOperationBase> list = operations .Where <CdmOperationBase>(op => op.ObjectType == CdmObjectType.OperationReplaceAsForeignKeyDef).ToList(); return(list.Count > 0); }
/// <summary> /// When no explicit condition is provided, a projection will apply the default condition expression based on the operations /// This function defined the defaults for each operation and builds the projection's condition expression /// </summary> /// <param name="operations"></param> /// <param name="owner"></param> /// <returns></returns> internal static string GetDefaultConditionExpression(CdmOperationCollection operations, CdmObject owner = null) { StringBuilder bldr = new StringBuilder(); // if the owner of the projection is an entity attribute if (owner?.ObjectType == CdmObjectType.EntityAttributeDef) { bldr.Append($" ( (!normalized) || (cardinality.maximum <= 1) ) "); } if (operations.Count > 0) { if (HasForeignKeyOperations(operations)) { bldr = AppendString(bldr, $" (referenceOnly || noMaxDepth || (depth > maxDepth)) "); } else if (HasNotStructuredOperations(operations)) { bldr = AppendString(bldr, $" (!structured) "); } else { bldr = AppendString(bldr, $" (true) "); // do these always } } return((bldr.Length > 0) ? bldr.ToString() : null); }
/// <summary> /// Function to find if the operations collection has an operation that is not resolved for structured directive /// </summary> /// <param name="operations"></param> /// <returns></returns> private static bool HasNotStructuredOperations(CdmOperationCollection operations) { List <CdmOperationBase> list = operations .Where <CdmOperationBase>(op => ( op.ObjectType == CdmObjectType.OperationAddCountAttributeDef || op.ObjectType == CdmObjectType.OperationAddTypeAttributeDef || op.ObjectType == CdmObjectType.OperationRenameAttributesDef || op.ObjectType == CdmObjectType.OperationArrayExpansionDef )).ToList(); return(list.Count > 0); }
public async Task TestProjectionUsingObjectModel() { CdmCorpusDefinition corpus = TestHelper.GetLocalCorpus(testsSubpath, "TestProjectionUsingObjectModel"); corpus.Storage.Mount("local", new LocalAdapter(TestHelper.GetActualOutputFolderPath(testsSubpath, "TestProjectionUsingObjectModel"))); CdmFolderDefinition localRoot = corpus.Storage.FetchRootFolder("local"); CdmManifestDefinition manifestDefault = CreateDefaultManifest(corpus, localRoot); CdmEntityDefinition entityTestSource = CreateEntityTestSource(corpus, manifestDefault, localRoot); CdmEntityDefinition entityTestEntityProjection = CreateEntityTestEntityProjection(corpus, manifestDefault, localRoot); CdmEntityDefinition entityTestEntityNestedProjection = CreateEntityTestEntityNestedProjection(corpus, manifestDefault, localRoot); CdmEntityDefinition entityTestEntityAttributeProjection = CreateEntityTestEntityAttributeProjection(corpus, manifestDefault, localRoot); CdmEntityDefinition entityTestOperationCollection = CreateEntityTestOperationCollection(corpus, manifestDefault, localRoot); // Save manifest and entities await manifestDefault.SaveAsAsync($"{manifestDefault.ManifestName}.manifest.cdm.json", saveReferenced : true); string expected = "TestSource"; CdmObjectType expectedType = CdmObjectType.ProjectionDef; string actual = null; CdmObjectType actualType = CdmObjectType.Error; // Try to read back the newly persisted manifest and projection based entities CdmManifestDefinition manifestReadBack = await corpus.FetchObjectAsync <CdmManifestDefinition>($"local:/{manifestDefault.ManifestName}.manifest.cdm.json"); Assert.AreEqual(5, manifestReadBack.Entities.Count); Assert.AreEqual(entityTestSource.EntityName, manifestReadBack.Entities[0].EntityName); Assert.AreEqual(entityTestEntityProjection.EntityName, manifestReadBack.Entities[1].EntityName); Assert.AreEqual(entityTestEntityNestedProjection.EntityName, manifestReadBack.Entities[2].EntityName); Assert.AreEqual(entityTestEntityAttributeProjection.EntityName, manifestReadBack.Entities[3].EntityName); // Read back the newly persisted manifest and projection based entity TestEntityProjection and validate CdmEntityDefinition entityTestEntityProjectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestEntityProjection.EntityName}.cdm.json/{entityTestEntityProjection.EntityName}", manifestReadBack); Assert.IsNotNull(entityTestEntityProjectionReadBack); actual = ((CdmEntityReference)((CdmProjection)entityTestEntityProjectionReadBack.ExtendsEntity.ExplicitReference).Source).NamedReference; actualType = ((CdmProjection)entityTestEntityProjectionReadBack.ExtendsEntity.ExplicitReference).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(expectedType, actualType); // Read back the newly persisted manifest and projection based entity TestEntityNestedProjection and validate CdmEntityDefinition entityTestEntityNestedProjectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestEntityNestedProjection.EntityName}.cdm.json/{entityTestEntityNestedProjection.EntityName}", manifestReadBack); Assert.IsNotNull(entityTestEntityNestedProjectionReadBack); actual = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entityTestEntityNestedProjectionReadBack.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).Source.NamedReference; actualType = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entityTestEntityNestedProjectionReadBack.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(expectedType, actualType); // Read back the newly persisted manifest and projection based entity TestEntityAttributeProjection and validate CdmEntityDefinition entityTestEntityAttributeProjectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestEntityAttributeProjection.EntityName}.cdm.json/{entityTestEntityAttributeProjection.EntityName}", manifestReadBack); Assert.IsNotNull(entityTestEntityAttributeProjectionReadBack); actual = ((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entityTestEntityAttributeProjectionReadBack.Attributes[0]).Entity).ExplicitReference).Source).NamedReference; actualType = ((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entityTestEntityAttributeProjectionReadBack.Attributes[0]).Entity).ExplicitReference).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(expectedType, actualType); // Read back operations collections and validate CdmEntityDefinition entityTestOperationCollectionReadBack = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/{entityTestOperationCollection.EntityName}.cdm.json/{entityTestOperationCollection.EntityName}", manifestReadBack); Assert.IsNotNull(entityTestOperationCollectionReadBack); int actualOperationCount = ((CdmProjection)entityTestOperationCollectionReadBack.ExtendsEntity.ExplicitReference).Operations.Count; Assert.AreEqual(9, actualOperationCount); CdmOperationCollection operations = ((CdmProjection)entityTestOperationCollectionReadBack.ExtendsEntity.ExplicitReference).Operations; Assert.AreEqual(CdmOperationType.AddCountAttribute, operations[0].Type); Assert.AreEqual(CdmOperationType.AddSupportingAttribute, operations[1].Type); Assert.AreEqual(CdmOperationType.AddTypeAttribute, operations[2].Type); Assert.AreEqual(CdmOperationType.ExcludeAttributes, operations[3].Type); Assert.AreEqual(CdmOperationType.ArrayExpansion, operations[4].Type); Assert.AreEqual(CdmOperationType.CombineAttributes, operations[5].Type); Assert.AreEqual(CdmOperationType.RenameAttributes, operations[6].Type); Assert.AreEqual(CdmOperationType.ReplaceAsForeignKey, operations[7].Type); Assert.AreEqual(CdmOperationType.IncludeAttributes, operations[8].Type); }
public async Task TestLoadProjection() { CdmCorpusDefinition corpus = TestHelper.GetLocalCorpus(testsSubpath, "TestLoadProjection"); CdmManifestDefinition manifest = await corpus.FetchObjectAsync <CdmManifestDefinition>($"local:/default.manifest.cdm.json"); string expected = "TestSource"; string actual = null; CdmObjectType actualType = CdmObjectType.Error; #region TestEntityStringReference.cdm.json CdmEntityDefinition entTestEntityStringReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityStringReference.cdm.json/TestEntityStringReference", manifest); Assert.IsNotNull(entTestEntityStringReference); actual = ((CdmEntityReference)entTestEntityStringReference.ExtendsEntity).NamedReference; actualType = ((CdmEntityReference)entTestEntityStringReference.ExtendsEntity).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.EntityRef, actualType); #endregion // TestEntityStringReference.cdm.json #region TestEntityEntityReference.cdm.json CdmEntityDefinition entTestEntityEntityReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityEntityReference.cdm.json/TestEntityEntityReference", manifest); Assert.IsNotNull(entTestEntityEntityReference); actual = ((CdmEntityReference)entTestEntityEntityReference.ExtendsEntity).NamedReference; actualType = ((CdmEntityReference)entTestEntityEntityReference.ExtendsEntity).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.EntityRef, actualType); #endregion // TestEntityEntityReference.cdm.json #region TestEntityProjection.cdm.json CdmEntityDefinition entTestEntityProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityProjection.cdm.json/TestEntityProjection", manifest); Assert.IsNotNull(entTestEntityProjection); actual = ((CdmEntityReference)((CdmProjection)entTestEntityProjection.ExtendsEntity.ExplicitReference).Source).NamedReference; actualType = ((CdmProjection)entTestEntityProjection.ExtendsEntity.ExplicitReference).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.ProjectionDef, actualType); #endregion // TestEntityProjection.cdm.json #region TestEntityNestedProjection.cdm.json CdmEntityDefinition entTestEntityNestedProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityNestedProjection.cdm.json/TestEntityNestedProjection", manifest); Assert.IsNotNull(entTestEntityNestedProjection); actual = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entTestEntityNestedProjection.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).Source.NamedReference; actualType = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)entTestEntityNestedProjection.ExtendsEntity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.ProjectionDef, actualType); #endregion // TestEntityNestedProjection.cdm.json #region TestEntityAttributeStringReference.cdm.json CdmEntityDefinition entTestEntityAttributeStringReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeStringReference.cdm.json/TestEntityAttributeStringReference", manifest); Assert.IsNotNull(entTestEntityAttributeStringReference); actual = ((CdmEntityAttributeDefinition)entTestEntityAttributeStringReference.Attributes[0]).Entity.NamedReference; actualType = ((CdmEntityAttributeDefinition)entTestEntityAttributeStringReference.Attributes[0]).Entity.ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.EntityRef, actualType); #endregion // TestEntityAttributeStringReference.cdm.json #region TestEntityAttributeEntityReference.cdm.json CdmEntityDefinition entTestEntityAttributeEntityReference = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeEntityReference.cdm.json/TestEntityAttributeEntityReference", manifest); Assert.IsNotNull(entTestEntityAttributeEntityReference); actual = ((CdmEntityAttributeDefinition)entTestEntityAttributeEntityReference.Attributes[0]).Entity.NamedReference; actualType = ((CdmEntityAttributeDefinition)entTestEntityAttributeEntityReference.Attributes[0]).Entity.ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.EntityRef, actualType); #endregion // TestEntityAttributeEntityReference.cdm.json #region TestEntityAttributeProjection.cdm.json CdmEntityDefinition entTestEntityAttributeProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeProjection.cdm.json/TestEntityAttributeProjection", manifest); Assert.IsNotNull(entTestEntityAttributeProjection); actual = ((CdmProjection)((CdmEntityAttributeDefinition)entTestEntityAttributeProjection.Attributes[0]).Entity.ExplicitReference).Source.NamedReference; actualType = ((CdmEntityAttributeDefinition)entTestEntityAttributeProjection.Attributes[0]).Entity.ExplicitReference.ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.ProjectionDef, actualType); #endregion // TestEntityAttributeProjection.cdm.json #region TestEntityAttributeNestedProjection.cdm.json CdmEntityDefinition entTestEntityAttributeNestedProjection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityAttributeNestedProjection.cdm.json/TestEntityAttributeNestedProjection", manifest); Assert.IsNotNull(entTestEntityAttributeNestedProjection); actual = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entTestEntityAttributeNestedProjection.Attributes[0]).Entity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).Source.NamedReference; actualType = ((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmProjection)((CdmEntityReference)((CdmEntityAttributeDefinition)entTestEntityAttributeNestedProjection.Attributes[0]).Entity).ExplicitReference).Source).ExplicitReference).Source).ExplicitReference).ObjectType; Assert.AreEqual(expected, actual); Assert.AreEqual(CdmObjectType.ProjectionDef, actualType); #endregion // TestEntityAttributeNestedProjection.cdm.json #region TestOperationCollection.cdm.json CdmEntityDefinition entTestOperationCollection = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestOperationCollection.cdm.json/TestOperationCollection", manifest); Assert.IsNotNull(entTestOperationCollection); int actualOperationCount = ((CdmProjection)entTestOperationCollection.ExtendsEntity.ExplicitReference).Operations.Count; Assert.AreEqual(9, actualOperationCount); CdmOperationCollection operations = ((CdmProjection)entTestOperationCollection.ExtendsEntity.ExplicitReference).Operations; Assert.AreEqual(CdmOperationType.AddCountAttribute, operations[0].Type); Assert.AreEqual(CdmOperationType.AddSupportingAttribute, operations[1].Type); Assert.AreEqual(CdmOperationType.AddTypeAttribute, operations[2].Type); Assert.AreEqual(CdmOperationType.ExcludeAttributes, operations[3].Type); Assert.AreEqual(CdmOperationType.ArrayExpansion, operations[4].Type); Assert.AreEqual(CdmOperationType.CombineAttributes, operations[5].Type); Assert.AreEqual(CdmOperationType.RenameAttributes, operations[6].Type); Assert.AreEqual(CdmOperationType.ReplaceAsForeignKey, operations[7].Type); Assert.AreEqual(CdmOperationType.IncludeAttributes, operations[8].Type); #endregion // TestOperationCollection.cdm.json #region TestEntityTrait.cdm.json CdmEntityDefinition entTestEntityTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityTrait.cdm.json/TestEntityTrait", manifest); Assert.IsNotNull(entTestEntityTrait); Assert.AreEqual("TestAttribute", ((CdmTypeAttributeDefinition)entTestEntityTrait.Attributes[0]).Name); Assert.AreEqual("testDataType", ((CdmTypeAttributeDefinition)entTestEntityTrait.Attributes[0]).DataType.NamedReference); #endregion // TestEntityTrait.cdm.json #region TestEntityExtendsTrait.cdm.json CdmEntityDefinition entTestEntityExtendsTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestEntityExtendsTrait.cdm.json/TestEntityExtendsTrait", manifest); Assert.IsNotNull(entTestEntityExtendsTrait); Assert.AreEqual("TestExtendsTraitAttribute", ((CdmTypeAttributeDefinition)entTestEntityExtendsTrait.Attributes[0]).Name); Assert.AreEqual("testDerivedDataType", ((CdmTypeAttributeDefinition)entTestEntityExtendsTrait.Attributes[0]).DataType.NamedReference); #endregion // TestEntityExtendsTrait.cdm.json #region TestProjectionTrait.cdm.json CdmEntityDefinition entTestProjectionTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestProjectionTrait.cdm.json/TestProjectionTrait", manifest); Assert.IsNotNull(entTestProjectionTrait); Assert.AreEqual("TestProjectionAttribute", ((CdmTypeAttributeDefinition)entTestProjectionTrait.Attributes[0]).Name); Assert.AreEqual("testDataType", ((CdmTypeAttributeDefinition)entTestProjectionTrait.Attributes[0]).DataType.NamedReference); #endregion // TestProjectionTrait.cdm.json #region TestProjectionExtendsTrait.cdm.json CdmEntityDefinition entTestProjectionExtendsTrait = await corpus.FetchObjectAsync <CdmEntityDefinition>($"local:/TestProjectionExtendsTrait.cdm.json/TestProjectionExtendsTrait", manifest); Assert.IsNotNull(entTestProjectionExtendsTrait); Assert.AreEqual("TestProjectionAttributeB", ((CdmTypeAttributeDefinition)entTestProjectionExtendsTrait.Attributes[0]).Name); Assert.AreEqual("testExtendsDataTypeB", ((CdmTypeAttributeDefinition)entTestProjectionExtendsTrait.Attributes[0]).DataType.NamedReference); #endregion // TestProjectionExtendsTrait.cdm.json }
public void TestGetDefaultConditionExpression() { CdmCorpusDefinition corpus = TestHelper.GetLocalCorpus(testsSubpath, "TestGetDefaultConditionExpression"); corpus.Storage.Mount("local", new LocalAdapter(TestHelper.GetActualOutputFolderPath(testsSubpath, "TestGetDefaultConditionExpression"))); CdmFolderDefinition localRoot = corpus.Storage.FetchRootFolder("local"); CdmManifestDefinition manifestDefault = CreateDefaultManifest(corpus, localRoot); CdmEntityDefinition entityTestSource = CreateEntityTestSource(corpus, manifestDefault, localRoot); // projection for a non entity attribute CdmOperationCollection opColl = new CdmOperationCollection(corpus.Ctx, entityTestSource); { // add 1st FK opColl.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx)); Assert.AreEqual($" (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource)); // add 2nd FK opColl.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx)); Assert.AreEqual($" (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource)); opColl.Clear(); // add AddCount opColl.Add(new CdmOperationAddCountAttribute(corpus.Ctx)); Assert.AreEqual($" (!structured) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource)); // add ArrayExpansion opColl.Add(new CdmOperationArrayExpansion(corpus.Ctx)); Assert.AreEqual($" (!structured) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource)); opColl.Clear(); // add AddSupporting opColl.Add(new CdmOperationAddSupportingAttribute(corpus.Ctx)); Assert.AreEqual($" (true) ", ConditionExpression.GetDefaultConditionExpression(opColl, owner: entityTestSource)); } CdmEntityAttributeDefinition entityTestEntityAttribute = corpus.MakeObject <CdmEntityAttributeDefinition>(CdmObjectType.EntityAttributeDef, nameOrRef: "TestEntityAttribute", simpleNameRef: false); // projection for a non entity attribute CdmOperationCollection opCollEA = new CdmOperationCollection(corpus.Ctx, entityTestEntityAttribute); { // add 1st FK opCollEA.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx)); Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) ) && (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute)); // add 2nd FK opCollEA.Add(new CdmOperationReplaceAsForeignKey(corpus.Ctx)); Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) ) && (referenceOnly || noMaxDepth || (depth > maxDepth)) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute)); opCollEA.Clear(); // add AddCount opCollEA.Add(new CdmOperationAddCountAttribute(corpus.Ctx)); Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) ) && (!structured) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute)); // add ArrayExpansion opCollEA.Add(new CdmOperationArrayExpansion(corpus.Ctx)); Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) ) && (!structured) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute)); opCollEA.Clear(); // add AddSupporting opCollEA.Add(new CdmOperationAddSupportingAttribute(corpus.Ctx)); Assert.AreEqual($" ( (!normalized) || (cardinality.maximum <= 1) ) && (true) ", ConditionExpression.GetDefaultConditionExpression(opCollEA, owner: entityTestEntityAttribute)); } }