public void TestValueIndexMultipleValues()
        {
            CreateDocument(1, 2, 3, 4, 5);
            CreateDocument(6, 7, 8, 9, 10);

            var aggregateModel = new AggregateModel();

            aggregateModel.RegisterModel();
            var input         = AggregateModel.CreateInput("numbers");
            var sumPrediction = Function.Prediction(aggregateModel.Name, input).Property("sum");
            var avgPrediction = Function.Prediction(aggregateModel.Name, input).Property("avg");

            var sumIndex = IndexBuilder.ValueIndex(ValueIndexItem.Expression(sumPrediction));

            Db.CreateIndex("SumIndex", sumIndex);
            var avgIndex = IndexBuilder.ValueIndex(ValueIndexItem.Expression(avgPrediction));

            Db.CreateIndex("AvgIndex", avgIndex);

            using (var q = QueryBuilder.Select(SelectResult.Expression(sumPrediction).As("s"),
                                               SelectResult.Expression(avgPrediction).As("a"))
                           .From(DataSource.Database(Db))
                           .Where(sumPrediction.LessThanOrEqualTo(Expression.Int(15)).Or(avgPrediction.EqualTo(Expression.Int(8))))) {
                var explain = q.Explain();
                explain.IndexOf("USING INDEX SumIndex").Should().NotBe(-1, "because the sum index should be used");
                explain.IndexOf("USING INDEX AvgIndex").Should().NotBe(-1, "because the average index should be used");

                var numRows = VerifyQuery(q, (n, r) =>
                {
                    r.Should().Match <Result>(x => x.GetLong(0) == 15 || x.GetLong(1) == 8);
                });
                numRows.Should().Be(2);
            }
        }
예제 #2
0
        public void TestCreateIndex()
        {
            Db.GetIndexes().Should().BeEmpty();

            var fName = Expression.Property("firstName");
            var lName = Expression.Property("lastName");

            var fNameItem = ValueIndexItem.Property("firstName");
            var lNameItem = ValueIndexItem.Expression(lName);

            var index1 = IndexBuilder.ValueIndex(fNameItem, lNameItem);

            Db.CreateIndex("index1", index1);

            var detailItem = FullTextIndexItem.Property("detail");
            var index2     = IndexBuilder.FullTextIndex(detailItem);

            Db.CreateIndex("index2", index2);

            var detailItem2 = FullTextIndexItem.Property("es-detail");
            var index3      = IndexBuilder.FullTextIndex(detailItem2).IgnoreAccents(true).SetLanguage("es");

            Db.CreateIndex("index3", index3);

            Db.GetIndexes().ShouldBeEquivalentTo(new[] { "index1", "index2", "index3" });
        }
        public void TestValueIndex()
        {
            CreateDocument(1, 2, 3, 4, 5);
            CreateDocument(6, 7, 8, 9, 10);

            var aggregateModel = new AggregateModel();

            aggregateModel.RegisterModel();
            var input         = AggregateModel.CreateInput("numbers");
            var sumPrediction = Function.Prediction(aggregateModel.Name, input).Property("sum");

            var index = IndexBuilder.ValueIndex(ValueIndexItem.Expression(sumPrediction));

            Db.CreateIndex("SumIndex", index);

            using (var q = QueryBuilder.Select(SelectResult.Property("numbers"),
                                               SelectResult.Expression(sumPrediction))
                           .From(DataSource.Database(Db))
                           .Where(sumPrediction.EqualTo(Expression.Int(15)))) {
                q.Explain().IndexOf("USING INDEX SumIndex").Should()
                .NotBe(-1, "because the query should make use of the index");
                var numRows = VerifyQuery(q, (n, r) =>
                {
                    var numbers = r.GetArray(0).Cast <long>().ToList();
                    var sum     = r.GetLong(1);
                    sum.Should().Be(numbers.Sum());
                });

                numRows.Should().Be(1);
                aggregateModel.NumberOfCalls.Should().Be(2,
                                                         "because the value should be cached and not call the prediction function again");
            }
        }
        public void CreateView(string fieldName, string indexName)
        {
            CheckOpenedConnection();

            var viewName = CollectionName + "-" + fieldName; // view name = collectionName-fieldName

            database.CreateIndex(viewName, IndexBuilder.ValueIndex(items: ValueIndexItem.Property(fieldName)));
        }
예제 #5
0
        public void TestCreateSameIndexTwice()
        {
            var item  = ValueIndexItem.Expression(Expression.Property("firstName"));
            var index = IndexBuilder.ValueIndex(item);

            Db.CreateIndex("myindex", index);
            Db.CreateIndex("myindex", index);

            Db.GetIndexes().ShouldBeEquivalentTo(new[] { "myindex" });
        }
예제 #6
0
        private void CreateArtistsIndex()
        {
            _indexArtistsBench.Start();
            var collation = Collation.Unicode().IgnoreCase(true).IgnoreAccents(true);
            var artist    = Expression.Property("Artist").Collate(collation);
            var comp      = Expression.Property("Compilation");
            var index     = Index.ValueIndex().On(ValueIndexItem.Expression(artist), ValueIndexItem.Expression(comp));

            Db.CreateIndex("byArtist", index);
            _indexArtistsBench.Stop();
        }
예제 #7
0
        private static void CreateIndex()
        {
            var db = _Database;

            // # tag::query-index[]
            // For value types, this is optional but provides performance enhancements
            var index = IndexBuilder.ValueIndex(
                ValueIndexItem.Expression(Expression.Property("type")),
                ValueIndexItem.Expression(Expression.Property("name")));

            db.CreateIndex("TypeNameIndex", index);
            // # end::query-index[]
        }
예제 #8
0
        private void CreateDatabaseIndexes(Database db)
        {
            // For searches on type property
            db.CreateIndex("type", IndexBuilder.ValueIndex(ValueIndexItem.Expression(Expression.Property("type"))));

            // For full text searches on airports and hotels
            db.CreateIndex("airportName",
                           IndexBuilder.FullTextIndex(FullTextIndexItem.Property("airportname")));
            db.CreateIndex("description",
                           IndexBuilder.FullTextIndex(FullTextIndexItem.Property("description")));
            db.CreateIndex("name",
                           IndexBuilder.FullTextIndex(FullTextIndexItem.Property("name")));
        }
        public List <string> Create(Database database)
        {
            List <string> indexes = database.GetIndexes().ToList <string>();

            if (!indexes.Contains("TableI2"))
            {
                database.CreateIndex("TableI2", Index.ValueIndex(ValueIndexItem.Expression(Expression.Property("table"))));
            }

            if (!indexes.Contains("VilleI1"))
            {
                database.CreateIndex("VilleI1", Index.ValueIndex(ValueIndexItem.Expression(Expression.Property("ville"))));
            }


            return(database.GetIndexes().ToList <string>());
        }
        private static void UsePredictiveModel()
        {
            using (var db = new Database("mydb")) {
                // tag::register-model[]
                var model = new ImageClassifierModel();
                Database.Prediction.RegisterModel("ImageClassifier", model);
                // end::register-model[]

                // tag::predictive-query-value-index[]
                var index = IndexBuilder.ValueIndex(ValueIndexItem.Property("label"));
                db.CreateIndex("value-index-image-classifier", index);
                // end::predictive-query-value-index[]

                // tag::unregister-model[]
                Database.Prediction.UnregisterModel("ImageClassifier");
                // end::unregister-model[]
            }
        }
        private void SetupQuery()
        {
            _db.CreateIndex("byName", IndexBuilder.ValueIndex(ValueIndexItem.Expression(Expression.Property("name"))));

            _filteredQuery = QueryBuilder.Select(SelectResult.Expression(Meta.ID),
                                                 SelectResult.Expression(Expression.Property("name")))
                             .From(DataSource.Database(_db))
                             .Where(Expression.Property("name")
                                    .Like(Expression.Parameter("searchText"))
                                    .And(Expression.Property("type").EqualTo(Expression.String("task-list"))))
                             .OrderBy(Ordering.Property("name"));

            _fullQuery = QueryBuilder.Select(SelectResult.Expression(Meta.ID),
                                             SelectResult.Expression(Expression.Property("name")))
                         .From(DataSource.Database(_db))
                         .Where(Expression.Property("name")
                                .NotNullOrMissing()
                                .And(Expression.Property("type").EqualTo(Expression.String("task-list"))))
                         .OrderBy(Ordering.Property("name"));

            _incompleteQuery = QueryBuilder.Select(SelectResult.Expression(Expression.Property("taskList.id")),
                                                   SelectResult.Expression(Function.Count(Expression.All())))
                               .From(DataSource.Database(_db))
                               .Where(Expression.Property("type").EqualTo(Expression.String(TasksModel.TaskType))
                                      .And(Expression.Property("complete").EqualTo(Expression.Boolean(false))))
                               .GroupBy(Expression.Property("taskList.id"));

            _incompleteQuery.AddChangeListener((sender, args) =>
            {
                _incompleteCount.Clear();
                foreach (var result in args.Results)
                {
                    _incompleteCount[result.GetString(0)] = result.GetInt(1);
                }

                foreach (var row in TasksList)
                {
                    row.IncompleteCount = _incompleteCount.ContainsKey(row.DocumentID)
                        ? _incompleteCount[row.DocumentID]
                        : 0;
                }
            });
        }
        public void TestValueIndexCompoundValues()
        {
            CreateDocument(1, 2, 3, 4, 5);
            CreateDocument(6, 7, 8, 9, 10);

            var aggregateModel = new AggregateModel();

            aggregateModel.RegisterModel();
            var input = Expression.Dictionary(new Dictionary <string, object>
            {
                ["numbers"] = Expression.Property("numbers")
            });
            var sumPrediction = Function.Prediction(aggregateModel.Name, input).Property("sum");
            var avgPrediction = Function.Prediction(aggregateModel.Name, input).Property("avg");

            var index = IndexBuilder.ValueIndex(ValueIndexItem.Expression(sumPrediction),
                                                ValueIndexItem.Expression(avgPrediction));

            Db.CreateIndex("SumAvgIndex", index);

            aggregateModel.AllowCalls = false;

            using (var q = QueryBuilder.Select(SelectResult.Expression(sumPrediction).As("s"),
                                               SelectResult.Expression(avgPrediction).As("a"))
                           .From(DataSource.Database(Db))
                           .Where(sumPrediction.EqualTo(Expression.Int(15)).And(avgPrediction.EqualTo(Expression.Int(3))))) {
                var explain = q.Explain();
                explain.IndexOf("USING INDEX SumAvgIndex").Should().NotBe(-1, "because the sum index should be used");

                var numRows = VerifyQuery(q, (n, r) =>
                {
                    r.GetLong(0).Should().Be(15);
                    r.GetLong(1).Should().Be(3);
                });
                numRows.Should().Be(1);
                aggregateModel.NumberOfCalls.Should().Be(4);
            }
        }
예제 #13
0
        public void TestCreateSameNameIndexes()
        {
            var fName = Expression.Property("firstName");
            var lName = Expression.Property("lastName");

            var fNameItem  = ValueIndexItem.Expression(fName);
            var fNameIndex = IndexBuilder.ValueIndex(fNameItem);

            Db.CreateIndex("myindex", fNameIndex);

            var lNameItem  = ValueIndexItem.Expression(lName);
            var lNameIndex = IndexBuilder.ValueIndex(lNameItem);

            Db.CreateIndex("myindex", lNameIndex);

            Db.GetIndexes().ShouldBeEquivalentTo(new[] { "myindex" }, "because lNameIndex should overwrite fNameIndex");

            var detailItem  = FullTextIndexItem.Property("detail");
            var detailIndex = IndexBuilder.FullTextIndex(detailItem);

            Db.CreateIndex("myindex", detailIndex);

            Db.GetIndexes().ShouldBeEquivalentTo(new[] { "myindex" }, "because detailIndex should overwrite lNameIndex");
        }
예제 #14
0
        public static IEnumerable <BenchmarkResult> Start()
        {
            var databaseName = "Test";

            Console.WriteLine($"--- Benchmark Start ---");
            var stopWatch = new Stopwatch();

            // STEP 1: DELETE DB
            var database = new Database(databaseName);

            database.Delete();
            database.Close();
            var deleteDBResult = new BenchmarkResult("Delete DB", stopWatch.Elapsed);

            Log(deleteDBResult);
            stopWatch.Restart();

            // STEP 2: NEW DB
            stopWatch.Start();
            database = new Database(databaseName);
            var newDBResult = new BenchmarkResult("Create New DB", stopWatch.Elapsed);

            Log(newDBResult);
            stopWatch.Restart();

            // STEP 3: ENSURE INDEXES
            var indexes = new HashSet <string>
            {
                ICouchbaseDocumentExtensions.JsonProperties.CouchbaseId,
                ICouchbaseDocumentExtensions.JsonProperties.CouchbaseType,
                IPerishableDataExtensions.JsonProperties.LastUpdated,
                IPerishableDataExtensions.JsonProperties.ExpirationDate,
                nameof(PersonObfuscated.EntryGuid),
                nameof(PersonObfuscated.FirstName),
                nameof(PersonObfuscated.LastName),
                nameof(PersonObfuscated.DisplayName),
                nameof(PersonObfuscated.SiteName),
                nameof(PersonObfuscated.DepartmentName),
                nameof(PersonObfuscated.TeamName),
            };

            foreach (var index in indexes)
            {
                var indexName = $"ValueIndex_{index}";
                database.CreateIndex(indexName, IndexBuilder.ValueIndex(ValueIndexItem.Expression(Expression.Property(indexName))));
            }
            var createIndexes = new BenchmarkResult($"Create {indexes.Count} Indexes", stopWatch.Elapsed);

            Log(createIndexes);
            stopWatch.Restart();


            // STEP 4: CREATE MODELS
            var numberOfDocuments = 11000;

            var entryType        = "entryType";
            var firstName        = "John";
            var lastName         = "Smith";
            var maidenName       = "maidenName";
            var displayName      = "John Smith";
            var organizationName = "John Smith";
            var locationGuid     = Guid.NewGuid();
            var siteGuid         = Guid.NewGuid();
            var siteName         = "Main Site";
            var userStatus       = "Regular User";
            var departmentName   = "Information Technology > Apps";
            var residenceArea    = "Anytown - PA (USA)";
            var workAreaName     = "Office 1";
            var teamName         = "Blue Team";
            var contacts         = new List <Contact>
            {
                new Contact(ContactType.Work, ContactMethod.Phone, "12345"),
                new Contact(ContactType.Work, ContactMethod.Fax, "12345"),
                new Contact(ContactType.Personal, ContactMethod.Mobile, "+1 8885551212"),
                new Contact(ContactType.Personal, ContactMethod.Email, "*****@*****.**"),
                new Contact(ContactType.Work, ContactMethod.Email, "*****@*****.**")
            };
            var    spouseEntryGuid        = Guid.NewGuid();
            var    personPrimaryPhotoGuid = Guid.NewGuid();
            string primaryPhotoUrl        = "https://myphotoserver.blob.core.windows.net/primaryphotos/8891be56-47c6-4546-8954-9116743f2efc?sv=2018-03-28&sr=b&sig=vJTpHXMYefdVrehAo%2FJiDHNnq60rMlwk3d4QHZQSRmk%3D&se=2019-11-15T23%3A00%3A48Z&sp=r";
            var    emergencyContactGuids  = new List <Guid> {
            };
            var lastUpdated    = DateTimeOffset.Now;
            var expirationDate = DateTimeOffset.Now;

            var models = new PersonObfuscated[numberOfDocuments];

            for (int i = 0; i < numberOfDocuments; i++)
            {
                var entryGuid = Guid.NewGuid();

                var person = new PersonObfuscated(
                    entryGuid,
                    entryType,
                    firstName,
                    lastName,
                    maidenName,
                    displayName,
                    organizationName,
                    locationGuid,
                    siteGuid,
                    siteName,
                    userStatus,
                    departmentName,
                    residenceArea,
                    workAreaName,
                    teamName,
                    contacts,
                    spouseEntryGuid,
                    personPrimaryPhotoGuid,
                    primaryPhotoUrl,
                    emergencyContactGuids,
                    lastUpdated,
                    expirationDate);

                models[i] = person;
            }
            var createModels = new BenchmarkResult($"Create {models.Length} Models", stopWatch.Elapsed);

            Log(createModels);
            stopWatch.Restart();

            // STEP 5: CREATE MUTABLE DOCUMENTS
            var documents       = models.AsParallel().Select(model => model.ToMutableDocument()).ToArray();
            var createDocuments = new BenchmarkResult($"Create {documents.Length} Documents", stopWatch.Elapsed);

            Log(createDocuments);
            stopWatch.Restart();

            // STEP 6: INSERT INTO COUCHBASE
            database.InBatch(() =>
            {
                foreach (var doc in documents)
                {
                    database.Save(doc);
                }
            });
            var batchSaveDocuments = new BenchmarkResult($"Batch Save {documents.Length} Documents", stopWatch.Elapsed);

            Log(batchSaveDocuments);
            stopWatch.Restart();

            database.Close();

            Console.WriteLine($"--- Benchmark End ---");

            return(new BenchmarkResult[]
            {
                deleteDBResult,
                newDBResult,
                createIndexes,
                createModels,
                createDocuments,
                batchSaveDocuments
            });
        }