public void CartesianProduct() { //RequiredDataContainer ModelData = VirtualMapDataProvider.VirtualMapModel(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/virtual-map.mapping")); QueryableEntity Person = new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Person")); QueryableEntity Pet = new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Pet")); CartesianProductOperator Op = new CartesianProductOperator(Person, Pet, ModelData.ERMongoMapping); VirtualMap CartersianVMap = Op.ComputeVirtualMap(); Assert.IsNotNull(CartersianVMap, "Cartesian Product virtual map cannot be null"); List <string> VirtualMapRules = CartersianVMap.GetRulesAsStringList(); List <string> RulesToMatch = new List <string>() { "_id", "name", "age", "data_Pet._id", "data_Pet.name", "data_Pet.type", //"data_Pet.ownerId", }; Assert.IsTrue(!VirtualMapRules.Except(RulesToMatch).Any() && !RulesToMatch.Except(VirtualMapRules).Any(), "Virtual maps do not match"); }
public void RelationshipJoin() { //RequiredDataContainer ModelData = VirtualMapDataProvider.VirtualMapModel(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/virtual-map.mapping")); QueryableEntity Person = new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Person")); QueryableEntity Pet = new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Pet")); RelationshipJoinOperator RJoinOp = new RelationshipJoinOperator(Person, (Relationship)ModelData.EntityRelationshipModel.FindByName("HasPet"), new List <QueryableEntity>() { Pet }, ModelData.ERMongoMapping); VirtualMap RJoinVMap = RJoinOp.ComputeVirtualMap(); List <string> VirtualMapRules = RJoinVMap.GetRulesAsStringList(); Assert.IsNotNull(RJoinVMap, "Virtual map cannot be null"); List <string> RulesToMatch = new List <string>() { "_id", "name", "age", "data_HasPet.Pet_petId", "data_HasPet.Pet_name", "data_HasPet.Pet_type", //"data_HasPet.Pet_ownerId" }; Assert.IsTrue(!VirtualMapRules.Except(RulesToMatch).Any() && !RulesToMatch.Except(VirtualMapRules).Any()); }
public void ManyToManyComputedEntityOneToOne() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/many-to-many-computed-entity-2.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/ceManyToMany-2.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Owns> (Car rjoin <ManufacturedBy> (Manufacturer)) select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); // FIXED? string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceManyToMany2"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void OneToManyRelationshipAttributesEmbeddedAtSource() { // Load mapping var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-many-relationship-attributes-embedded-at-source.mapping")); string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/oneToManyEmbeddedRelationshipAttributesAtSource.js"); Assert.IsNotNull(HandcraftedQuery); string QueryString = "from Person rjoin <Drives> (Car) select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); Assert.IsNotNull(GeneratedQuery); QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "paper_test_1"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
static void Main(string[] args) { var mapping = QueryBuilderParser.ParseMapping(new FileStream("artigo.mapping", FileMode.Open)); while (true) { try { Console.Write("Query: "); string query = Console.ReadLine(); if (query == "q") { break; } var queryGen = QueryBuilderParser.ParseQuery(query, mapping); Console.WriteLine(queryGen.Run()); foreach (AlgebraOperator Op in queryGen.PipelineOperators) { Op.SummarizeToString(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } Console.Read(); }
public void OneToManyEmbeddedWithRelatedMainMappingUseLookup() { // Load mapping var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-many-embedded-duplicated-main.mapping")); string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/oneToManyEmbeddedDuplicatedMain.js"); Assert.IsNotNull(HandcraftedQuery); string QueryString = "from Person rjoin <Drives> (Car) select Person.name, Car.plate"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); Assert.IsNotNull(GeneratedQuery); QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "oneToManyEmbeddedDuplicatedMain"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void ManyToManyTargetEmbedded() { var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/many-to-many-embedded-target.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/manyToManyEmbedded.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); string QueryString = "from Person rjoin <Drives> (Car) select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "manyToManyEmbedded"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void ManyToManyRelationshipAttributeSingleEntity() { // Asserts if the query result for a simple binary join is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/many-to-many-relationship-attribute-single-entity.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/manyToManyRelationshipAttributes.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Insurance> (Car) select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "researchManyToManyRelationshipAttributes"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void CartesianProduct() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/cartesian.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/cartersianProduct-1.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); string QueryString = "from Person cartesianproduct Car cartesianproduct Supplier select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceManyToMany2"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void OneToOneEmbeddedNoMasterAttribute() { // Asserts if the query result for a simple binary join is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-one-embedded-no-master-attribute.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/personCarOneToOne_3.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Drives> (Car) select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "researchDatabase"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void GetProductTitleAndUserName() { var DataMap = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections.mapping")); var DataMapDuplicates = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-duplicates.mapping")); var DataMapCategoryDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-category-duplicated.mapping")); var DataMapStoreDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-store-duplicated.mapping")); var DataMapUserDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-user-duplicated.mapping")); string QueryString = "from Product rjoin <UserProducts> (User) select Product.Title, User.UserName"; QueryGenerator GeneratorMap1 = QueryBuilderParser.ParseQuery(QueryString, DataMap); QueryGenerator GeneratorMap2 = QueryBuilderParser.ParseQuery(QueryString, DataMapDuplicates); QueryGenerator GeneratorMap3 = QueryBuilderParser.ParseQuery(QueryString, DataMapCategoryDuplicated); QueryGenerator GeneratorMap4 = QueryBuilderParser.ParseQuery(QueryString, DataMapStoreDuplicated); QueryGenerator GeneratorMap5 = QueryBuilderParser.ParseQuery(QueryString, DataMapUserDuplicated); string QueryMap1 = GeneratorMap1.Run(); string QueryMap2 = GeneratorMap2.Run(); string QueryMap3 = GeneratorMap3.Run(); string QueryMap4 = GeneratorMap4.Run(); string QueryMap5 = GeneratorMap5.Run(); Assert.IsNotNull(QueryMap1, "Query [Map1] cannot be null"); Assert.IsNotNull(QueryMap2, "Query [Map2] cannot be null"); Assert.IsNotNull(QueryMap3, "Query [Map3] cannot be null"); Assert.IsNotNull(QueryMap4, "Query [Map4] cannot be null"); Assert.IsNotNull(QueryMap5, "Query [Map5] cannot be null"); QueryRunner RunnerMap1 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms"); QueryRunner RunnerMap2 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_duplicados"); QueryRunner RunnerMap3 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_category_duplicado"); QueryRunner RunnerMap4 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_store_duplicado"); QueryRunner RunnerMap5 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_user_duplicado"); string ResultMap1 = RunnerMap1.GetJSON(QueryMap1); string ResultMap2 = RunnerMap2.GetJSON(QueryMap2); string ResultMap3 = RunnerMap3.GetJSON(QueryMap3); string ResultMap4 = RunnerMap4.GetJSON(QueryMap4); string ResultMap5 = RunnerMap5.GetJSON(QueryMap5); Assert.IsNotNull(ResultMap1, "Result [Map1] cannot be null"); Assert.IsNotNull(ResultMap2, "Result [Map2] cannot be null"); Assert.IsNotNull(ResultMap3, "Result [Map3] cannot be null"); Assert.IsNotNull(ResultMap4, "Result [Map4] cannot be null"); Assert.IsNotNull(ResultMap5, "Result [Map5] cannot be null"); Assert.IsTrue(ResultMap1 != string.Empty, "Result [Map1] cannot be empty"); Assert.IsTrue(ResultMap2 != string.Empty, "Result [Map2] cannot be empty"); Assert.IsTrue(ResultMap3 != string.Empty, "Result [Map3] cannot be empty"); Assert.IsTrue(ResultMap4 != string.Empty, "Result [Map4] cannot be empty"); Assert.IsTrue(ResultMap5 != string.Empty, "Result [Map5] cannot be empty"); JToken TokenResult1 = JToken.Parse(ResultMap1); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap2)); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap3)); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap4)); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap5)); }
/// <summary> /// Read mapping file /// </summary> /// <param name="inFile"></param> /// <returns></returns> public static QueryBuilderMappingMetadata GetMapping(string inFile) { if (!File.Exists(inFile)) { throw new FileNotFoundException($"File {inFile} does not exist."); } return(QueryBuilderParser.ParseMapping(new FileStream(inFile, FileMode.Open))); }
public void ProjectSimpleAttributes() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query //RequiredDataContainer ModelData = ProjectDataProvider.SimpleModel(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/project-simple.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/projectQuerySimple.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator //QueryableEntity Person = new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Person" ) ); //List<ProjectArgument> Arguments = new List<ProjectArgument>(); //Arguments.Add( new ProjectArgument( Person.GetAttribute( "personId" ), Person, new BooleanExpr( false ) ) ); //Arguments.Add( new ProjectArgument( Person.GetAttribute( "name" ), Person, new BooleanExpr( true ) ) ); //Arguments.Add( new ProjectArgument( Person.GetAttribute( "age" ), Person, new BooleanExpr( true ) ) ); //ProjectStage ProjectOp = new ProjectStage( Arguments, ModelData.ERMongoMapping ); //List<AlgebraOperator> OpList = new List<AlgebraOperator> { ProjectOp }; //FromArgument StartArg = new FromArgument( new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Person" ) ), // ModelData.ERMongoMapping ); //QueryGenerator QueryGen = new QueryGenerator( StartArg, OpList ); string QueryString = "from Person select Person.name, Person.age"; // FIXED? // Consulta: from Person select Person.name, Person.age // Problema: Parser não gerou operação de projeção. QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceManyToMany2"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void TestPaper() { string mapping = "Mappings/person-drives-car.mapping"; string query = "from Person rjoin <Drives> (Car) select Person.name, Car.plate"; var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile(mapping)); QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(query, ModelData); Console.WriteLine(""); Console.WriteLine(query); Console.WriteLine(QueryGen.SummarizeToString()); Console.WriteLine(""); Console.WriteLine(QueryGen.Run()); }
public void GetAllProducts() { var DataMap = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections.mapping")); var DataMap2 = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-duplicates.mapping")); var DataMap3 = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-category-duplicated.mapping")); var DataMap4 = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-store-duplicated.mapping")); var DataMap5 = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-user-duplicated.mapping")); string QueryString = "from Product rjoin <UserProducts> (User) rjoin <StoreProducts> (Store) rjoin <CategoryProducts> (Category) select *"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, DataMap); QueryGenerator QueryGen2 = QueryBuilderParser.ParseQuery(QueryString, DataMap2); QueryGenerator QueryGen3 = QueryBuilderParser.ParseQuery(QueryString, DataMap3); QueryGenerator QueryGen4 = QueryBuilderParser.ParseQuery(QueryString, DataMap4); QueryGenerator QueryGen5 = QueryBuilderParser.ParseQuery(QueryString, DataMap5); string Query = QueryGen.Run(); string Query2 = QueryGen2.Run(); string Query3 = QueryGen3.Run(); string Query4 = QueryGen4.Run(); string Query5 = QueryGen5.Run(); QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms"); string Result = Runner.GetJSON(Query); QueryRunner Runner2 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_duplicados"); string Result2 = Runner2.GetJSON(Query2); QueryRunner Runner3 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_category_duplicado"); string Result3 = Runner3.GetJSON(Query3); QueryRunner Runner4 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_store_duplicado"); string Result4 = Runner4.GetJSON(Query4); QueryRunner Runner5 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_user_duplicado"); string Result5 = Runner5.GetJSON(Query5); Assert.IsNotNull(Result); Assert.IsNotNull(Result2); Assert.IsNotNull(Result3); Assert.IsNotNull(Result4); Assert.IsNotNull(Result5); JToken ResultJson = JToken.Parse(Result); Assert.IsTrue(JToken.DeepEquals(ResultJson, JToken.Parse(Result2))); Assert.IsTrue(JToken.DeepEquals(ResultJson, JToken.Parse(Result3))); Assert.IsTrue(JToken.DeepEquals(ResultJson, JToken.Parse(Result4))); Assert.IsTrue(JToken.DeepEquals(ResultJson, JToken.Parse(Result5))); }
public void OneToOneEmbeddedMixed() { //TODO: Check why it isn't working and why it didn't have a TestMethod attribute before // Asserts if the query result for a simple binary join is equal // to a handcrafted query //RequiredDataContainer ModelData = OneToOneRelationshipsDataProvider.OneToOneEmbeddedMixed(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-one-embedded-mixed.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/personCarOneToOne_4.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator RelationshipJoinOperator RJoinOp = new RelationshipJoinOperator( new QueryableEntity(( Entity)ModelData.EntityRelationshipModel.FindByName("Person"), "person"), (Relationship)ModelData.EntityRelationshipModel.FindByName("Drives"), new List <QueryableEntity> { new QueryableEntity((Entity)ModelData.EntityRelationshipModel.FindByName("Car"), "car") }, ModelData.ERMongoMapping); List <AlgebraOperator> OpList = new List <AlgebraOperator> { RJoinOp }; FromArgument StartArg = new FromArgument(new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Person")), ModelData.ERMongoMapping); QueryGenerator QueryGen = new QueryGenerator(StartArg, OpList); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "researchDatabase"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void GetAllProductsFromStore() { var DataMap = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections.mapping")); var DataMapDuplicates = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-duplicates.mapping")); var DataMapCategoryDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-category-duplicated.mapping")); var DataMapStoreDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-store-duplicated.mapping")); var DataMapUserDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-user-duplicated.mapping")); string QueryString = "from Store rjoin <StoreProducts> (Product) select *"; QueryGenerator GeneratorMap1 = QueryBuilderParser.ParseQuery(QueryString, DataMap); QueryGenerator GeneratorMap2 = QueryBuilderParser.ParseQuery(QueryString, DataMapDuplicates); QueryGenerator GeneratorMap3 = QueryBuilderParser.ParseQuery(QueryString, DataMapCategoryDuplicated); QueryGenerator GeneratorMap4 = QueryBuilderParser.ParseQuery(QueryString, DataMapStoreDuplicated); QueryGenerator GeneratorMap5 = QueryBuilderParser.ParseQuery(QueryString, DataMapUserDuplicated); string QueryMap1 = GeneratorMap1.Run(); Assert.ThrowsException <ImpossibleOperationException>(GeneratorMap2.Run); string QueryMap3 = GeneratorMap3.Run(); Assert.ThrowsException <ImpossibleOperationException>(GeneratorMap4.Run); string QueryMap5 = GeneratorMap5.Run(); Assert.IsNotNull(QueryMap1, "Query [Map1] cannot be null"); Assert.IsNotNull(QueryMap3, "Query [Map3] cannot be null"); Assert.IsNotNull(QueryMap5, "Query [Map5] cannot be null"); QueryRunner RunnerMap1 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms"); QueryRunner RunnerMap3 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_category_duplicado"); QueryRunner RunnerMap5 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_user_duplicado"); string ResultMap1 = RunnerMap1.GetJSON(QueryMap1); string ResultMap3 = RunnerMap3.GetJSON(QueryMap3); string ResultMap5 = RunnerMap5.GetJSON(QueryMap5); Assert.IsNotNull(ResultMap1, "Result [Map1] cannot be null"); Assert.IsNotNull(ResultMap3, "Result [Map3] cannot be null"); Assert.IsNotNull(ResultMap5, "Result [Map5] cannot be null"); Assert.IsTrue(ResultMap1 != string.Empty, "Result [Map1] cannot be empty"); Assert.IsTrue(ResultMap3 != string.Empty, "Result [Map3] cannot be empty"); Assert.IsTrue(ResultMap5 != string.Empty, "Result [Map5] cannot be empty"); JToken TokenResult1 = JToken.Parse(ResultMap1); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap3)); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap5)); }
public void ProjectStageShowFields() { //RequiredDataContainer ModelData = VirtualMapDataProvider.VirtualMapModel(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/virtual-map.mapping")); QueryableEntity Person = new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Person")); QueryableEntity Pet = new QueryableEntity(ModelData.EntityRelationshipModel.FindByName("Pet")); RelationshipJoinOperator RJoinOp = new RelationshipJoinOperator( Person, (Relationship)ModelData.EntityRelationshipModel.FindByName("HasPet"), new List <QueryableEntity>() { Pet }, ModelData.ERMongoMapping); VirtualMap RJoinVMap = RJoinOp.ComputeVirtualMap(); Assert.IsNotNull(RJoinVMap, "RJOIN Virtual map cannot be null"); List <ProjectArgument> ProjectArguments = new List <ProjectArgument>(); ProjectArguments.Add(new ProjectArgument(Person.GetAttribute("name"), Person, new BooleanExpr(true))); ProjectArguments.Add(new ProjectArgument(Person.GetAttribute("age"), Person, new BooleanExpr(true))); ProjectArguments.Add(new ProjectArgument(Pet.GetAttribute("name"), Pet, new BooleanExpr(true))); ProjectStage ProjectOp = new ProjectStage(ProjectArguments, RJoinVMap); VirtualMap ProjectVirtualMap = ProjectOp.ComputeVirtualMap(RJoinVMap); Assert.IsNotNull(ProjectVirtualMap, "Project virtual map cannot be null"); List <string> VirtualMapRules = ProjectVirtualMap.GetRulesAsStringList(); List <string> RulesToMatch = new List <string>() { "name", "age", "data_HasPet.Pet_name", }; Assert.IsTrue(!VirtualMapRules.Except(RulesToMatch).Any() && !RulesToMatch.Except(VirtualMapRules).Any(), "Virtual maps do not match"); }
public void Equal() { //RequiredDataContainer ModelData = SelectDataProvider.GetData(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/select.mapping")); string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/selectEqual.js"); Assert.IsNotNull(HandcraftedQuery); //MapRule PersonRule = ModelData.ERMongoMapping.Rules.First( R => R.Source.Name == "Person" ); //string AgeMap = PersonRule.Rules.First( R => R.Key == "age" ).Value; //LogicalExpression left = new LogicalExpression( $"${AgeMap}", LogicalOperator.EQUAL, 27 ); //SelectArgument Arg = new SelectArgument( left ); //SelectStage SelectOp = new SelectStage( Arg, ModelData.ERMongoMapping ); //List<AlgebraOperator> OperatorsToExecute = new List<AlgebraOperator>() { SelectOp }; //FromArgument StartArg = new FromArgument( new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Person" ) ), // ModelData.ERMongoMapping ); //QueryGenerator QueryGen = new QueryGenerator( StartArg, OperatorsToExecute ); string QueryString = "from Person select * where Person.age = 27"; // FIXME // Consulta: from Person where Person.age = 27 select * // Problema: Parser não gerou operação de seleção. QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); Assert.IsNotNull(GeneratedQuery); QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "select"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void GetCategoryThatIsNamedHome() { var DataMap = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections.mapping")); var DataMapDuplicates = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-duplicates.mapping")); var DataMapCategoryDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-category-duplicated.mapping")); var DataMapStoreDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-store-duplicated.mapping")); var DataMapUserDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-user-duplicated.mapping")); string QueryString = "from Category where CategoryName = 'Home' select *"; QueryGenerator GeneratorMap1 = QueryBuilderParser.ParseQuery(QueryString, DataMap); QueryGenerator GeneratorMap4 = QueryBuilderParser.ParseQuery(QueryString, DataMapStoreDuplicated); QueryGenerator GeneratorMap5 = QueryBuilderParser.ParseQuery(QueryString, DataMapUserDuplicated); string QueryMap1 = GeneratorMap1.Run(); string QueryMap4 = GeneratorMap4.Run(); string QueryMap5 = GeneratorMap5.Run(); Assert.IsNotNull(QueryMap1, "Query [Map1] cannot be null"); Assert.IsNotNull(QueryMap4, "Query [Map4] cannot be null"); Assert.IsNotNull(QueryMap5, "Query [Map5] cannot be null"); QueryRunner RunnerMap1 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms"); QueryRunner RunnerMap4 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_store_duplicado"); QueryRunner RunnerMap5 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_user_duplicado"); string ResultMap1 = RunnerMap1.GetJSON(QueryMap1); string ResultMap4 = RunnerMap4.GetJSON(QueryMap4); string ResultMap5 = RunnerMap5.GetJSON(QueryMap5); Assert.IsNotNull(ResultMap1, "Result [Map1] cannot be null"); Assert.IsNotNull(ResultMap4, "Result [Map4] cannot be null"); Assert.IsNotNull(ResultMap5, "Result [Map5] cannot be null"); Assert.IsTrue(ResultMap1 != string.Empty, "Result [Map1] cannot be empty"); Assert.IsTrue(ResultMap4 != string.Empty, "Result [Map4] cannot be empty"); Assert.IsTrue(ResultMap5 != string.Empty, "Result [Map5] cannot be empty"); JToken TokenResult1 = JToken.Parse(ResultMap1); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap4)); TokenResult1.Should().BeEquivalentTo(JToken.Parse(ResultMap5)); }
public void GetAllUsers() { var DataMap = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections.mapping")); var DataMapDuplicates = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-duplicates.mapping")); var DataMapCategoryDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-category-duplicated.mapping")); var DataMapStoreDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-store-duplicated.mapping")); var DataMapUserDuplicated = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/MarketingCMS/entities-to-collections-user-duplicated.mapping")); string QueryString = "from User select *"; QueryGenerator QueryGenMap1 = QueryBuilderParser.ParseQuery(QueryString, DataMap); QueryGenerator QueryGenMap2 = QueryBuilderParser.ParseQuery(QueryString, DataMapDuplicates); QueryGenerator QueryGenMap3 = QueryBuilderParser.ParseQuery(QueryString, DataMapCategoryDuplicated); QueryGenerator QueryGenMap4 = QueryBuilderParser.ParseQuery(QueryString, DataMapStoreDuplicated); QueryGenerator QueryGenMap5 = QueryBuilderParser.ParseQuery(QueryString, DataMapUserDuplicated); string QueryStringMap1 = QueryGenMap1.Run(); Assert.ThrowsException <ImpossibleOperationException>(QueryGenMap2.Run); string QueryStringMap3 = QueryGenMap3.Run(); string QueryStringMap4 = QueryGenMap4.Run(); Assert.ThrowsException <ImpossibleOperationException>(QueryGenMap5.Run); QueryRunner RunnerMap1 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms"); QueryRunner RunnerMap3 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_category_duplicado"); QueryRunner RunnerMap4 = new QueryRunner("mongodb://localhost:27017", "pesquisa_cms_store_duplicado"); string ResultMap1 = RunnerMap1.GetJSON(QueryStringMap1); string ResultMap3 = RunnerMap3.GetJSON(QueryStringMap3); string ResultMap4 = RunnerMap4.GetJSON(QueryStringMap4); Assert.IsNotNull(ResultMap1, "Result [Map1] cannot be null"); Assert.IsNotNull(ResultMap3, "Result [Map3] cannot be null"); Assert.IsNotNull(ResultMap4, "Result [Map4] cannot be null"); Assert.IsTrue(ResultMap1 != string.Empty, "Result [Map1] cannot be empty"); Assert.IsTrue(ResultMap3 != string.Empty, "Result [Map3] cannot be empty"); Assert.IsTrue(ResultMap4 != string.Empty, "Result [Map4] cannot be empty"); Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap3))); Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap4))); }
public void OrMultiple() { //RequiredDataContainer ModelData = SelectDataProvider.GetData(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/select.mapping")); string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/selectOrMultiple.js"); Assert.IsNotNull(HandcraftedQuery); //MapRule PersonRule = ModelData.ERMongoMapping.Rules.First( R => R.Source.Name == "Person" ); //string AgeMap = PersonRule.Rules.First( R => R.Key == "age" ).Value; //OrExpr expr = new OrExpr( $"${AgeMap}", new List<object>() { 18, 21, 36 } ); //SelectArgument Arg = new SelectArgument( expr ); //SelectStage SelectOp = new SelectStage( Arg, ModelData.ERMongoMapping ); //List<AlgebraOperator> OperatorsToExecute = new List<AlgebraOperator>() { SelectOp }; //FromArgument StartArg = new FromArgument( new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Person" ) ), // ModelData.ERMongoMapping ); //QueryGenerator QueryGen = new QueryGenerator( StartArg, OperatorsToExecute ); string QueryString = "from Person select * where Person.age = 18 or Person.age = 21 or Person.age = 36"; QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); Assert.IsNotNull(GeneratedQuery); QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "select"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void OneToOneRelationshipAttributes() { // Asserts if the query result for a simple binary join is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-one-relationship-attributes.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/personCarOneToOneRelationshipAttributes.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <HasInsurance> (Car, Insurance) select *"; // FIXED? // Consulta: from Person rjoin <HasInsurance> (Car, Insurance) select * // Problema: Parser considera que Insurance é um alias de Car e não a inclui como parte da junção. // Solução: Incluir Insurance na lista de entidades 'alvo' do rjoin. QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "researchOneToOneRelationshipAttribute"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void OneToOneComputedEntityMultiple2() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-one-computed-entity-multiple-2.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/ceOneToOne-Multiple2.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Drives> (Car rjoin <Repaired> (Garage, Supplier)) rjoin <HasInsurance> (Insurance) select *"; // FIXED? // Consulta: from Person rjoin <Drives> (Car rjoin <Repaired> (Garage, Supplier)) rjoin <HasInsurance> (Insurance) select * // Problema: Neste existem dois problemas, o primeiro é o mesmo do exemplo anterior (Person rjoin <Drives> (Car rjoin <Repaired> (Garage, Supplier))) e o segundo problema é ao gerar a junção de Insurance com o resultado da junção anterior. // Solução: Na situação atual do algoritmo quando houver várias junções de mesmo nível, ou seja, quando o resultado de uma junção é o ponto de partida para a próxima junção, pode-se usar a entidade Person (a mesma do argumento From). Uma das limitações do algoritmo é a falta de suporte para herança de relacionamentos (da forma que foi proposto na álgebra) e por isso as junções subsequentes devem ser entre entidades relacionadas a entidade de entrada. QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceOneToOneMultiple2"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void OneToOneComputedEntity() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-one-computed-entity.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/ceOneToOne.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Drives> (Car rjoin <Repaired> (Garage)) select *"; // FIXED? // Consulta: from person rjoin <Drives> (Car rjoin <Repaired> (Garage)) select * // Problema: Parser gera duas operações rjoin (car rjoin garage) e (person rjoin (car rjoin garage)). // Solução: Nesse caso basta gerar apenas uma operação (person rjoin (car rjoin garage)). QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceOneToOne"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void OneToOneComputedEntityMultiple() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/one-to-one-computed-entity-multiple.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/ceOneToOne-Multiple.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Drives> (Car rjoin <Repaired> (Garage, Supplier)) select *"; // FIXED? // Consulta: from Person rjoin <Drives> (Car rjoin <Repaired> (Garage, Supplier)) select * // Problema: Parser gera duas operações (car rjoin garage) e (person rjoin (car rjoin garage)) a primeira operação não é necessária, e a segunda não incluiu a entidade Supplier na junção. // Solução: Junções aninhadas devem gerar apenas uma operação, nesse exemplo a junção entre Car, Garage e Supplier é representada por uma entidade computada. QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceOneToOneMultiple"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void ManyToManyComputedEntityMultipleEntities() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/many-to-many-computed-entity.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/ceManyToMany.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator string QueryString = "from Person rjoin <Owns> (Car rjoin <Repaired> (Garage, Supplier), Insurance) select *"; // FIXED? // Consulta: from Person rjoin <Owns> (Car rjoin <Repaired> (Garage, Supplier), Insurance) select * // Comentário: Nesse caso o parser gerou uma operação rjoin entre Car e Garage (mesmo problema dos exemplos anteriores) e também gerou uma junção entre Person, (Car e Garage) e Insurance, a última operação incluiu multiplas entidades apenas falhou ao não incluir Supplier na junção com Car e Garage. QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceManyToMany"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
public void ProjectComputedEntity() { // Asserts if the query result for a relationship join operation is equal // to a handcrafted query //RequiredDataContainer ModelData = ProjectDataProvider.ComputedEntityData(); var ModelData = QueryBuilderParser.ParseMapping(Utils.ReadMappingFile("Mappings/project-computed-entity.mapping")); // Load handcrafted query string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/projectQuery.js"); // Assert if the handcrafted query is not null Assert.IsNotNull(HandcraftedQuery); // Prepare query generator //ComputedEntity CarRepairedByGarage = new ComputedEntity( "CarManufacturedBy", // new QueryableEntity( (Entity)ModelData.EntityRelationshipModel.FindByName( "Car" ), "car" ), // (Relationship)ModelData.EntityRelationshipModel.FindByName( "ManufacturedBy" ), // new List<QueryableEntity> { // new QueryableEntity( (Entity)ModelData.EntityRelationshipModel.FindByName( "Manufacturer" ), "manufacturer" ) // } ); //RelationshipJoinOperator RJoinOp = new RelationshipJoinOperator( // new QueryableEntity( (Entity)ModelData.EntityRelationshipModel.FindByName( "Person" ), "person" ), // (Relationship)ModelData.EntityRelationshipModel.FindByName( "Owns" ), // new List<QueryableEntity> { // new QueryableEntity( CarRepairedByGarage ) // }, // ModelData.ERMongoMapping ); //VirtualMap VMap = RJoinOp.ComputeVirtualMap(); //Dictionary<string, ProjectExpression> ProjectPersonAttrs = new Dictionary<string, ProjectExpression>(); //QueryableEntity Person = new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Person" ) ); //QueryableEntity Car = new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Car" ) ); //QueryableEntity Manufacturer = new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Manufacturer" ) ); //List<ProjectArgument> ProjectArguments = new List<ProjectArgument>(); //ProjectArguments.Add( new ProjectArgument( Person.GetAttribute( "name" ), Person, new BooleanExpr( true ) ) ); //ProjectArguments.Add( new ProjectArgument( Car.GetAttribute( "model" ), Car, new BooleanExpr( true ) ) ); //ProjectArguments.Add( new ProjectArgument( Car.GetAttribute( "year" ), Car, new BooleanExpr( true ) ) ); //ProjectArguments.Add( new ProjectArgument( Manufacturer.GetAttribute( "name" ), Manufacturer, new BooleanExpr( true ) ) ); //ProjectStage ProjectOp = new ProjectStage( ProjectArguments, VMap ); //List<AlgebraOperator> OpList = new List<AlgebraOperator> { RJoinOp, ProjectOp }; //FromArgument StartArg = new FromArgument( new QueryableEntity( ModelData.EntityRelationshipModel.FindByName( "Person" ) ), // ModelData.ERMongoMapping ); //QueryGenerator QueryGen = new QueryGenerator( StartArg, OpList ); string QueryString = "from Person rjoin <Owns> (Car rjoin <ManufacturedBy> (Manufacturer)) select Person.name, Car.model, Car.year, Manufacturer.name"; // FIXED? QueryGenerator QueryGen = QueryBuilderParser.ParseQuery(QueryString, ModelData); string GeneratedQuery = QueryGen.Run(); // Assert if generated query is not null Assert.IsNotNull(GeneratedQuery); // Run Queries QueryRunner Runner = new QueryRunner("mongodb://localhost:27017", "ceManyToMany2"); string HandcraftedResult = Runner.GetJSON(HandcraftedQuery); string GeneratedResult = Runner.GetJSON(GeneratedQuery); // Check if either result is null Assert.IsNotNull(HandcraftedResult); Assert.IsNotNull(GeneratedResult); // Check if both results are equal Assert.IsTrue(JToken.DeepEquals(JToken.Parse(HandcraftedResult), JToken.Parse(GeneratedResult))); }
static void Main(string[] args) { var mapping = QueryBuilderParser.ParseMapping(new FileStream(args[0], FileMode.Open)); Console.WriteLine($"ERModel: {mapping.EntityRelationshipModel.Name}"); Console.WriteLine("\n\n****** ER Model ********\n\n"); foreach (var e in mapping.EntityRelationshipModel.Elements.FindAll(e => e.GetType() == typeof(Entity))) { Console.WriteLine($"Entity: {e.Name}"); e.Attributes.ForEach(a => { Console.WriteLine($" Attribute: {a.Name} of type {a.OfType}, multivalued={a.MultiValued}"); }); } foreach (var r in mapping.EntityRelationshipModel.Elements.FindAll(e => e.GetType() == typeof(Relationship)).ConvertAll <Relationship>(e => (Relationship)e)) { Console.WriteLine($"Relationship: {r.Name}"); r.Ends.ForEach(e => { Console.WriteLine($" End: {e.TargetEntity.Name}"); }); r.Attributes.ForEach(a => { Console.WriteLine($" Attribute: {a.Name} of type {a.OfType}, multivalued={a.MultiValued}"); }); } Console.WriteLine("\n\n****** Mongo DB Schema ********\n\n"); foreach (var c in mapping.MongoDBSchema.Collections) { Console.WriteLine($"Collection: {c.Name}"); c.DocumentSchema.Attributes.ForEach(a => { Console.WriteLine($" Field: {a.Name} of type {a.OfType}, multivalued={a.MultiValued}"); }); } Console.WriteLine("\n\n****** Mapping ********\n\n"); foreach (var r in mapping.ERMongoMapping.Rules) { Console.WriteLine($"Rule: {r.Source.Name} = {r.Target.Name} (Main={r.IsMain})"); foreach (var sr in r.Rules) { Console.WriteLine($" {sr.Key} - {sr.Value}"); } } Console.WriteLine("\n\n****** Warnings and Errors ********\n\n"); mapping.Warnings.ForEach(w => Console.WriteLine(w)); mapping.Errors.ForEach(e => Console.WriteLine(e)); //string[] queries = { "from Author a rjoin <BookAndAuthor ba> (Book b)" }; string[] queries = { "from Author a rjoin <BookAndAuthor ba> (Book b rjoin <PublishedBy pb> (Publisher p))" }; // string[] queries = { "from Person p rjoin <Insurance i> (Car c, InsuranceCompany ic)", // "from Car c rjoin <Repaired r> (Garage g)", // "from Person p rjoin <Insurance i> (Car c rjoin <Repaired r> (Garage g), InsuranceCompany ic)", // "from (Person p rjoin <Drives d> (Car c)) rjoin <Repaired r> (Garage g)", // "from (Person p rjoin <Drives d> (Car c rjoin <Repaired r> (Garage g)))", // "from Person p rjoin <Drives d> (Car c rjoin <Repaired r> (Garage g))" }; foreach (var q in queries) { Console.WriteLine(q); var generatedQuery = QueryBuilderParser.ParseQuery(q, mapping); Console.WriteLine("*************"); Console.WriteLine($"Start Argument: {generatedQuery.StartArgument.Entity.Element.Name} AS {generatedQuery.StartArgument.Entity.Alias}"); var i = 1; foreach (var Op in generatedQuery.PipelineOperators) { Console.WriteLine($"Operator {i++}: {Op.ToString()}"); } Console.WriteLine("*************"); QueryRunner runner = new QueryRunner("mongodb://localhost:27017", "sampleAuthorBookPublisher"); Console.WriteLine(runner.GetJSON(generatedQuery.Run())); } // Nested join example using manual code Console.WriteLine("Running example ============"); QueryableEntity Author = new QueryableEntity(mapping.EntityRelationshipModel.FindByName("Author")); QueryableEntity Book = new QueryableEntity(mapping.EntityRelationshipModel.FindByName("Book")); QueryableEntity Publisher = new QueryableEntity(mapping.EntityRelationshipModel.FindByName("Publisher")); Relationship BookAndAuthor = (Relationship)mapping.EntityRelationshipModel.FindByName("BookAndAuthor"); Relationship PublishedBy = (Relationship)mapping.EntityRelationshipModel.FindByName("PublishedBy"); ComputedEntity BookAndPublisher = new ComputedEntity("BookAndPublisher", Book, PublishedBy, new List <QueryableEntity>() { Publisher }); RelationshipJoinOperator JoinOp = new RelationshipJoinOperator(Author, BookAndAuthor, new List <QueryableEntity>() { new QueryableEntity(BookAndPublisher) }, mapping.ERMongoMapping); FromArgument fromArg = new FromArgument(Author, mapping.ERMongoMapping); List <AlgebraOperator> Operations = new List <AlgebraOperator>() { JoinOp }; QueryGenerator queryGen = new QueryGenerator(fromArg, Operations); string queryString = queryGen.Run(); QueryRunner queryRunner = new QueryRunner("mongodb://localhost:27017", "sampleAuthorBookPublisher"); Console.WriteLine(queryRunner.GetJSON(queryString)); }