Пример #1
0
        private IEnumerable <SubFingerprintData> ReadSubFingerprints(int[] hashes, int thresholdVotes,
                                                                     IDictionary <string, string> yesMetaFieldsFilters,
                                                                     IDictionary <string, string> noMetaFieldsFilters,
                                                                     ReadOnlyTransaction tx)
        {
            var subFingeprintIds = GetSubFingerprintMatches(hashes, thresholdVotes, tx);
            var subFingerprints  = subFingeprintIds.Select(tx.GetSubFingerprint);

            if (yesMetaFieldsFilters.Count > 0 || noMetaFieldsFilters.Count > 0)
            {
                return(subFingerprints
                       .GroupBy(subFingerprint => subFingerprint.TrackReference)
                       .Where(group =>
                {
                    var trackData = tx.GetTrackByReference(group.Key);
                    var result = metaFieldsFilter.PassesFilters(trackData.MetaFields, yesMetaFieldsFilters, noMetaFieldsFilters);
                    return result;
                })
                       .SelectMany(x => x.ToList())
                       .Select(e => e.ToSubFingerprintData()));
            }

            return(subFingerprints
                   .Select(e => e.ToSubFingerprintData()));
        }
        private IEnumerable <SubFingerprintData> ReadSubFingerprints(int[] hashes, int thresholdVotes,
                                                                     IDictionary <string, string> metaFieldsFilter,
                                                                     ReadOnlyTransaction tx)
        {
            var subFingeprintIds = GetSubFingerprintMatches(hashes, thresholdVotes, tx);
            var subFingerprints  = subFingeprintIds.Select(tx.GetSubFingerprint);

            if (metaFieldsFilter.Count > 0)
            {
                return(subFingerprints
                       .GroupBy(subFingerprint => subFingerprint.TrackReference)
                       .Where(group =>
                {
                    var trackData = tx.GetTrackByReference(group.Key);
                    return trackData.MetaFields
                    .Join(metaFieldsFilter, x => x.Key, x => x.Key, (a, b) => a.Value.Equals(b.Value))
                    .Any(x => x);
                })
                       .SelectMany(x => x.ToList())
                       .Select(e => e.ToSubFingerprintData()));
            }

            return(subFingerprints
                   .Select(e => e.ToSubFingerprintData()));
        }
    void SearchDatabase()
    {
        ReadOnlyTransaction t = db.StartReadWriteTransaction();

        // Find all patients with age > 50 which are diagnosed flu in last September
        foreach (Item patient in t.Find(Predicate.Value("age") > 50
                                        & Predicate.Value("diagnosis").In(Predicate.Value("date").Between("2010-09-01", "2010-09-30")
                                                                          & Predicate.Value("disease").In(Predicate.Value("name") == "flu"))))
        {
            Console.WriteLine("Patient " + patient.GetString("name") + ", age " + patient.GetNumber("age"));
        }

        // Print list of diseases with high temperature symptom ordered by name
        foreach (Item disease in t.Find(Predicate.Value("class") == "disease"
                                        & Predicate.Value("symptoms") == "high temperature",
                                        new OrderBy("name")))
        {
            Console.WriteLine("Diseas " + disease.GetString("name"));
            Object symptoms = disease.GetAttribute("symptoms");
            if (symptoms is String)
            {
                Console.WriteLine("Symptom: " + symptoms);
            }
            else if (symptoms is String[])
            {
                Console.WriteLine("Symptoms: ");
                String[] ss = (String[])symptoms;
                for (int i = 0; i < ss.Length; i++)
                {
                    Console.WriteLine("{0}: {1}", i, ss[i]);
                }
            }
        }
        t.Commit();
    }
Пример #4
0
        private void LoadLastTermAndIndex(ReadOnlyTransaction tx)
        {
            using (var c = _logDb.OpenReadOnlyCursor(tx))
            {
                var k = LogKey;
                StoredLogEntryHeader value = new StoredLogEntryHeader()
                {
                    Index = long.MaxValue
                };

                if (c.TryFindDup(Lookup.LE, ref k, ref value))
                {
                    this.LastIndex     = value.Index;
                    this.LastEntryTerm = value.Term;
                }
            }
        }
Пример #5
0
        public static unsafe bool TryGet(this ReadOnlyTransaction tx, Database db, Bufferable key, out Bufferable value)
        {
            value = default;
            fixed(byte *keyPtr = &key.Buffer[0])
            {
                var          keydb   = new DirectBuffer(key.Buffer.Length, keyPtr);
                DirectBuffer valuedb = default;
                var          success = db.TryGet(tx, ref keydb, out valuedb);

                if (success)
                {
                    value = new Bufferable(valuedb.Span.ToArray());
                }

                return(success);
            }
        }
    void SearchDatabase()
    {
        ReadOnlyTransaction t = db.StartReadWriteTransaction();

        DateTime start  = DateTime.Now;
        int      nBooks = nAuthors * nBooksPerAutor / nCoauthors;

        for (int i = 0, j = 0; i < nBooks; i++)
        {
            // find authors of the book
            Item[] authors = Enumerable.ToArray(t.Find(Predicate.Value("-author").In(Predicate.Value("title") == GenerateTitle(i))));
            Debug.Assert(authors.Length == nCoauthors);
            for (int k = 0; k < nCoauthors; k++)
            {
                Debug.Assert(authors[k].GetString("name") == GenerateName(j++ % nAuthors));
            }
        }
        for (int i = 0; i < nAuthors; i++)
        {
            // find book written by this author
            Item[] books = Enumerable.ToArray(t.Find(Predicate.Value("author").In(Predicate.Value("name") == GenerateName(i))));
            Debug.Assert(books.Length == nBooksPerAutor);
        }
        Console.WriteLine("Elapsed time for searching database " + (DateTime.Now - start));

        start = DateTime.Now;
        for (int i = 0, mask = 0; i < nBooks; i++, mask = ~mask)
        {
            // find book using full text search part of book title and ISDN
            FullTextSearchResult result = t.FullTextSearch(GenerateWord(i ^ mask) + " " + GenerateISBN(i), MAX_FULL_TEXT_SEARCH_RESULTS, MAX_FULL_TEXT_SEARCH_TIME);
            Debug.Assert(result.Hits.Length == 1);
        }
        for (int i = 0, mask = 0; i < nAuthors; i++, mask = ~mask)
        {
            // find authors using full text search of author's name
            FullTextSearchResult result = t.FullTextSearch(GenerateName(i ^ mask), MAX_FULL_TEXT_SEARCH_RESULTS, MAX_FULL_TEXT_SEARCH_TIME);
            Debug.Assert(result.Hits.Length == 1);
        }
        Console.WriteLine("Elapsed time for full text search " + (DateTime.Now - start));

        t.Commit();
    }
Пример #7
0
        public static unsafe bool TryGetDuplicate(this ReadOnlyTransaction tx, Database db, Bufferable key, ref Bufferable value)
        {
            using (var c = db.OpenReadOnlyCursor(tx))
            {
                fixed(byte *keyPtr = &key.Buffer[0], valPtr = &value.Buffer[0])
                {
                    var keydb   = new DirectBuffer(key.Buffer.Length, keyPtr);
                    var valuedb = new DirectBuffer(value.Buffer.Length, valPtr);

                    var success = c.TryFindDup(Lookup.EQ, ref keydb, ref valuedb);

                    if (success)
                    {
                        value = new Bufferable(valuedb.Span.ToArray());
                    }

                    return(success);
                }
            }
        }
Пример #8
0
        private static IEnumerable <ulong> GetSubFingerprintMatches(IReadOnlyList <int> hashes, int thresholdVotes, ReadOnlyTransaction tx)
        {
            var counter = new Dictionary <ulong, int>();

            for (var table = 0; table < hashes.Count; ++table)
            {
                var hashBin = hashes[table];
                var ids     = tx.GetSubFingerprintsByHashTableAndHash(table, hashBin);
                foreach (var id in ids)
                {
                    counter.TryGetValue(id, out var count);
                    counter[id] = count + 1;
                }
            }

            return(counter
                   .Where(pair => pair.Value >= thresholdVotes)
                   .Select(p => p.Key));
        }