Example #1
0
        public void OrMultiple()
        {
            RequiredDataContainer ModelData = SelectDataProvider.GetData();

            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 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)));
        }
Example #2
0
        public void ProjectStageHideFields()
        {
            RequiredDataContainer ModelData = VirtualMapDataProvider.VirtualMapModel();

            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(false)));
            ProjectArguments.Add(new ProjectArgument(Pet.GetAttribute("type"), Pet, new BooleanExpr(true)));
            ProjectArguments.Add(new ProjectArgument(Pet.GetAttribute("ownerId"), 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>()
            {
                "data_HasPet.Pet_type",
                "data_HasPet.Pet_ownerId"
            };

            Assert.IsTrue(!VirtualMapRules.Except(RulesToMatch).Any() && !RulesToMatch.Except(VirtualMapRules).Any(), "Virtual maps do not match");
        }
Example #3
0
        public void ProjectComputedEntity()
        {
            // Asserts if the query result for a relationship join operation is equal
            // to a handcrafted query
            RequiredDataContainer ModelData = ProjectDataProvider.ComputedEntityData();

            // 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 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 OneToManyComputedEntityMultipleEntities()
        {
            // Asserts if the query result for a relationship join operation is equal
            // to a handcrafted query
            RequiredDataContainer ModelData = ComputedEntityDataProvider.OneToManyComputedEntity();

            // Load handcrafted query
            string HandcraftedQuery = Utils.ReadQueryFromFile("HandcraftedQueries/ceOneToMany-2.js");

            // Assert if the handcrafted query is not null
            Assert.IsNotNull(HandcraftedQuery);

            // Prepare query generator
            ComputedEntity CarRepairedByGarage = new ComputedEntity("CarRepairedByGarage",
                                                                    new QueryableEntity(( Entity)ModelData.EntityRelationshipModel.FindByName("Car"), "car"),
                                                                    (Relationship)ModelData.EntityRelationshipModel.FindByName("Repaired"),
                                                                    new List <QueryableEntity> {
                new QueryableEntity((Entity)ModelData.EntityRelationshipModel.FindByName("Garage"), "garage"),
                new QueryableEntity((Entity)ModelData.EntityRelationshipModel.FindByName("Supplier"), "supplier")
            });

            RelationshipJoinOperator RJoinOp = new RelationshipJoinOperator(
                new QueryableEntity(( Entity)ModelData.EntityRelationshipModel.FindByName("Person"), "person"),
                (Relationship)ModelData.EntityRelationshipModel.FindByName("Drives"),
                new List <QueryableEntity> {
                new QueryableEntity(CarRepairedByGarage)
            },
                ModelData.ERMongoMapping);

            RelationshipJoinOperator RJoinOp2 = new RelationshipJoinOperator(
                new QueryableEntity((Entity)ModelData.EntityRelationshipModel.FindByName("Person"), "person"),
                (Relationship)ModelData.EntityRelationshipModel.FindByName("HasInsurance"),
                new List <QueryableEntity> {
                new QueryableEntity((Entity)ModelData.EntityRelationshipModel.FindByName("Insurance"), "insurance")
            },
                ModelData.ERMongoMapping);

            List <AlgebraOperator> OpList = new List <AlgebraOperator> {
                RJoinOp, RJoinOp2
            };
            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", "ceOneToMany");

            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)));
        }
Example #5
0
        public void GetAllProductsFromStore()
        {
            RequiredDataContainer DataMap                   = MarketingCMSDataProvider.MapEntitiesToCollections();
            RequiredDataContainer DataMapDuplicates         = MarketingCMSDataProvider.MapEntitiesToCollectionDuplicates();
            RequiredDataContainer DataMapCategoryDuplicated = MarketingCMSDataProvider.MapEntitiesToCollectionCategoryDuplicated();
            RequiredDataContainer DataMapStoreDuplicated    = MarketingCMSDataProvider.MapEntitiesToCollectionsStoreDuplicated();
            RequiredDataContainer DataMapUserDuplicated     = MarketingCMSDataProvider.MapEntitiesToCollectionsUserDuplicated();

            QueryableEntity Store   = new QueryableEntity(DataMap.EntityRelationshipModel.FindByName("Store"));
            QueryableEntity Product = new QueryableEntity(DataMap.EntityRelationshipModel.FindByName("Product"));

            RelationshipJoinOperator JoinOpMap1 = new RelationshipJoinOperator(Store,
                                                                               (Relationship)DataMap.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                               new List <QueryableEntity>()
            {
                Product
            },
                                                                               DataMap.ERMongoMapping);

            RelationshipJoinOperator JoinOpMap2 = new RelationshipJoinOperator(Store,
                                                                               (Relationship)DataMapDuplicates.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                               new List <QueryableEntity>()
            {
                Product
            },
                                                                               DataMapDuplicates.ERMongoMapping);

            RelationshipJoinOperator JoinOpMap3 = new RelationshipJoinOperator(Store,
                                                                               (Relationship)DataMapCategoryDuplicated.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                               new List <QueryableEntity>()
            {
                Product
            },
                                                                               DataMapCategoryDuplicated.ERMongoMapping);

            RelationshipJoinOperator JoinOpMap4 = new RelationshipJoinOperator(Store,
                                                                               (Relationship)DataMapStoreDuplicated.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                               new List <QueryableEntity>()
            {
                Product
            },
                                                                               DataMapStoreDuplicated.ERMongoMapping);

            RelationshipJoinOperator JoinOpMap5 = new RelationshipJoinOperator(Store,
                                                                               (Relationship)DataMapUserDuplicated.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                               new List <QueryableEntity>()
            {
                Product
            },
                                                                               DataMapUserDuplicated.ERMongoMapping);

            SortArgument SortArg = new SortArgument(Store, Store.GetAttribute("store_id"), MongoDBSort.Ascending);

            SortStage SortOpMap1 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMap.ERMongoMapping);
            SortStage SortOpMap2 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapDuplicates.ERMongoMapping);
            SortStage SortOpMap3 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapCategoryDuplicated.ERMongoMapping);
            SortStage SortOpMap4 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapStoreDuplicated.ERMongoMapping);
            SortStage SortOpMap5 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapUserDuplicated.ERMongoMapping);

            List <AlgebraOperator> OperatorsToExecuteMap1 = new List <AlgebraOperator>()
            {
                JoinOpMap1, SortOpMap1
            };
            List <AlgebraOperator> OperatorsToExecuteMap2 = new List <AlgebraOperator>()
            {
                JoinOpMap2, SortOpMap2
            };
            List <AlgebraOperator> OperatorsToExecuteMap3 = new List <AlgebraOperator>()
            {
                JoinOpMap3, SortOpMap3
            };
            List <AlgebraOperator> OperatorsToExecuteMap4 = new List <AlgebraOperator>()
            {
                JoinOpMap4, SortOpMap4
            };
            List <AlgebraOperator> OperatorsToExecuteMap5 = new List <AlgebraOperator>()
            {
                JoinOpMap5, SortOpMap5
            };

            FromArgument StartArgMap1 = new FromArgument(Store, DataMap.ERMongoMapping);
            FromArgument StartArgMap2 = new FromArgument(Store, DataMapDuplicates.ERMongoMapping);
            FromArgument StartArgMap3 = new FromArgument(Store, DataMapCategoryDuplicated.ERMongoMapping);
            FromArgument StartArgMap4 = new FromArgument(Store, DataMapStoreDuplicated.ERMongoMapping);
            FromArgument StartArgMap5 = new FromArgument(Store, DataMapUserDuplicated.ERMongoMapping);

            QueryGenerator GeneratorMap1 = new QueryGenerator(StartArgMap1, OperatorsToExecuteMap1);
            QueryGenerator GeneratorMap2 = new QueryGenerator(StartArgMap2, OperatorsToExecuteMap2);
            QueryGenerator GeneratorMap3 = new QueryGenerator(StartArgMap3, OperatorsToExecuteMap3);
            QueryGenerator GeneratorMap4 = new QueryGenerator(StartArgMap4, OperatorsToExecuteMap4);
            QueryGenerator GeneratorMap5 = new QueryGenerator(StartArgMap5, OperatorsToExecuteMap5);

            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");

            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap2)));
            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap3)));
            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap4)));
            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap5)));
        }
Example #6
0
        public void GetAllProducts()
        {
            RequiredDataContainer DataMap                   = MarketingCMSDataProvider.MapEntitiesToCollections();
            RequiredDataContainer DataMapDuplicates         = MarketingCMSDataProvider.MapEntitiesToCollectionDuplicates();
            RequiredDataContainer DataMapCategoryDuplicated = MarketingCMSDataProvider.MapEntitiesToCollectionCategoryDuplicated();
            RequiredDataContainer DataMapStoreDuplicated    = MarketingCMSDataProvider.MapEntitiesToCollectionsStoreDuplicated();
            RequiredDataContainer DataMapUserDuplicated     = MarketingCMSDataProvider.MapEntitiesToCollectionsUserDuplicated();

            QueryableEntity Product  = new QueryableEntity(DataMap.EntityRelationshipModel.FindByName("Product"));
            QueryableEntity Store    = new QueryableEntity(DataMap.EntityRelationshipModel.FindByName("Store"));
            QueryableEntity Category = new QueryableEntity(DataMap.EntityRelationshipModel.FindByName("Category"));
            QueryableEntity User     = new QueryableEntity(DataMap.EntityRelationshipModel.FindByName("User"));

            RelationshipJoinOperator RJoinStoreMap1 = new RelationshipJoinOperator(Product,
                                                                                   (Relationship)DataMap.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                                   new List <QueryableEntity>()
            {
                Store
            },
                                                                                   DataMap.ERMongoMapping);

            RelationshipJoinOperator RJoinCategoryMap1 = new RelationshipJoinOperator(Product,
                                                                                      (Relationship)DataMap.EntityRelationshipModel.FindByName("CategoryHasManyProducts"),
                                                                                      new List <QueryableEntity>()
            {
                Category
            },
                                                                                      DataMap.ERMongoMapping);

            RelationshipJoinOperator RJoinUserMap1 = new RelationshipJoinOperator(Product,
                                                                                  (Relationship)DataMap.EntityRelationshipModel.FindByName("HasManyProducts"),
                                                                                  new List <QueryableEntity>()
            {
                User
            },
                                                                                  DataMap.ERMongoMapping);

            // DEBUG
            //LimitStage LimitOp = new LimitStage( 150000 );
            SortArgument SortArg = new SortArgument(Product, Product.GetAttribute("product_id"), MongoDBSort.Ascending);
            SortStage    SortOp  = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMap.ERMongoMapping);
            SortStage SortOp2 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapDuplicates.ERMongoMapping);
            SortStage SortOp3 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapCategoryDuplicated.ERMongoMapping);
            SortStage SortOp4 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapStoreDuplicated.ERMongoMapping);
            SortStage SortOp5 = new SortStage(new List <SortArgument>()
            {
                SortArg
            }, DataMapUserDuplicated.ERMongoMapping);
            // =====

            // Build and execute Map1 query
            List <AlgebraOperator> Map1OperatorsList = new List <AlgebraOperator>()
            {
                RJoinStoreMap1, RJoinCategoryMap1, RJoinUserMap1, SortOp
            };

            FromArgument   StartArgMap1 = new FromArgument(Product, DataMap.ERMongoMapping);
            QueryGenerator Generator    = new QueryGenerator(StartArgMap1, Map1OperatorsList);

            string Map1Query = Generator.Run();

            Assert.IsNotNull(Map1Query, "Generated query [Map1Query] cannot be null");

            RelationshipJoinOperator RJoinStoreMap2 = new RelationshipJoinOperator(Product,
                                                                                   (Relationship)DataMapDuplicates.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                                   new List <QueryableEntity>()
            {
                Store
            },
                                                                                   DataMapDuplicates.ERMongoMapping);

            RelationshipJoinOperator RJoinCategoryMap2 = new RelationshipJoinOperator(Product,
                                                                                      (Relationship)DataMapDuplicates.EntityRelationshipModel.FindByName("CategoryHasManyProducts"),
                                                                                      new List <QueryableEntity>()
            {
                Category
            },
                                                                                      DataMapDuplicates.ERMongoMapping);

            RelationshipJoinOperator RJoinUserMap2 = new RelationshipJoinOperator(Product,
                                                                                  (Relationship)DataMapDuplicates.EntityRelationshipModel.FindByName("HasManyProducts"),
                                                                                  new List <QueryableEntity>()
            {
                User
            },
                                                                                  DataMapDuplicates.ERMongoMapping);

            List <AlgebraOperator> MapDuplicatesOpList = new List <AlgebraOperator>()
            {
                RJoinStoreMap2, RJoinCategoryMap2, RJoinUserMap2, SortOp2
            };

            FromArgument   StartArgMap2        = new FromArgument(Product, DataMapDuplicates.ERMongoMapping);
            QueryGenerator GeneratorDuplicates = new QueryGenerator(StartArgMap2, MapDuplicatesOpList);

            string MapDuplicatesQuery = GeneratorDuplicates.Run();

            Assert.IsNotNull(MapDuplicatesQuery, "Generated query [MapDuplicatesQuery] cannot be null");

            RelationshipJoinOperator RJoinStoreMap3 = new RelationshipJoinOperator(Product,
                                                                                   (Relationship)DataMapCategoryDuplicated.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                                   new List <QueryableEntity>()
            {
                Store
            },
                                                                                   DataMapCategoryDuplicated.ERMongoMapping);

            RelationshipJoinOperator RJoinCategoryMap3 = new RelationshipJoinOperator(Product,
                                                                                      (Relationship)DataMapCategoryDuplicated.EntityRelationshipModel.FindByName("CategoryHasManyProducts"),
                                                                                      new List <QueryableEntity>()
            {
                Category
            },
                                                                                      DataMapCategoryDuplicated.ERMongoMapping);

            RelationshipJoinOperator RJoinUserMap3 = new RelationshipJoinOperator(Product,
                                                                                  (Relationship)DataMapCategoryDuplicated.EntityRelationshipModel.FindByName("HasManyProducts"),
                                                                                  new List <QueryableEntity>()
            {
                User
            },
                                                                                  DataMapCategoryDuplicated.ERMongoMapping);

            List <AlgebraOperator> MapCategoryDuplicatedOpList = new List <AlgebraOperator>()
            {
                RJoinStoreMap3, RJoinCategoryMap3, RJoinUserMap3, SortOp3
            };

            FromArgument   StartArgCategoryDuplicated  = new FromArgument(Product, DataMapCategoryDuplicated.ERMongoMapping);
            QueryGenerator GeneratorCategoryDuplicated = new QueryGenerator(StartArgCategoryDuplicated, MapCategoryDuplicatedOpList);

            string MapCategoryDuplicatedQuery = GeneratorCategoryDuplicated.Run();

            Assert.IsNotNull(MapCategoryDuplicatedQuery, "Generated query [MapCategoryDuplicatedQuery] cannot be null");

            RelationshipJoinOperator RJoinStoreMap4 = new RelationshipJoinOperator(Product,
                                                                                   (Relationship)DataMapStoreDuplicated.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                                   new List <QueryableEntity>()
            {
                Store
            },
                                                                                   DataMapStoreDuplicated.ERMongoMapping);

            RelationshipJoinOperator RJoinCategoryMap4 = new RelationshipJoinOperator(Product,
                                                                                      (Relationship)DataMapStoreDuplicated.EntityRelationshipModel.FindByName("CategoryHasManyProducts"),
                                                                                      new List <QueryableEntity>()
            {
                Category
            },
                                                                                      DataMapStoreDuplicated.ERMongoMapping);

            RelationshipJoinOperator RJoinUserMap4 = new RelationshipJoinOperator(Product,
                                                                                  (Relationship)DataMapStoreDuplicated.EntityRelationshipModel.FindByName("HasManyProducts"),
                                                                                  new List <QueryableEntity>()
            {
                User
            },
                                                                                  DataMapStoreDuplicated.ERMongoMapping);

            List <AlgebraOperator> MapStoreDuplicatedOpList = new List <AlgebraOperator>()
            {
                RJoinStoreMap4, RJoinCategoryMap4, RJoinUserMap4, SortOp4
            };

            FromArgument   StartArgStoreDuplicated  = new FromArgument(Product, DataMapStoreDuplicated.ERMongoMapping);
            QueryGenerator GeneratorStoreDuplicated = new QueryGenerator(StartArgStoreDuplicated, MapStoreDuplicatedOpList);

            string MapStoreDuplicatedQuery = GeneratorStoreDuplicated.Run();

            Assert.IsNotNull(MapStoreDuplicatedQuery, "Generated query [MapStoreDuplicatedQuery] cannot be null");

            RelationshipJoinOperator RJoinStoreMap5 = new RelationshipJoinOperator(Product,
                                                                                   (Relationship)DataMapUserDuplicated.EntityRelationshipModel.FindByName("StoreHasManyProducts"),
                                                                                   new List <QueryableEntity>()
            {
                Store
            },
                                                                                   DataMapUserDuplicated.ERMongoMapping);

            RelationshipJoinOperator RJoinCategoryMap5 = new RelationshipJoinOperator(Product,
                                                                                      (Relationship)DataMapUserDuplicated.EntityRelationshipModel.FindByName("CategoryHasManyProducts"),
                                                                                      new List <QueryableEntity>()
            {
                Category
            },
                                                                                      DataMapUserDuplicated.ERMongoMapping);

            RelationshipJoinOperator RJoinUserMap5 = new RelationshipJoinOperator(Product,
                                                                                  (Relationship)DataMapUserDuplicated.EntityRelationshipModel.FindByName("HasManyProducts"),
                                                                                  new List <QueryableEntity>()
            {
                User
            },
                                                                                  DataMapUserDuplicated.ERMongoMapping);

            List <AlgebraOperator> MapUserDuplicatedOpList = new List <AlgebraOperator>()
            {
                RJoinStoreMap5, RJoinCategoryMap5, RJoinUserMap5, SortOp5
            };

            FromArgument   StartArgUserDuplicated  = new FromArgument(Product, DataMapUserDuplicated.ERMongoMapping);
            QueryGenerator GeneratorUserDuplicated = new QueryGenerator(StartArgUserDuplicated, MapUserDuplicatedOpList);

            string MapUserDuplicatedQuery = GeneratorUserDuplicated.Run();

            Assert.IsNotNull(MapUserDuplicatedQuery, "Generated query [MapUserDuplicatedQuery] 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(Map1Query);
            string ResultMap2 = RunnerMap2.GetJSON(MapDuplicatesQuery);
            string ResultMap3 = RunnerMap3.GetJSON(MapCategoryDuplicatedQuery);
            string ResultMap4 = RunnerMap4.GetJSON(MapStoreDuplicatedQuery);
            string ResultMap5 = RunnerMap5.GetJSON(MapUserDuplicatedQuery);

            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(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap2)));
            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap3)));
            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap4)));
            Assert.IsTrue(JToken.DeepEquals(JToken.Parse(ResultMap1), JToken.Parse(ResultMap5)));
        }