Beispiel #1
0
        public void CleanIndex(string indexName)          // Cleans the index.
        {
            KeyValueStore indexStore = GetSecondaryIndex(indexName);

            var allValueStoreItems = new HashSet <ByteArray> (this.Enumerate().Select(item => new ByteArray(item.Key)));

            foreach (var indexItem in indexStore.Enumerate())
            {
                if (!allValueStoreItems.Contains(new ByteArray(indexItem.Value)))
                {
                    indexStore.Delete(indexItem.Key);
                }
            }
        }
Beispiel #2
0
        public void RemoveFromIndex(byte[] key, IDictionary <string, byte[]> indexedValues)         // Removes the index of the from.
        {
            foreach (var pair in indexedValues)
            {
                string IndexName = pair.Key;

                // Construct Index key by concatenating the indexed value and the target key
                byte[] indexValue = pair.Value;
                byte[] indexKey   = new byte[key.Length + indexValue.Length];
                indexValue.CopyTo(indexKey, 0);
                key.CopyTo(indexKey, indexValue.Length);

                KeyValueStore indexStore = GetSecondaryIndex(IndexName);
                indexStore.Delete(indexKey);
            }
        }
Beispiel #3
0
        public void RemoveIndexRangeForValue(string indexName, byte[] startAt, byte[] value)
        {
            KeyValueStore indexStore = GetSecondaryIndex(indexName);
            var           pairs      = indexStore.EnumerateFromKey(startAt);

            foreach (var pair in pairs)
            {
                if (ByteArray.CompareMemCmp(pair.Value, value) == 0)
                {
                    indexStore.Delete(pair.Key);
                }
                if (ByteArray.CompareMemCmp(startAt, 0, pair.Key, 0, startAt.Length) == 0)
                {
                    continue;                     // Exit index removal only when the projectID in the index key changes.
                }
                break;
            }
        }
Beispiel #4
0
        public void RemoveDeletedValuesFromIndex()
        {
            string path = Path.GetFullPath ("TestData\\RemoveDeletedValuesFromIndex");
            var timer = new Stopwatch ();

            using (var db = new KeyValueStore(path)) {
                db.Truncate ();
                int totalSize = 0;
                db.Manifest.Logger = msg => Console.WriteLine (msg);

                var indexed = new SortedDictionary<string, byte[]> ();
                int num_items = 1000;
                timer.Start ();
                for (int i = 0; i < num_items; i++) {
                    indexed ["Mod"] = BitConverter.GetBytes (i % 100);
                    db.Set (BitConverter.GetBytes (i), BitConverter.GetBytes (i), indexed);
                    totalSize += 8 + 4;
                }
                timer.Stop ();

                Console.WriteLine ("Wrote data (with indexing) at a throughput of {0} MB/s", (double)totalSize / timer.Elapsed.TotalSeconds / (1024.0 * 1024.0));

                timer.Reset ();
                timer.Start ();
                var ctModZeros = db.Find ("Mod", BitConverter.GetBytes ((int)0)).Count ();
                timer.Stop ();
                Assert.AreEqual (10, ctModZeros);
                Console.WriteLine ("Scanned index at a throughput of {0} items/s", (double)ctModZeros / timer.Elapsed.TotalSeconds);
            }

            // Open the index directly and see if the data is there
            using (var db = new KeyValueStore(Path.Combine(path, "Mod"))) {
                int num_vals = db.EnumerateFromKey (BitConverter.GetBytes ((int)0)).Count (pair => pair.Key.Take (4).All (b => b == 0));
                Assert.AreEqual (10, num_vals);
            }

            // Re-open the main key-value store and delete the value at 30
            using (var db = new KeyValueStore(path)) {
                db.Delete (BitConverter.GetBytes (200));
                // Clean the data from the index
                db.RemoveFromIndex (BitConverter.GetBytes (200), new Dictionary<string, byte[]> { { "Mod", BitConverter.GetBytes(200 % 100) } });
            }

            // Open the index again directly and confirm that the lookup key is gone now as well
            using (var db = new KeyValueStore(Path.Combine(path, "Mod"))) {
                int num_vals = db.EnumerateFromKey (BitConverter.GetBytes ((int)0)).Count (pair => pair.Key.Take (4).All (b => b == 0));
                Assert.AreEqual (9, num_vals);
            }
        }
Beispiel #5
0
        public void IndexClean()
        {
            string path = Path.GetFullPath ("TestData\\IndexClean");

            using (var db = new KeyValueStore(path)) {
                db.Truncate ();
                db.Manifest.Logger = msg => Console.WriteLine (msg);

                db.Set (Encoding.UTF8.GetBytes ("KeyA"), Encoding.UTF8.GetBytes ("ValueA:1"), new Dictionary<string, byte[]> { { "Idx", Encoding.UTF8.GetBytes("1") } });
                db.Set (Encoding.UTF8.GetBytes ("KeyB"), Encoding.UTF8.GetBytes ("ValueB:2"), new Dictionary<string, byte[]> { { "Idx", Encoding.UTF8.GetBytes("2") } });
                db.Set (Encoding.UTF8.GetBytes ("KeyC"), Encoding.UTF8.GetBytes ("ValueC:3"), new Dictionary<string, byte[]> { { "Idx", Encoding.UTF8.GetBytes("3") } });

                var lookupValue = db.Find ("Idx", Encoding.UTF8.GetBytes ("3")).Single ();
                Assert.AreEqual ("ValueC:3", Encoding.UTF8.GetString (lookupValue.Value));
                Assert.AreEqual ("KeyC", Encoding.UTF8.GetString (lookupValue.Key));

                db.Delete (Encoding.UTF8.GetBytes ("KeyC"));
            }

            // Open the index directly and confirm that the lookup key is still there
            using (var db = new KeyValueStore(Path.Combine(path, "Idx"))) Assert.AreEqual (3, db.Enumerate ().Count ());

            using (var db = new KeyValueStore(path)) db.CleanIndex ("Idx");

            // Open the index directly and confirm that the lookup key is now gone
            using (var db = new KeyValueStore(Path.Combine(path, "Idx"))) Assert.AreEqual (2, db.Enumerate ().Count ());
        }