コード例 #1
0
        private static void SetupTestData(IDocumentStore store)
        {
            new Product_AvailableForSale2().Execute(store);

            Product product1 = new Product("MyName1", "MyBrand1");
            Product product2 = new Product("MyName2", "MyBrand2");

            FacetSetup facetSetup = new FacetSetup {
                Id = "facets/ProductFacets", Facets = new List <Facet> {
                    new Facet {
                        FieldName = "Brand"
                    }
                }
            };

            using (IDocumentSession docSession = store.OpenSession())
            {
                foreach (var productDoc in docSession.Query <Product>())
                {
                    docSession.Delete(productDoc);
                }
                docSession.SaveChanges();

                docSession.Store(product1);
                docSession.Store(product2);
                docSession.Store(facetSetup);
                docSession.SaveChanges();
            }
        }
コード例 #2
0
        private static void SetupFacets(String id, IDocumentStore store)
        {
            var facet = new FacetSetup()
            {
                Id     = id,
                Facets =
                {
                    new Facet <Orders.Product>()
                    {
                        Name = p => p.Supplier
                    },
                    new Facet <Orders.Product>()
                    {
                        Name   = p => p.PricePerUser,
                        Ranges =
                        {
                            p => p.PricePerUser <= 50,
                            p => p.PricePerUser > 50 && p.PricePerUser <= 100,
                            p => p.PricePerUser > 100 && p.PricePerUser <= 200,
                            p => p.PricePerUser > 200,
                        }
                    },
                }
            };

            using (var session = store.OpenSession())
            {
                session.Store(facet);
                session.SaveChanges();
            }
        }
コード例 #3
0
ファイル: FacetQuery.cs プロジェクト: radtek/ravendb
        public static FacetQuery Create(DocumentsOperationContext context, IndexQueryServerSide query)
        {
            long?facetsEtag         = null;
            DocumentsTransaction tx = null;

            try
            {
                var facets = new Dictionary <string, FacetSetup>(StringComparer.OrdinalIgnoreCase);
                foreach (var selectField in query.Metadata.SelectFields)
                {
                    if (selectField.IsFacet == false)
                    {
                        continue;
                    }

                    var facetField = (FacetField)selectField;
                    if (facetField.FacetSetupDocumentId == null || facets.ContainsKey(facetField.FacetSetupDocumentId))
                    {
                        continue;
                    }

                    if (tx == null)
                    {
                        tx = context.OpenReadTransaction();
                    }

                    var documentJson = context.DocumentDatabase.DocumentsStorage.Get(context, facetField.FacetSetupDocumentId);
                    if (documentJson == null)
                    {
                        throw new DocumentDoesNotExistException(facetField.FacetSetupDocumentId);
                    }

                    if (facetsEtag.HasValue == false)
                    {
                        facetsEtag = documentJson.Etag;
                    }
                    else
                    {
                        facetsEtag = facetsEtag.Value ^ documentJson.Etag;
                    }

                    var document = FacetSetup.Create(facetField.FacetSetupDocumentId, documentJson.Data);

                    facets[facetField.FacetSetupDocumentId] = document;
                }

                return(new FacetQuery(query, facets, facetsEtag ?? 0)
                {
                    Legacy = string.IsNullOrEmpty(query.ClientVersion) == false && query.ClientVersion[0] == '4'
                });
            }
            finally
            {
                tx?.Dispose();
            }
        }
コード例 #4
0
ファイル: FacetedIndex.cs プロジェクト: janmarques/ravendb
        private void Setup(IDocumentStore store, List <Facet> facets, List <RangeFacet> rangeFacets)
        {
            using (var s = store.OpenSession())
            {
                var facetSetupDoc = new FacetSetup {
                    Id = "facets/CameraFacets", Facets = facets, RangeFacets = rangeFacets
                };
                s.Store(facetSetupDoc);
                s.SaveChanges();
            }

            CreateCameraCostIndex(store);

            InsertCameraData(store, _data);
        }
コード例 #5
0
ファイル: FacetedIndex.cs プロジェクト: ybdev/ravendb
        private void Setup(IDocumentStore store, List <Facet> facetsToUse)
        {
            using (var s = store.OpenSession())
            {
                var facetSetupDoc = new FacetSetup {
                    Id = "facets/CameraFacets", Facets = facetsToUse
                };
                s.Store(facetSetupDoc);
                s.SaveChanges();
            }

            CreateCameraCostIndex(store);

            InsertCameraDataAndWaitForNonStaleResults(store, _data);
        }
コード例 #6
0
ファイル: RavenDB_12748.cs プロジェクト: radtek/ravendb
        public void CanDeserializeLegacyFacetSetup()
        {
            var facets = new DynamicJsonArray
            {
                new DynamicJsonValue
                {
                    [nameof(Facet.Aggregations)] = new DynamicJsonValue
                    {
                        [nameof(FacetAggregation.Min)] = "Test"
                    }
                }
            };
            var rangeFacets = new DynamicJsonArray
            {
                new DynamicJsonValue
                {
                    [nameof(Facet.Aggregations)] = new DynamicJsonValue
                    {
                        [nameof(FacetAggregation.Max)] = "Test2"
                    }
                }
            };

            var djv = new DynamicJsonValue
            {
                [nameof(FacetSetup.Facets)]      = facets,
                [nameof(FacetSetup.RangeFacets)] = rangeFacets
            };

            using (var context = JsonOperationContext.ShortTermSingleUse())
            {
                var json  = context.ReadObject(djv, "facet/setup");
                var setup = FacetSetup.Create("myId", json);

                Assert.Equal("myId", setup.Id);

                Assert.Equal(1, setup.Facets.Count);
                Assert.Equal(1, setup.Facets[0].Aggregations.Count);
                Assert.Equal("Test", setup.Facets[0].Aggregations[FacetAggregation.Min].Single().Name);
                Assert.Null(setup.Facets[0].Aggregations[FacetAggregation.Min].Single().DisplayName);

                Assert.Equal(1, setup.RangeFacets.Count);
                Assert.Equal(1, setup.RangeFacets[0].Aggregations.Count);
                Assert.Equal("Test2", setup.RangeFacets[0].Aggregations[FacetAggregation.Max].Single().Name);
                Assert.Null(setup.RangeFacets[0].Aggregations[FacetAggregation.Max].Single().DisplayName);
            }
        }
コード例 #7
0
ファイル: IdComesBackLowerCase.cs プロジェクト: ybdev/ravendb
        public IdComesBackLowerCase()
        {
            store = new EmbeddableDocumentStore {
                RunInMemory = true
            };
            ((EmbeddableDocumentStore)store).RegisterListener(new NoStaleQueriesListener());
            store.Initialize();

            new Product_AvailableForSale3().Execute(store);

            Product product1 = new Product("MyName1", "MyBrand1");

            product1.Id = "Products/100";

            Product product2 = new Product("MyName2", "MyBrand2");

            product2.Id = "Products/101";

            FacetSetup facetSetup = new FacetSetup {
                Id = "facets/ProductFacets", Facets = new List <Facet> {
                    new Facet {
                        Name = "Brand"
                    }
                }
            };

            using (IDocumentSession docSession = store.OpenSession())
            {
                foreach (var productDoc in docSession.Query <Product>())
                {
                    docSession.Delete(productDoc);
                }
                docSession.SaveChanges();

                docSession.Store(product1);
                docSession.Store(product2);
                docSession.Store(facetSetup);
                docSession.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                var check = session.Query <Product>().ToList();
                Assert.Equal(check.Count, 2);
            }
        }
コード例 #8
0
        public IdComesBackLowerCase()
        {
            _store = GetDocumentStore();

            new Product_AvailableForSale3().Execute(_store);

            var product1 = new Product("MyName1", "MyBrand1");

            product1.Id = "Products/100";

            var product2 = new Product("MyName2", "MyBrand2");

            product2.Id = "Products/101";

            var facetSetup = new FacetSetup {
                Id = "facets/ProductFacets", Facets = new List <Facet> {
                    new Facet {
                        Name = "Brand"
                    }
                }
            };

            using (var docSession = _store.OpenSession())
            {
                foreach (var productDoc in docSession.Query <Product>())
                {
                    docSession.Delete(productDoc);
                }
                docSession.SaveChanges();

                docSession.Store(product1);
                docSession.Store(product2);
                docSession.Store(facetSetup);
                docSession.SaveChanges();
            }

            using (var session = _store.OpenSession())
            {
                var check = session.Query <Product>().ToList();
                Assert.Equal(check.Count, 2);
            }
        }
コード例 #9
0
        private static void CreateData(IDocumentStore store)
        {
            new Product_AvailableForSale3().Execute(store);

            var product1 = new Product("MyName1", "MyBrand1");

            product1.Id = "Products/100";

            var product2 = new Product("MyName2", "MyBrand2");

            product2.Id = "Products/101";

            var facetSetup = new FacetSetup {
                Id = "facets/ProductFacets", Facets = new List <Facet> {
                    new Facet {
                        FieldName = "Brand"
                    }
                }
            };

            using (var docSession = store.OpenSession())
            {
                foreach (var productDoc in docSession.Query <Product>().Customize(x => x.WaitForNonStaleResults()))
                {
                    docSession.Delete(productDoc);
                }
                docSession.SaveChanges();

                docSession.Store(product1);
                docSession.Store(product2);
                docSession.Store(facetSetup);
                docSession.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                var check = session.Query <Product>().ToList();
                Assert.Equal(check.Count, 2);
            }
        }
コード例 #10
0
        private void Setup(IDocumentStore store, List <Facet> facetsToUse)
        {
            using (var s = store.OpenSession())
            {
                var facetSetupDoc = new FacetSetup {
                    Id = "facets/CameraFacets", Facets = facetsToUse
                };
                s.Store(facetSetupDoc);
                s.SaveChanges();

                store.DatabaseCommands.PutIndex("CameraCost",
                                                new IndexDefinition
                {
                    Map =
                        @"from camera in docs 
                                                        select new 
                                                        { 
                                                            camera.Manufacturer, 
                                                            camera.Model, 
                                                            camera.Cost,
                                                            camera.DateOfListing,
                                                            camera.Megapixels
                                                        }"
                });

                foreach (var camera in _data)
                {
                    s.Store(camera);
                }
                s.SaveChanges();

                s.Query <Camera>("CameraCost")
                .Customize(x => x.WaitForNonStaleResults())
                .ToList();
            }
        }
コード例 #11
0
        public void CanSearchOnAllProperties()
        {
            using (var store = GetDocumentStore())
            {
                new Products_Stats().Execute(store);

                using (var session = store.OpenSession())
                {
                    for (int i = 0; i < 1000; i++)
                    {
                        var amount = i % 50 / 10f;
                        session.Store(
                            new Product
                        {
                            Category = i % 2 == 0 ? "Cat1" : "Cat2",
                            Name     = "Product " + i,
                            Price    = new Price {
                                Currency = "USD", Amount = amount
                            }
                        });
                    }

                    var facetSetup = new FacetSetup
                    {
                        Id     = "facets/StatsFacet",
                        Facets = new List <Facet>
                        {
                            new Facet
                            {
                                Name = "Category"
                            },
                            new Facet
                            {
                                Name   = "Price_Range",
                                Mode   = FacetMode.Ranges,
                                Ranges = new List <string>
                                {
                                    "[NULL TO Dx0]",
                                    "[Dx0.001 TO Dx0.999]",
                                    "[Dx0.999 TO Dx1.999]",
                                    "[Dx1.999 TO NULL]"
                                }
                            }
                        }
                    };
                    session.Store(facetSetup);
                    session.SaveChanges();
                }

                WaitForIndexing(store);

                using (var s = store.OpenSession())
                {
                    var query        = s.Query <Product>("Products/Stats");
                    var facetResults = query.ToFacets("facets/StatsFacet");

                    var priceFacet = facetResults.Results["Price_Range"];

                    foreach (var val in priceFacet.Values)
                    {
                        Assert.NotEqual(0, val.Hits);
                    }
                }
            }
        }
コード例 #12
0
        public void Default_operator_not_honoured_remote_store_ToFacetsLazy()
        {
            using (var store = GetDocumentStore())
            {
                var facetSetup = new FacetSetup
                {
                    Id     = "Facets",
                    Facets = new List <Facet>()
                    {
                        new Facet()
                        {
                            FieldName = "Facet1"
                        },
                    },
                };

                using (var session = store.OpenSession())
                {
                    foreach (var foo in session.Query <Foo>())
                    {
                        session.Delete(foo);
                    }

                    session.Store(facetSetup);
                    session.Store(new Foo()
                    {
                        Facet1 = "term1"
                    });
                    session.Store(new Foo()
                    {
                        Facet1 = "term2"
                    });
                    session.SaveChanges();
                }

                new Foos().Execute(store);

                Indexes.WaitForIndexing(store);


                using (var session = store.OpenSession())
                {
                    var facetResults = session.Advanced.DocumentQuery <Foo, Foos>()
                                       .UsingDefaultOperator(QueryOperator.And)
                                       .WhereEquals("Facet1", "term1")
                                       .WhereEquals("Facet1", "term2")
                                       .AggregateUsing("Facets")
                                       .Execute();

                    Assert.Equal(facetResults["Facet1"].Values.Count, 0);

                    QueryStatistics stats;
                    var             query = session.Advanced.DocumentQuery <Foo, Foos>()
                                            .Statistics(out stats)
                                            .UsingDefaultOperator(QueryOperator.And)
                                            .WhereEquals("Facet1", "term1")
                                            .WhereEquals("Facet1", "term2");

                    facetResults = query
                                   .AggregateUsing("Facets")
                                   .ExecuteLazy().Value;

                    Assert.Equal(facetResults["Facet1"].Values.Count, 0);
                }
            }
        }
コード例 #13
0
        public static void TryCreatingFacets(IDocumentStore store)
        {
            using (var session = store.OpenSession())
            {
                //session.Store(new FacetSetup
                //    {
                //        Id = "facets/AppsFacets",
                //        Facets =
                //            {
                //                new Raven.Abstractions.Data.Facet
                //                    {
                //                        Name = "AgeRating",
                //                        TermSortMode = FacetTermSortMode.ValueAsc
                //                    },
                //                new Raven.Abstractions.Data.Facet
                //                    {
                //                        Name = "Developer",
                //                        MaxResults = 10,
                //                        TermSortMode = FacetTermSortMode.HitsDesc
                //                    },
                //                new Raven.Abstractions.Data.Facet
                //                    {
                //                        Name = "Category",
                //                        TermSortMode = FacetTermSortMode.HitsDesc
                //                    },
                //                new Raven.Abstractions.Data.Facet
                //                    {
                //                        Name = "Subcategory",
                //                        TermSortMode = FacetTermSortMode.HitsDesc
                //                    },
                //                new Raven.Abstractions.Data.Facet
                //                    {
                //                        Name = "Country",
                //                        TermSortMode = FacetTermSortMode.HitsDesc,
                //                        MaxResults = 8
                //                    },
                //                new Raven.Abstractions.Data.Facet
                //                    {
                //                        Name = "Language",
                //                        TermSortMode = FacetTermSortMode.HitsDesc,
                //                        MaxResults = 8
                //                    }
                //            }
                //    });

                var facetSetup2 = new FacetSetup
                {
                    Id     = "facets/StatsFacets",
                    Facets =
                    {
                        new Raven.Abstractions.Data.Facet
                        {
                            Name = "Category"
                        },
                        new Raven.Abstractions.Data.Facet
                        {
                            Name = "Language"
                        },
                        new Raven.Abstractions.Data.Facet
                        {
                            Name = "SupportedPlatforms"
                        },
                        new Raven.Abstractions.Data.Facet
                        {
                            Name = "Countries"
                        },
                        new Raven.Abstractions.Data.Facet
                        {
                            Name = "ScoreRating_Range", Mode = FacetMode.Ranges, Ranges =
                            {
                                string.Format("[NULL TO {0}]", NumberUtil.NumberToString(1)),
                                string.Format("[{0} TO {1}]",  NumberUtil.NumberToString(1), NumberUtil.NumberToString(2)),
                                string.Format("[{0} TO {1}]",  NumberUtil.NumberToString(2), NumberUtil.NumberToString(3)),
                                string.Format("[{0} TO {1}]",  NumberUtil.NumberToString(3), NumberUtil.NumberToString(4)),
                                string.Format("[{0} TO NULL]", NumberUtil.NumberToString(4)),
                            }
                        },
                        new Raven.Abstractions.Data.Facet
                        {
                            Name = "Price_Range", Mode = FacetMode.Ranges, Ranges =
                            {
                                string.Format("[NULL TO {0}]", NumberUtil.NumberToString(0.0f)),
                                string.Format("[{0} TO {1}]",  NumberUtil.NumberToString(0.0f), NumberUtil.NumberToString(0.999f)),
                                string.Format("[{0} TO {1}]",  NumberUtil.NumberToString(1.0f), NumberUtil.NumberToString(2.999f)),
                                string.Format("[{0} TO {1}]",  NumberUtil.NumberToString(3.0f), NumberUtil.NumberToString(4.999f)),
                                string.Format("[{0} TO NULL]", NumberUtil.NumberToString(5.0f)),
                            }
                        }
                    }
                };
                session.Store(facetSetup2);

                session.SaveChanges();
            }
        }
コード例 #14
0
        private static void DoTest(IDocumentStore store)
        {
            new EmployeeByRegionAndSalary().Execute(store);

            using (var session = store.OpenSession())
            {
                session.Store(new Employee
                {
                    Name   = "A",
                    Region = Region.North,
                    Salary = 20000
                });

                session.Store(new Employee
                {
                    Name   = "B",
                    Region = Region.North,
                    Salary = 30000
                });

                session.Store(new Employee
                {
                    Name   = "C",
                    Region = Region.South,
                    Salary = 25000
                });

                session.Store(new Employee
                {
                    Name   = "D",
                    Region = Region.East,
                    Salary = 45000
                });

                session.Store(new Employee
                {
                    Name   = "E",
                    Region = Region.East,
                    Salary = 55000
                });

                session.Store(new Employee
                {
                    Name   = "F",
                    Region = Region.West,
                    Salary = 15000
                });

                session.Store(new Employee
                {
                    Name   = "G",
                    Region = Region.West,
                    Salary = 85000
                });

                session.SaveChanges();

                WaitForIndexing(store);

                var facets = new List <Facet>
                {
                    new Facet <Employee>
                    {
                        Name   = x => x.Salary,
                        Ranges =
                        {
                            x => x.Salary < 20000,
                            x => x.Salary >= 20000 && x.Salary < 40000,
                            x => x.Salary >= 40000 && x.Salary < 60000,
                            x => x.Salary >= 60000 && x.Salary < 80000,
                            x => x.Salary > 80000
                        }
                    }
                };

                using (var s = store.OpenSession())
                {
                    var facetSetupDoc = new FacetSetup {
                        Id = "facets/EmployeeFacets", Facets = facets
                    };
                    s.Store(facetSetupDoc);
                    s.SaveChanges();
                }

                // by using setup document

                var northSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                            .Where(x => x.Region == Region.North).ToFacetQuery("facets/EmployeeFacets");
                var southSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                            .Where(x => x.Region == Region.South).ToFacetQuery("facets/EmployeeFacets");
                var eastSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                           .Where(x => x.Region == Region.East).ToFacetQuery("facets/EmployeeFacets");
                var westSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                           .Where(x => x.Region == Region.West).ToFacetQuery("facets/EmployeeFacets");


                var multiFacetedSearchResults = session.Advanced.MultiFacetedSearch(northSalaryFacetQuery, southSalaryFacetQuery,
                                                                                    eastSalaryFacetQuery, westSalaryFacetQuery);

                Assert.Equal(4, multiFacetedSearchResults.Length);

                AssertResults(multiFacetedSearchResults);

                // by using list of facets

                northSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                        .Where(x => x.Region == Region.North).ToFacetQuery(facets);
                southSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                        .Where(x => x.Region == Region.South).ToFacetQuery(facets);
                eastSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                       .Where(x => x.Region == Region.East).ToFacetQuery(facets);
                westSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                       .Where(x => x.Region == Region.West).ToFacetQuery(facets);


                multiFacetedSearchResults = session.Advanced.MultiFacetedSearch(northSalaryFacetQuery, southSalaryFacetQuery,
                                                                                eastSalaryFacetQuery, westSalaryFacetQuery);

                Assert.Equal(4, multiFacetedSearchResults.Length);

                AssertResults(multiFacetedSearchResults);
            }
        }
コード例 #15
0
        private static IEnumerable <(FacetBase Facet, List <QueryExpression> Ranges)> ProcessFacetSetup(FacetSetup setup)
        {
            QueryParser queryParser = null;

            foreach (var f in setup.Facets)
            {
                if (f.Options == null)
                {
                    f.Options = FacetOptions.Default;
                }

                yield return(f, null);
            }

            foreach (var f in setup.RangeFacets)
            {
                List <QueryExpression> facetRanges = null;

                if (f.Options == null)
                {
                    f.Options = FacetOptions.Default;
                }

                if (f.Ranges != null && f.Ranges.Count > 0)
                {
                    if (queryParser == null)
                    {
                        queryParser = new QueryParser();
                    }

                    facetRanges = new List <QueryExpression>();

                    foreach (var range in f.Ranges)
                    {
                        queryParser.Init(range);

                        if (queryParser.Expression(out var qr) == false)
                        {
                            throw new InvalidOperationException($"Could not parse the following range expression '{range}' from facet setup document: {setup.Id}");
                        }

                        facetRanges.Add(qr);
                    }
                }

                yield return(f, facetRanges);
            }
        }
コード例 #16
0
ファイル: RavenDB_1466.cs プロジェクト: ikvm/ravendb
        private void DoTest(IDocumentStore store)
        {
            new EmployeeByRegionAndSalary().Execute(store);

            using (var session = store.OpenSession(new SessionOptions {
                NoCaching = true
            }))
            {
                session.Store(new Employee
                {
                    Name   = "A",
                    Region = Region.North,
                    Salary = 20000
                });

                session.Store(new Employee
                {
                    Name   = "B",
                    Region = Region.North,
                    Salary = 30000
                });

                session.Store(new Employee
                {
                    Name   = "C",
                    Region = Region.South,
                    Salary = 25000
                });

                session.Store(new Employee
                {
                    Name   = "D",
                    Region = Region.East,
                    Salary = 45000
                });

                session.Store(new Employee
                {
                    Name   = "E",
                    Region = Region.East,
                    Salary = 55000
                });

                session.Store(new Employee
                {
                    Name   = "F",
                    Region = Region.West,
                    Salary = 15000
                });

                session.Store(new Employee
                {
                    Name   = "G",
                    Region = Region.West,
                    Salary = 85000
                });

                session.SaveChanges();

                Indexes.WaitForIndexing((DocumentStore)store);

                var facets = new List <RangeFacet>
                {
                    new RangeFacet <Employee>
                    {
                        Ranges =
                        {
                            x => x.Salary < 20000,
                            x => x.Salary >= 20000 && x.Salary < 40000,
                            x => x.Salary >= 40000 && x.Salary < 60000,
                            x => x.Salary >= 60000 && x.Salary < 80000,
                            x => x.Salary > 80000
                        }
                    }
                };

                using (var s = store.OpenSession())
                {
                    var facetSetupDoc = new FacetSetup {
                        Id = "facets/EmployeeFacets", RangeFacets = facets
                    };
                    s.Store(facetSetupDoc);
                    s.SaveChanges();
                }

                // by using setup document

                var northSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                            .Where(x => x.Region == Region.North).AggregateUsing("facets/EmployeeFacets").Execute();
                var southSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                            .Where(x => x.Region == Region.South).AggregateUsing("facets/EmployeeFacets").Execute();
                var eastSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                           .Where(x => x.Region == Region.East).AggregateUsing("facets/EmployeeFacets").Execute();
                var westSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                           .Where(x => x.Region == Region.West).AggregateUsing("facets/EmployeeFacets").Execute();

                AssertResults(northSalaryFacetQuery, southSalaryFacetQuery, eastSalaryFacetQuery, westSalaryFacetQuery);

                // by using list of facets

                northSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                        .Where(x => x.Region == Region.North).AggregateBy(facets).Execute();
                southSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                        .Where(x => x.Region == Region.South).AggregateBy(facets).Execute();
                eastSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                       .Where(x => x.Region == Region.East).AggregateBy(facets).Execute();
                westSalaryFacetQuery = session.Query <Employee, EmployeeByRegionAndSalary>()
                                       .Where(x => x.Region == Region.West).AggregateBy(facets).Execute();

                AssertResults(northSalaryFacetQuery, southSalaryFacetQuery, eastSalaryFacetQuery, westSalaryFacetQuery);

                // by using document query

                northSalaryFacetQuery = session.Advanced.DocumentQuery <Employee, EmployeeByRegionAndSalary>()
                                        .WhereEquals(x => x.Region, Region.North).AggregateBy(facets).Execute();
                southSalaryFacetQuery = session.Advanced.DocumentQuery <Employee, EmployeeByRegionAndSalary>()
                                        .WhereEquals(x => x.Region, Region.South).AggregateBy(facets).Execute();
                eastSalaryFacetQuery = session.Advanced.DocumentQuery <Employee, EmployeeByRegionAndSalary>()
                                       .WhereEquals(x => x.Region, Region.East).AggregateBy(facets).Execute();
                westSalaryFacetQuery = session.Advanced.DocumentQuery <Employee, EmployeeByRegionAndSalary>()
                                       .WhereEquals(x => x.Region, Region.West).AggregateBy(facets).Execute();

                AssertResults(northSalaryFacetQuery, southSalaryFacetQuery, eastSalaryFacetQuery, westSalaryFacetQuery);
            }
        }
コード例 #17
0
ファイル: FacetHits.cs プロジェクト: ikvm/ravendb
        public void CanSearchOnAllProperties()
        {
            using (var store = GetDocumentStore())
            {
                new Products_Stats().Execute(store);

                using (var session = store.OpenSession())
                {
                    for (int i = 0; i < 1000; i++)
                    {
                        var amount = i % 50 / 10f;
                        session.Store(
                            new Product
                        {
                            Category = i % 2 == 0 ? "Cat1" : "Cat2",
                            Name     = "Product " + i,
                            Price    = new Price {
                                Currency = "USD", Amount = amount
                            }
                        });
                    }

                    var facetSetup = new FacetSetup
                    {
                        Id     = "facets/StatsFacet",
                        Facets = new List <Facet>
                        {
                            new Facet
                            {
                                FieldName = "Category"
                            },
                        },
                        RangeFacets = new List <RangeFacet>()
                        {
                            new RangeFacet()
                            {
                                Ranges = new List <string>
                                {
                                    "Price <= 0",
                                    "Price BETWEEN 0.001 AND 0.999",
                                    "Price BETWEEN 0.999 AND 1.999",
                                    "Price >= 1.999"
                                }
                            }
                        }
                    };
                    session.Store(facetSetup);
                    session.SaveChanges();
                }

                Indexes.WaitForIndexing(store);

                using (var s = store.OpenSession())
                {
                    var query        = s.Query <Product>("Products/Stats");
                    var facetResults = query.AggregateUsing("facets/StatsFacet").Execute();

                    var priceFacet = facetResults["Price"];

                    foreach (var val in priceFacet.Values)
                    {
                        Assert.NotEqual(0, val.Count);
                    }
                }
            }
        }
コード例 #18
0
ファイル: FacetCountTest.cs プロジェクト: AndrewKL/ravendb
        public void TestFacetsCount()
        {
            using (var store = NewDocumentStore())
            {
                using (var session = store.OpenSession())
                {
                    // Create Facet for wod
                    var wodFacets = new WodFacets();
                    var wodSetup  = new FacetSetup()
                    {
                        Id     = wodFacets.FacetKey,
                        Facets = wodFacets.FacetList
                    };

                    session.Store(wodSetup);

                    // Create Wod's
                    #region ANGIE
                    // Wodinfo
                    var angie = new WodBase
                    {
                        Name          = "Angie",
                        Description   = "Complete all reps of each exercise before moving to the next.",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    angie.ExerciseList.Add("Pull-ups");
                    angie.ExerciseList.Add("Push-ups");
                    angie.ExerciseList.Add("Sit-ups");
                    angie.ExerciseList.Add("Air Squat");

                    // Save wod
                    session.Store(angie, "WodBases/1");
                    #endregion

                    #region BARBARA
                    // Wodinfo
                    var barbara = new WodBase
                    {
                        Name          = "Barbara",
                        Description   = "Time each round. Rest precisely three minutes between each round.",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    barbara.ExerciseList.Add("Pull-ups");
                    barbara.ExerciseList.Add("Push-ups");
                    barbara.ExerciseList.Add("Sit-ups");
                    barbara.ExerciseList.Add("Air Squat");
                    barbara.ExerciseList.Add("RestPeriod");

                    // Save wod
                    session.Store(barbara, "WodBases/2");
                    #endregion

                    #region CHELSEA
                    // Wodinfo
                    var chelsea = new WodBase
                    {
                        Name        = "Chelsea",
                        Description = "Set up before a clock, and every minute on the minute perform 5 pull-ups, " +
                                      "10 push-ups, and 15 squats. Can you continue for thirty minutes? Twenty minutes? How about 10? " +
                                      "Post results to comments. If you fall behind the clock keep going for thirty minutes and see how many rounds you can complete. " +
                                      "If you've finished the workout before this time add +1 to each exercise, i.e., 6 pull-ups, 11 push-ups, and 16 squats each minute, " +
                                      "and see if you can go the full thirty minutes.",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.MinuteWod,
                    };

                    // Add Round and Exercises
                    chelsea.ExerciseList.Add("Pull-ups");
                    chelsea.ExerciseList.Add("Push-ups");
                    chelsea.ExerciseList.Add("Air Squat");

                    // Save wod
                    session.Store(chelsea, "WodBases/3");
                    #endregion

                    #region CINDY
                    // Wodinfo
                    var cindy = new WodBase
                    {
                        Name          = "Cindy",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.AmrapWod,
                    };

                    // Add Round and Exercises
                    cindy.ExerciseList.Add("Pull-ups");
                    cindy.ExerciseList.Add("Push-ups");
                    cindy.ExerciseList.Add("Air Squat");

                    // Save wod
                    session.Store(cindy, "WodBases/4");
                    #endregion

                    #region DIANE
                    // Wodinfo
                    var diane = new WodBase
                    {
                        Name          = "Diane",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    diane.ExerciseList.Add("Deadlift");
                    diane.ExerciseList.Add("Handstand Push-ups");

                    // Save wod
                    session.Store(diane, "WodBases/5");
                    #endregion

                    #region ELISABETH
                    // Wodinfo
                    var elisabeth = new WodBase
                    {
                        Name          = "Elisabeth",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    elisabeth.ExerciseList.Add("Clean");
                    elisabeth.ExerciseList.Add("Ring Dips");

                    // Save wod
                    session.Store(elisabeth, "WodBases/6");
                    #endregion

                    #region FRAN
                    // Wodinfo
                    var fran = new WodBase
                    {
                        Name          = "Fran",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    fran.ExerciseList.Add("Thrusters");
                    fran.ExerciseList.Add("Pull-ups");

                    // Save wod
                    session.Store(fran, "WodBases/7");
                    #endregion

                    #region GRACE
                    // Wodinfo
                    var grace = new WodBase
                    {
                        Name          = "Grace",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    grace.ExerciseList.Add("Clean & Jerk");

                    // Save wod
                    session.Store(grace, "WodBases/8");
                    #endregion

                    #region HELEN
                    // Wodinfo
                    var helen = new WodBase
                    {
                        Name          = "Helen",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    helen.ExerciseList.Add("Run 400 m");
                    helen.ExerciseList.Add("Kettlebell Swings");
                    helen.ExerciseList.Add("Pull-ups");

                    // Save wod
                    session.Store(helen, "WodBases/9");
                    #endregion

                    #region ISABEL
                    // Wodinfo
                    var isabel = new WodBase
                    {
                        Name          = "Isabel",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    isabel.ExerciseList.Add("Snatch");

                    // Save wod
                    session.Store(isabel, "WodBases/10");
                    #endregion

                    #region JACKIE
                    // Wodinfo
                    var jackie = new WodBase
                    {
                        Name          = "Jackie",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    jackie.ExerciseList.Add("Row 1000 m");
                    jackie.ExerciseList.Add("Thrusters");
                    jackie.ExerciseList.Add("Pull-ups");

                    // Save wod
                    session.Store(jackie, "WodBases/11");
                    #endregion

                    #region KAREN
                    // Wodinfo
                    var karen = new WodBase
                    {
                        Name          = "Karen",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    karen.ExerciseList.Add("Wall-ball Shots");

                    // Save wod
                    session.Store(karen, "WodBases/12");
                    #endregion

                    #region LINDA
                    // Wodinfo
                    var linda = new WodBase
                    {
                        Name          = "Linda",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    linda.ExerciseList.Add("Deadlift");
                    linda.ExerciseList.Add("Bench Press");
                    linda.ExerciseList.Add("Clean");

                    // Save wod
                    session.Store(linda, "WodBases/13");
                    #endregion

                    #region MARY
                    // Wodinfo
                    var mary = new WodBase
                    {
                        Name          = "Mary",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.AmrapWod,
                    };

                    // Add Round and Exercises
                    mary.ExerciseList.Add("Handstand Push-ups");
                    mary.ExerciseList.Add("Pistols");
                    mary.ExerciseList.Add("Pull-ups");

                    // Save wod
                    session.Store(mary, "WodBases/14");
                    #endregion

                    #region NANCY
                    // Wodinfo
                    var nancy = new WodBase
                    {
                        Name          = "Nancy",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    nancy.ExerciseList.Add("Run 400 m");
                    nancy.ExerciseList.Add("Overhead Squat");

                    // Save wod
                    session.Store(nancy, "WodBases/15");
                    #endregion

                    #region AMANDA
                    // Wodinfo
                    var amanda = new WodBase
                    {
                        Name          = "Amanda",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    amanda.ExerciseList.Add("Muscle-ups");
                    amanda.ExerciseList.Add("Snatch");

                    // Save wod
                    session.Store(amanda, "WodBases/16");
                    #endregion

                    #region ANNIE
                    // Wodinfo
                    var annie = new WodBase
                    {
                        Name          = "Annie",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    annie.ExerciseList.Add("Double-unders");
                    annie.ExerciseList.Add("Sit-ups");

                    // Save wod
                    session.Store(annie, "WodBases/17");
                    #endregion

                    #region EVA
                    // Wodinfo
                    var eva = new WodBase
                    {
                        Name          = "Eva",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    eva.ExerciseList.Add("Run 800 m");
                    eva.ExerciseList.Add("Kettlebell Swings");
                    eva.ExerciseList.Add("Pull-ups");
                    // Save wod
                    session.Store(eva, "WodBases/18");
                    #endregion

                    #region KELLY
                    // Wodinfo
                    var kelly = new WodBase
                    {
                        Name          = "Kelly",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.TimeWod
                    };

                    // Add Round and Exercises
                    kelly.ExerciseList.Add("Run 400 m");
                    kelly.ExerciseList.Add("Box Jump");
                    kelly.ExerciseList.Add("Wall-ball Shots");

                    // Save wod
                    session.Store(kelly, "WodBases/19");
                    #endregion

                    #region LYNNE
                    // Wodinfo
                    var lynne = new WodBase
                    {
                        Name          = "Lynne",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.MaxWod
                    };

                    // Add Round and Exercises
                    lynne.ExerciseList.Add("Bench Press");
                    lynne.ExerciseList.Add("Pull-ups");
                    // Save wod
                    session.Store(lynne, "WodBases/20");
                    #endregion

                    #region NICOLE
                    // Wodinfo
                    var nicole = new WodBase
                    {
                        Name          = "Nicole",
                        Description   = "As many rounds as possible in 20 minutes, Note number of pull-ups completed for each round.",
                        BenchmarkType = BenchmarkType.Girls,
                        WodType       = WodType.MaxWod,
                    };

                    // Add Round and Exercises
                    nicole.ExerciseList.Add("Run 400 m");
                    nicole.ExerciseList.Add("Pull-ups");
                    // Save wod
                    session.Store(nicole, "WodBases/21");
                    #endregion

                    session.SaveChanges();
                }

                // Create index
                new Wod_Search().Execute(store);

                for (int i = 0; i < 5; i++)
                {
                    using (var session = store.OpenSession())
                    {
                        RavenQueryStatistics stats;

                        var query = session.Advanced.LuceneQuery <WodBase, Wod_Search>()
                                    .WaitForNonStaleResults()
                                    .Statistics(out stats)
                                    .SelectFields <WodsProjection>();

                        query.AndAlso().WhereEquals("ExerciseList", "Pull-ups");

                        var wods = query.ToList();

                        var facets = session.Advanced.DocumentStore.DatabaseCommands.GetFacets("Wod/Search",
                                                                                               new IndexQuery
                        {
                            Query = query.ToString()
                        },
                                                                                               "Facets/WodFacets");

                        var pullupsCount = facets.Results["ExerciseList"].Values.First(o => o.Range == "pull-ups").Hits;

                        Assert.Equal(11, wods.Count);
                        Assert.Equal(11, pullupsCount);
                    }
                }
            }
        }
コード例 #19
0
        public void FacetSetupDocument_ShouldNotUseParameters()
        {
            using (var store = GetDocumentStore())
            {
                new FooIndex().Execute(store);

                var now          = DateTime.Now;
                var oneYearAgo   = DateTime.SpecifyKind(now - TimeSpan.FromDays(365), DateTimeKind.Unspecified);
                var sixMonthsAgo = DateTime.SpecifyKind(now - TimeSpan.FromDays(180), DateTimeKind.Unspecified);

                StoreSampleData(store, now);
                WaitForIndexing(store);

                using (var s = store.OpenSession())
                {
                    var facets = new List <RangeFacet>
                    {
                        new RangeFacet <Foo>
                        {
                            Ranges =
                            {
                                c => c.DateIn < now - TimeSpan.FromDays(365),
                                c => c.DateIn >= now - TimeSpan.FromDays(365) && c.DateIn < now - TimeSpan.FromDays(180),
                                c => c.DateIn >= now - TimeSpan.FromDays(180)
                            }
                        }
                    };

                    var facetSetupDoc = new FacetSetup {
                        Id = "facets/FooFacets", RangeFacets = facets
                    };
                    s.Store(facetSetupDoc);
                    s.SaveChanges();

                    var rangeFacet = facetSetupDoc.RangeFacets[0];

                    Assert.Equal($"DateIn < '{oneYearAgo:o}'", rangeFacet.Ranges[0]);
                    Assert.Equal($"DateIn >= '{oneYearAgo:o}' and DateIn < '{sixMonthsAgo:o}'", rangeFacet.Ranges[1]);
                    Assert.Equal($"DateIn >= '{sixMonthsAgo:o}'", rangeFacet.Ranges[2]);
                }

                using (var session = store.OpenSession())
                {
                    var query = session.Query <Foo, FooIndex>()
                                .Where(x => x.DateIn != null && x.Age < 90)
                                .AggregateUsing("facets/FooFacets");

                    Assert.Equal("from index 'FooIndex' where (DateIn != $p0 and Age < $p1) " +
                                 "select facet(id('facets/FooFacets'))"
                                 , query.ToString());

                    var facetResult = query.Execute();

                    AssertResults(facetResult, "DateIn", now);
                }

                using (var session = store.OpenSession())
                {
                    var facets = session.Load <FacetSetup>("facets/FooFacets").RangeFacets;

                    var query = session.Query <Foo, FooIndex>()
                                .Where(x => x.DateIn != null && x.Age < 90)
                                .AggregateBy(facets);

                    Assert.Equal("from index 'FooIndex' where (DateIn != $p0 and Age < $p1) " +
                                 $"select facet(DateIn < '{oneYearAgo:o}', DateIn >= '{oneYearAgo:o}' and DateIn < '{sixMonthsAgo:o}', DateIn >= '{sixMonthsAgo:o}')"
                                 , query.ToString());

                    var facetResult = query.Execute();

                    AssertResults(facetResult, "DateIn", now);
                }
            }
        }
コード例 #20
0
        public IActionResult Run(RunParams runParams)
        {
            int range1 = runParams.Range1 ?? 25;
            int range2 = runParams.Range2 ?? 50;
            int range3 = runParams.Range3 ?? 100;

            List <MyFacetResult> facetsResults = new List <MyFacetResult>();

            #region Demo
            Dictionary <string, FacetResult> queryResults;

            using (IDocumentSession session = DocumentStoreHolder.Store.OpenSession())
            {
                #region Step_2
                FacetSetup facetSetup = new FacetSetup
                {
                    Id = "myFacetSetupDocumentID",

                    Facets = new List <Facet>
                    {
                        new Facet()
                        {
                            FieldName = "Category"
                        }
                    },
                    RangeFacets = new List <RangeFacet>
                    {
                        new RangeFacet <Product>
                        {
                            Ranges =
                            {
                                product => product.PricePerUnit < range1,
                                product => product.PricePerUnit >= range1 && product.PricePerUnit < range2,
                                product => product.PricePerUnit >= range2 && product.PricePerUnit < range3,
                                product => product.PricePerUnit >= range3
                            }
                        }
                    }
                };
                #endregion

                #region Step_3
                session.Store(facetSetup);
                session.SaveChanges();
                #endregion

                #region Step_4
                queryResults = session.Query <Product, Products_ByCategoryAndPrice>()
                               .AggregateUsing("myFacetSetupDocumentID")
                               .Execute();
                #endregion
            }
            #endregion

            foreach (var result in queryResults)
            {
                var facetName = result.Value.Name;

                foreach (var item in result.Value.Values)
                {
                    facetsResults.Add(new MyFacetResult()
                    {
                        FacetName  = facetName,  // i.e. PricePerUnit
                        FacetRange = item.Range, // i.e. PricePerUnit < 50
                        FacetCount = item.Count
                    });
                }
            }

            return(Ok(facetsResults));
        }