/// <summary>Returns a key that is immediately after the packed representation of this tuple</summary>
 /// <remarks>This is the equivalent of manually packing the tuple and incrementing the resulting slice</remarks>
 public static Slice Increment([NotNull] this IFdbTuple tuple)
 {
     if (tuple == null)
     {
         throw new ArgumentNullException("tuple");
     }
     return(FdbKey.Increment(tuple.ToSlice()));
 }
        public FdbRangeQuery <TId> LookupLessThan([NotNull] IFdbReadOnlyTransaction trans, TValue value, bool orEqual, bool reverse = false)
        {
            var prefix = this.Subspace.Keys.EncodePartial(value);

            if (orEqual)
            {
                prefix = FdbKey.Increment(prefix);
            }

            var space = new KeySelectorPair(
                KeySelector.FirstGreaterOrEqual(this.Subspace.ToRange().Begin),
                KeySelector.FirstGreaterThan(prefix)
                );

            return(trans
                   .GetRange(space, new FdbRangeOptions {
                Reverse = reverse
            })
                   .Select((kvp) => this.Subspace.Keys.Decode(kvp.Key).Item2));
        }
Beispiel #3
0
        public FdbRangeQuery <TId> LookupGreaterThan([NotNull] IFdbReadOnlyTransaction trans, TValue value, bool orEqual, bool reverse = false)
        {
            var prefix = this.Location.Partial.EncodeKey(value);

            if (!orEqual)
            {
                prefix = FdbKey.Increment(prefix);
            }

            var space = new FdbKeySelectorPair(
                FdbKeySelector.FirstGreaterThan(prefix),
                this.Location.ToSelectorPair().End
                );

            return(trans
                   .GetRange(space, new FdbRangeOptions {
                Reverse = reverse
            })
                   .Select((kvp) => this.Location.DecodeKey(kvp.Key).Item2));
        }
Beispiel #4
0
        public void Test_FdbKey_Increment()
        {
            var key = FdbKey.Increment(Slice.FromByteString("Hello"));

            Assert.That(key.ToString(), Is.EqualTo("Hellp"));

            key = FdbKey.Increment(Slice.FromByteString("Hello\x00"));
            Assert.That(key.ToString(), Is.EqualTo("Hello<01>"));

            key = FdbKey.Increment(Slice.FromByteString("Hello\xFE"));
            Assert.That(key.ToString(), Is.EqualTo("Hello<FF>"));

            key = FdbKey.Increment(Slice.FromByteString("Hello\xFF"));
            Assert.That(key.ToString(), Is.EqualTo("Hellp"), "Should remove training \\xFF");

            key = FdbKey.Increment(Slice.FromByteString("A\xFF\xFF\xFF"));
            Assert.That(key.ToString(), Is.EqualTo("B"), "Should truncate all trailing \\xFFs");

            // corner cases
            Assert.That(() => FdbKey.Increment(Slice.Nil), Throws.InstanceOf <ArgumentException>().With.Property("ParamName").EqualTo("slice"));
            Assert.That(() => FdbKey.Increment(Slice.Empty), Throws.InstanceOf <ArgumentException>());
            Assert.That(() => FdbKey.Increment(Slice.FromByteString("\xFF")), Throws.InstanceOf <ArgumentException>());
        }