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(); }
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; } } }
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(); }
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); } } }
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)); }