Ejemplo n.º 1
0
        public DatastoreResults <T> Query(DatastoreQuery <T> q)
        {
            var results = new BlockingCollection <DatastoreResult <T> >();

            Task.Factory.StartNew(() =>
            {
                foreach (var item in new DirectoryInfo(_path).EnumerateFiles("*" + ObjectKeySuffix, SearchOption.AllDirectories)
                         .Select(f =>
                {
                    var path = f.FullName;
                    if (path.StartsWith(_path))
                    {
                        path = path.Substring(_path.Length);
                    }

                    if (Path.IsPathRooted(path))
                    {
                        path = path.TrimStart(Path.DirectorySeparatorChar);
                    }

                    var key = new DatastoreKey(path.Substring(0, path.IndexOf(ObjectKeySuffix)));
                    var entry = new DatastoreEntry <T>(key, default(T));
                    return(new DatastoreResult <T>(entry));
                }))
                {
                    if (!results.TryAdd(item, Timeout.Infinite))
                    {
                        break;
                    }
                }
            })
            .ContinueWith(_ => results.CompleteAdding());

            return(DatastoreResults <T> .WithCollection(q, results).NaiveQueryApply());
        }
Ejemplo n.º 2
0
        public virtual DatastoreResults <T> Query(DatastoreQuery <T> q)
        {
            if (q.QueryFilters.Length > 0 ||
                q.QueryOrders.Length > 0 ||
                q.Limit > 0 ||
                q.Offset > 0)
            {
                throw new Exception("mount only supports listing all prefixed keys in random order");
            }

            var            key = new DatastoreKey(q.Prefix);
            IDatastore <T> ds;
            DatastoreKey   mp, k;

            if (!Lookup(key, out ds, out mp, out k))
            {
                throw new Exception("Mount only supports listing a mount point");
            }

            var q2     = new DatastoreQuery <T>(prefix: k);
            var wrapDS = new KeyTransformDatastore <T>(ds, new KeyTransformPair(null, x => mp.Child(x)));
            var r      = wrapDS.Query(q2);

            return(DatastoreResults <T> .ReplaceQuery(r, q));
        }
Ejemplo n.º 3
0
        private static void TestResults <T>(DatastoreResults <T> datastoreResults, DatastoreKey[] expected)
        {
            var actual = datastoreResults
                         .Rest()
                         .Select(e => e.DatastoreKey)
                         .ToArray();

            Assert.That(actual, Is.EqualTo(expected));
        }
Ejemplo n.º 4
0
        private static void TestKeyFilter <T>(QueryFilter <T> queryFilter, DatastoreKey[] datastoreKeys, DatastoreKey[] expected)
        {
            var e   = datastoreKeys.Select(key => new DatastoreEntry <T>(key, default(T))).ToArray();
            var res = DatastoreResults <T> .WithEntries(new DatastoreQuery <T>(), e).NaiveFilter(queryFilter);

            var actualE = res.Rest();
            var actual  = actualE.Select(x => x.DatastoreKey).ToArray();

            Assert.That(actual, Is.EqualTo(expected));
        }
Ejemplo n.º 5
0
        public DatastoreResults <T> Query(DatastoreQuery <T> q)
        {
            var re = _values
                     .Select(kv => new DatastoreEntry <T>(kv.Key, kv.Value))
                     .ToArray();

            return(DatastoreResults <T>
                   .WithEntries(q, re)
                   .NaiveQueryApply());
        }
Ejemplo n.º 6
0
        private static void TestKeyOffset <T>(int offset, DatastoreKey[] datastoreKeys, DatastoreKey[] expected)
        {
            var entries = datastoreKeys
                          .Select(e => new DatastoreEntry <T>(e, default(T)))
                          .ToArray();

            var res = DatastoreResults <T> .WithEntries(new DatastoreQuery <T>(), entries)
                      .NaiveOffset(offset);

            TestResults(res, expected);
        }
Ejemplo n.º 7
0
        public DatastoreResults <byte[]> Query(DatastoreQuery <byte[]> q)
        {
            if ((!string.IsNullOrEmpty(q.Prefix) && q.Prefix != "/") ||
                q.QueryFilters.Length > 0 ||
                q.QueryOrders.Length > 0 ||
                q.Limit > 0 ||
                q.Offset > 0 ||
                !q.KeysOnly)
            {
                throw new Exception("flatfs only supports listing all keys in random order");
            }

            var reschan = new BlockingCollection <DatastoreResult <byte[]> >(DatastoreQuery <byte[]> .KeysOnlyBufferSize);

            Task.Run(() => WalkTopLevel(_path, reschan))
            .ContinueWith(_ => reschan.CompleteAdding());

            return(DatastoreResults <byte[]> .WithCollection(q, reschan));
        }
Ejemplo n.º 8
0
        public DatastoreResults <byte[]> Query(DatastoreQuery <byte[]> q)
        {
            var qrb = new DatastoreResults <byte[]> .ResultBuilder(q);

            Task.Run(() => RunQuery(qrb))
            .ContinueWith(_ => qrb.Output.CompleteAdding());

            var qr = qrb.Results();

            foreach (var filter in q.QueryFilters)
            {
                qr = qr.NaiveFilter(filter);
            }

            foreach (var order in q.QueryOrders)
            {
                qr = qr.NaiveOrder(order);
            }

            return(qr);
        }
Ejemplo n.º 9
0
 public DatastoreResults <T> Query(DatastoreQuery <T> q) => DatastoreResults <T> .WithEntries(q, Array.Empty <DatastoreEntry <T> >());
Ejemplo n.º 10
0
        private static void ExpectMatches <T>(DatastoreKey[] expected, DatastoreResults <T> results)
        {
            var actual = results.Rest().Select(r => r.DatastoreKey).ToArray();

            Assert.That(actual, Is.EqualTo(expected));
        }
Ejemplo n.º 11
0
        private void RunQuery(DatastoreResults <byte[]> .ResultBuilder qrb)
        {
            byte[] range = null;
            if (!string.IsNullOrEmpty(qrb.DatastoreQuery.Prefix))
            {
                range = Encoding.UTF8.GetBytes(qrb.DatastoreQuery.Prefix);
            }

            using (var i = _db.NewIterator(ReadOptions.Default))
            {
                i.SeekToFirst();

                if (qrb.DatastoreQuery.Offset > 0)
                {
                    var offset = 0;
                    while (offset < qrb.DatastoreQuery.Offset)
                    {
                        if (range != null)
                        {
                            if (i.Key().ToArray().HasPrefix(range))
                            {
                                offset++;
                            }
                        }
                        else
                        {
                            offset++;
                        }

                        i.Next();
                    }
                }

                for (var sent = 0; i.Valid(); sent++)
                {
                    if (qrb.DatastoreQuery.Limit > 0 && sent >= qrb.DatastoreQuery.Limit)
                    {
                        break;
                    }

                    if (qrb.Cancellation.IsCancellationRequested)
                    {
                        break;
                    }

                    if (range != null && i.Key().ToArray().HasPrefix(range))
                    {
                        var k = new DatastoreKey(i.Key().ToString());
                        var v = qrb.DatastoreQuery.KeysOnly ? null : i.Value().ToArray();
                        var e = new DatastoreEntry <byte[]>(k, v);

                        if (!qrb.Output.TryAdd(new DatastoreResult <byte[]>(e), Timeout.Infinite, qrb.Cancellation.Token))
                        {
                            break;
                        }
                    }

                    i.Next();
                }
            }
        }