From e2be969380854033d553d95772c29fb04c517386 Mon Sep 17 00:00:00 2001 From: Jacky Nguyen Date: Wed, 7 Feb 2024 14:30:26 -0500 Subject: [PATCH] Support MIN/MAX FDB mutation and expose little-endian value serdes for Long and YearMonth --- .../kvdb/KvdbOperationFactory.scala | 26 ++++++++ .../kvdb/KvdbWriteTransactionBuilder.scala | 20 ++++++ .../chopsticks/kvdb/codec/ValueSerdes.scala | 11 +++- .../kvdb/codec/little_endian/package.scala | 20 ++++++ .../dev/chopsticks/kvdb/TestDatabase.scala | 8 ++- .../transaction/ZFdbKeyspaceWriteApi.scala | 8 +++ .../dev/chopsticks/kvdb/fdb/FdbWriteApi.scala | 6 ++ .../chopsticks/kvdb/fdb/FdbDatabaseTest.scala | 16 ++--- .../kvdb/fdb/SpecificFdbDatabaseTest.scala | 62 +++++++++++++++++++ .../chopsticks/kvdb/lmdb/LmdbDatabase.scala | 5 +- .../kvdb/lmdb/LmdbDatabaseTest.scala | 16 ++--- .../kvdb/rocksdb/RocksdbDatabase.scala | 7 ++- .../kvdb/rocksdb/RocksdbDatabaseTest.scala | 31 +++++++--- 13 files changed, 200 insertions(+), 36 deletions(-) create mode 100644 chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/little_endian/package.scala diff --git a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbOperationFactory.scala b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbOperationFactory.scala index 7c0e615c..c7c4645f 100644 --- a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbOperationFactory.scala +++ b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbOperationFactory.scala @@ -116,4 +116,30 @@ final class KvdbOperationFactory[BCF[A, B] <: ColumnFamily[A, B]] { value = v ) } + + def mutateMin[CF[A, B] <: ColumnFamily[A, B], CF2 <: BCF[K, V], K, V]( + column: CF[K, V] with CF2, + key: K, + value: V + ): TransactionMutateMin = { + val (k, v) = column.serialize(key, value) + TransactionMutateMin( + columnId = column.id, + key = k, + value = v + ) + } + + def mutateMax[CF[A, B] <: ColumnFamily[A, B], CF2 <: BCF[K, V], K, V]( + column: CF[K, V] with CF2, + key: K, + value: V + ): TransactionMutateMax = { + val (k, v) = column.serialize(key, value) + TransactionMutateMax( + columnId = column.id, + key = k, + value = v + ) + } } diff --git a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbWriteTransactionBuilder.scala b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbWriteTransactionBuilder.scala index 3bee8561..07c640d1 100644 --- a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbWriteTransactionBuilder.scala +++ b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/KvdbWriteTransactionBuilder.scala @@ -13,6 +13,10 @@ object KvdbWriteTransactionBuilder { extends TransactionWrite final case class TransactionMutateAdd(columnId: String, key: Array[Byte], value: Array[Byte]) extends TransactionWrite + final case class TransactionMutateMin(columnId: String, key: Array[Byte], value: Array[Byte]) + extends TransactionWrite + final case class TransactionMutateMax(columnId: String, key: Array[Byte], value: Array[Byte]) + extends TransactionWrite } final class KvdbWriteTransactionBuilder[BCF[A, B] <: ColumnFamily[A, B]] { @@ -86,6 +90,22 @@ final class KvdbWriteTransactionBuilder[BCF[A, B] <: ColumnFamily[A, B]] { add(factory.mutateAdd(column, key, value)) } + def mutateMin[CF[A, B] <: ColumnFamily[A, B], CF2 <: BCF[K, V], K, V]( + column: CF[K, V] with CF2, + key: K, + value: V + ): this.type = { + add(factory.mutateMin(column, key, value)) + } + + def mutateMax[CF[A, B] <: ColumnFamily[A, B], CF2 <: BCF[K, V], K, V]( + column: CF[K, V] with CF2, + key: K, + value: V + ): this.type = { + add(factory.mutateMax(column, key, value)) + } + def nextVersion: Int = currentVersion.getAndIncrement() def result: List[TransactionWrite] = { diff --git a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/ValueSerdes.scala b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/ValueSerdes.scala index 2e14ba96..3a54a731 100644 --- a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/ValueSerdes.scala +++ b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/ValueSerdes.scala @@ -3,7 +3,15 @@ package dev.chopsticks.kvdb.codec import dev.chopsticks.kvdb.codec.ValueDeserializer.{GenericValueDeserializationException, ValueDeserializationResult} import cats.syntax.either._ -trait ValueSerdes[T] extends ValueSerializer[T] with ValueDeserializer[T] +trait ValueSerdes[T] extends ValueSerializer[T] with ValueDeserializer[T] { + def bimap[A](to: T => A)(from: A => T): ValueSerdes[A] = { + val that = this + new ValueSerdes[A] { + override def deserialize(bytes: Array[Byte]): ValueDeserializationResult[A] = that.deserialize(bytes).map(to) + override def serialize(value: A): Array[Byte] = that.serialize(from(value)) + } + } +} object ValueSerdes { def apply[T](implicit f: ValueSerdes[T]): ValueSerdes[T] = f @@ -39,5 +47,6 @@ object ValueSerdes { implicit val byteArrayValueSerdes: ValueSerdes[Array[Byte]] = ValueSerdes.create[Array[Byte]](identity, bytes => Right(bytes)) + implicit val unitValueSerdes: ValueSerdes[Unit] = ValueSerdes.create[Unit](_ => Array.emptyByteArray, _ => Right(())) } diff --git a/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/little_endian/package.scala b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/little_endian/package.scala new file mode 100644 index 00000000..7a19e6cd --- /dev/null +++ b/chopsticks-kvdb-core/src/main/scala/dev/chopsticks/kvdb/codec/little_endian/package.scala @@ -0,0 +1,20 @@ +package dev.chopsticks.kvdb.codec + +import java.nio.{ByteBuffer, ByteOrder} +import java.time.YearMonth + +package object little_endian { + implicit val longValueSerdes: ValueSerdes[Long] = + ValueSerdes.create[Long]( + value => ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(value).array(), + bytes => Right(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getLong()) + ) + implicit val yearMonthValueSerdes: ValueSerdes[YearMonth] = longValueSerdes.bimap[YearMonth](v => { + if (v == 0) YearMonth.of(0, 1) + else { + val year = v / 100 + val month = v - year * 100 + YearMonth.of(year.toInt, month.toInt) + } + })(ym => ym.getYear.toLong * 100 + ym.getMonthValue) +} diff --git a/chopsticks-kvdb-core/src/test/scala/dev/chopsticks/kvdb/TestDatabase.scala b/chopsticks-kvdb-core/src/test/scala/dev/chopsticks/kvdb/TestDatabase.scala index 35e78cfc..567d942a 100644 --- a/chopsticks-kvdb-core/src/test/scala/dev/chopsticks/kvdb/TestDatabase.scala +++ b/chopsticks-kvdb-core/src/test/scala/dev/chopsticks/kvdb/TestDatabase.scala @@ -2,23 +2,29 @@ package dev.chopsticks.kvdb import dev.chopsticks.kvdb.api.KvdbDatabaseApi +import java.time.YearMonth + object TestDatabase extends KvdbDefinition { type TestDbCf[K, V] = BaseCf[K, V] trait PlainCf extends TestDbCf[String, String] trait LookupCf extends TestDbCf[String, String] trait CounterCf extends TestDbCf[String, Long] + trait MinCf extends TestDbCf[String, YearMonth] + trait MaxCf extends TestDbCf[String, YearMonth] sealed trait AnotherDbCf[K, V] extends ColumnFamily[K, V] trait AnotherCf1 extends AnotherDbCf[String, String] trait AnotherCf2 extends AnotherDbCf[String, Int] - type CfSet = PlainCf with LookupCf with CounterCf + type CfSet = PlainCf with LookupCf with CounterCf with MinCf with MaxCf trait Materialization extends KvdbMaterialization[BaseCf, CfSet] { def plain: PlainCf def lookup: LookupCf def counter: CounterCf + def min: MinCf + def max: MaxCf } type DbApi = KvdbDatabaseApi[TestDbCf] diff --git a/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/fdb/transaction/ZFdbKeyspaceWriteApi.scala b/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/fdb/transaction/ZFdbKeyspaceWriteApi.scala index 31578de7..49d3202c 100644 --- a/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/fdb/transaction/ZFdbKeyspaceWriteApi.scala +++ b/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/fdb/transaction/ZFdbKeyspaceWriteApi.scala @@ -65,4 +65,12 @@ final class ZFdbKeyspaceWriteApi[BCF[A, B] <: ColumnFamily[A, B], CF <: BCF[K, V def mutateAdd(key: K, value: V): Unit = { transact(operationFactory.mutateAdd(keyspace, key, value)) } + + def mutateMin(key: K, value: V): Unit = { + transact(operationFactory.mutateMin(keyspace, key, value)) + } + + def mutateMax(key: K, value: V): Unit = { + transact(operationFactory.mutateMax(keyspace, key, value)) + } } diff --git a/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/kvdb/fdb/FdbWriteApi.scala b/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/kvdb/fdb/FdbWriteApi.scala index 5d92f1a4..d3c8a355 100644 --- a/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/kvdb/fdb/FdbWriteApi.scala +++ b/chopsticks-kvdb-fdb/src/main/scala/dev/chopsticks/kvdb/fdb/FdbWriteApi.scala @@ -81,6 +81,12 @@ final class FdbWriteApi[BCF[A, B] <: ColumnFamily[A, B]]( case TransactionMutateAdd(columnId, key, value) => tx.mutate(MutationType.ADD, dbContext.prefixKey(columnId, key), value) + + case TransactionMutateMin(columnId, key, value) => + tx.mutate(MutationType.MIN, dbContext.prefixKey(columnId, key), value) + + case TransactionMutateMax(columnId, key, value) => + tx.mutate(MutationType.MAX, dbContext.prefixKey(columnId, key), value) } } } diff --git a/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/FdbDatabaseTest.scala b/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/FdbDatabaseTest.scala index 68594499..305b1908 100644 --- a/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/FdbDatabaseTest.scala +++ b/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/FdbDatabaseTest.scala @@ -2,30 +2,24 @@ package dev.chopsticks.kvdb.fdb import dev.chopsticks.fp.ZAkkaApp.ZAkkaAppEnv import dev.chopsticks.fp.iz_logging.IzLogging -import dev.chopsticks.kvdb.TestDatabase.{BaseCf, CfSet, CounterCf, LookupCf, PlainCf} -import dev.chopsticks.kvdb.codec.ValueSerdes +import dev.chopsticks.kvdb.TestDatabase.{BaseCf, CfSet, CounterCf, LookupCf, MaxCf, MinCf, PlainCf} import dev.chopsticks.kvdb.util.KvdbIoThreadPool import dev.chopsticks.kvdb.{ColumnFamilySet, KvdbDatabaseTest, TestDatabase} import zio.{RManaged, ZIO, ZManaged} import dev.chopsticks.kvdb.codec.primitive._ - -import java.nio.{ByteBuffer, ByteOrder} +import dev.chopsticks.kvdb.codec.little_endian.{longValueSerdes, yearMonthValueSerdes} import java.util.UUID object FdbDatabaseTest { - implicit val littleIndianLongValueSerdes: ValueSerdes[Long] = - ValueSerdes.create[Long]( - value => ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(value).array(), - bytes => Right(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getLong()) - ) - object dbMaterialization extends TestDatabase.Materialization with FdbMaterialization[TestDatabase.BaseCf] { object plain extends PlainCf object lookup extends LookupCf object counter extends CounterCf + object min extends MinCf + object max extends MaxCf val columnFamilySet: ColumnFamilySet[BaseCf, CfSet] = { - ColumnFamilySet[BaseCf].of(plain).and(lookup).and(counter) + ColumnFamilySet[BaseCf].of(plain).and(lookup).and(counter).and(min).and(max) } //noinspection TypeAnnotation override val keyspacesWithVersionstampKey = Set.empty diff --git a/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/SpecificFdbDatabaseTest.scala b/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/SpecificFdbDatabaseTest.scala index 422ce154..b6753bf7 100644 --- a/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/SpecificFdbDatabaseTest.scala +++ b/chopsticks-kvdb-fdb/src/test/scala/dev/chopsticks/kvdb/fdb/SpecificFdbDatabaseTest.scala @@ -13,6 +13,7 @@ import org.scalatest.wordspec.AsyncWordSpecLike import zio.{Promise, Task, UIO, ZIO, ZRef} import java.nio.charset.StandardCharsets +import java.time.YearMonth import java.util.concurrent.CompletableFuture import java.util.concurrent.atomic.AtomicLong @@ -27,6 +28,7 @@ final class SpecificFdbDatabaseTest private lazy val defaultCf = dbMat.plain private lazy val counterCf = dbMat.counter + private lazy val minCf = dbMat.min private lazy val withDb = createTestRunner(FdbDatabaseTest.managedDb) { effect => @@ -202,4 +204,64 @@ final class SpecificFdbDatabaseTest } } } + + "min mutation" should { + "work with YearMonth value" in withDb { db => + for { + transaction <- UIO(ZFdbTransaction(db)) + _ <- transaction.write { tx => + Task { + val cf = tx.keyspace(minCf) + + cf.mutateMin("foo", YearMonth.of(2024, 9)) + cf.put("bar", YearMonth.of(2024, 6)) + cf.mutateMin("bar", YearMonth.of(2024, 8)) + } + } + currentFoo <- transaction + .read { tx => + val cf = tx.keyspace(minCf) + cf.get(_ is "foo") + } + currentBar <- transaction + .read { tx => + val cf = tx.keyspace(minCf) + cf.get(_ is "bar") + } + } yield { + currentFoo shouldEqual Some("foo" -> YearMonth.of(2024, 9)) + currentBar shouldEqual Some("bar" -> YearMonth.of(2024, 6)) + } + } + } + + "max mutation" should { + "work with YearMonth value" in withDb { db => + for { + transaction <- UIO(ZFdbTransaction(db)) + _ <- transaction.write { tx => + Task { + val cf = tx.keyspace(minCf) + + cf.mutateMax("foo", YearMonth.of(2024, 9)) + cf.put("bar", YearMonth.of(2024, 6)) + cf.mutateMax("bar", YearMonth.of(2024, 8)) + } + } + currentFoo <- transaction + .read { tx => + val cf = tx.keyspace(minCf) + cf.get(_ is "foo") + } + currentBar <- transaction + .read { tx => + val cf = tx.keyspace(minCf) + cf.get(_ is "bar") + } + } yield { + currentFoo shouldEqual Some("foo" -> YearMonth.of(2024, 9)) + currentBar shouldEqual Some("bar" -> YearMonth.of(2024, 8)) + } + } + } } diff --git a/chopsticks-kvdb-lmdb/src/main/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabase.scala b/chopsticks-kvdb-lmdb/src/main/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabase.scala index b11d12e9..e0dd5174 100644 --- a/chopsticks-kvdb-lmdb/src/main/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabase.scala +++ b/chopsticks-kvdb-lmdb/src/main/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabase.scala @@ -804,8 +804,9 @@ final class LmdbDatabase[BCF[A, B] <: ColumnFamily[A, B], +CFS <: BCF[_, _]] pri case TransactionDeleteRange(columnId, fromKey, toKey) => val _ = doDeleteRange(txn, refs.getKvdbi(columnFamilyWithId(columnId).get), fromKey, toKey) - case _: TransactionMutateAdd => - ??? + case _: TransactionMutateAdd => ??? + case _: TransactionMutateMin => ??? + case _: TransactionMutateMax => ??? } } diff --git a/chopsticks-kvdb-lmdb/src/test/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabaseTest.scala b/chopsticks-kvdb-lmdb/src/test/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabaseTest.scala index 38d86558..527f5049 100644 --- a/chopsticks-kvdb-lmdb/src/test/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabaseTest.scala +++ b/chopsticks-kvdb-lmdb/src/test/scala/dev/chopsticks/kvdb/lmdb/LmdbDatabaseTest.scala @@ -2,8 +2,8 @@ package dev.chopsticks.kvdb.lmdb import dev.chopsticks.fp.ZAkkaApp.ZAkkaAppEnv import dev.chopsticks.kvdb.KvdbDatabase.KvdbClientOptions -import dev.chopsticks.kvdb.TestDatabase.{BaseCf, CfSet, CounterCf, LookupCf, PlainCf} -import dev.chopsticks.kvdb.codec.ValueSerdes +import dev.chopsticks.kvdb.TestDatabase.{BaseCf, CfSet, CounterCf, LookupCf, MaxCf, MinCf, PlainCf} +import dev.chopsticks.kvdb.codec.little_endian.{longValueSerdes, yearMonthValueSerdes} import dev.chopsticks.kvdb.util.{KvdbIoThreadPool, KvdbTestSuite} import dev.chopsticks.kvdb.{ColumnFamilySet, KvdbDatabaseTest, TestDatabase} import eu.timepit.refined.auto._ @@ -11,24 +11,18 @@ import eu.timepit.refined.types.string.NonEmptyString import squants.information.InformationConversions._ import zio.ZManaged import dev.chopsticks.kvdb.codec.primitive._ - -import java.nio.{ByteBuffer, ByteOrder} import scala.concurrent.duration._ object LmdbDatabaseTest { - implicit val littleIndianLongValueSerdes: ValueSerdes[Long] = - ValueSerdes.create[Long]( - value => ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(value).array(), - bytes => Right(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getLong()) - ) - object dbMaterialization extends TestDatabase.Materialization { object plain extends PlainCf object lookup extends LookupCf object counter extends CounterCf + object min extends MinCf + object max extends MaxCf val columnFamilySet: ColumnFamilySet[BaseCf, CfSet] = { - ColumnFamilySet[BaseCf] of plain and lookup and counter + ColumnFamilySet[BaseCf] of plain and lookup and counter and min and max } } diff --git a/chopsticks-kvdb-rocksdb/src/main/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabase.scala b/chopsticks-kvdb-rocksdb/src/main/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabase.scala index b02a0e13..3be98c1f 100644 --- a/chopsticks-kvdb-rocksdb/src/main/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabase.scala +++ b/chopsticks-kvdb-rocksdb/src/main/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabase.scala @@ -763,8 +763,9 @@ final class RocksdbDatabase[BCF[A, B] <: ColumnFamily[A, B], +CFS <: BCF[_, _]] toKey ) - case _: TransactionMutateAdd => - ??? + case _: TransactionMutateAdd => ??? + case _: TransactionMutateMin => ??? + case _: TransactionMutateMax => ??? } val writeOptions = newWriteOptions() @@ -829,6 +830,8 @@ final class RocksdbDatabase[BCF[A, B] <: ColumnFamily[A, B], +CFS <: BCF[_, _]] ) case _: TransactionMutateAdd => ??? + case _: TransactionMutateMin => ??? + case _: TransactionMutateMax => ??? } try { diff --git a/chopsticks-kvdb-rocksdb/src/test/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabaseTest.scala b/chopsticks-kvdb-rocksdb/src/test/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabaseTest.scala index 61771f6b..57031274 100644 --- a/chopsticks-kvdb-rocksdb/src/test/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabaseTest.scala +++ b/chopsticks-kvdb-rocksdb/src/test/scala/dev/chopsticks/kvdb/rocksdb/RocksdbDatabaseTest.scala @@ -3,8 +3,8 @@ package dev.chopsticks.kvdb.rocksdb import dev.chopsticks.fp.ZAkkaApp.ZAkkaAppEnv import dev.chopsticks.kvdb.KvdbDatabase.KvdbClientOptions import dev.chopsticks.kvdb.TestDatabase._ -import dev.chopsticks.kvdb.codec.ValueSerdes import dev.chopsticks.kvdb.codec.primitive._ +import dev.chopsticks.kvdb.codec.little_endian.{longValueSerdes, yearMonthValueSerdes} import dev.chopsticks.kvdb.rocksdb.RocksdbColumnFamilyConfig.{PointLookupPattern, PrefixedScanPattern} import dev.chopsticks.kvdb.util.{KvdbIoThreadPool, KvdbTestSuite} import dev.chopsticks.kvdb.{ColumnFamilySet, KvdbDatabaseTest} @@ -13,20 +13,16 @@ import eu.timepit.refined.types.string.NonEmptyString import squants.information.InformationConversions._ import zio.ZManaged -import java.nio.{ByteBuffer, ByteOrder} import scala.concurrent.duration._ object RocksdbDatabaseTest { - implicit val littleIndianLongValueSerdes: ValueSerdes[Long] = - ValueSerdes.create[Long]( - value => ByteBuffer.allocate(8).order(ByteOrder.LITTLE_ENDIAN).putLong(value).array(), - bytes => Right(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).getLong()) - ) object dbMaterialization extends Materialization with RocksdbMaterialization[BaseCf, CfSet] { object plain extends PlainCf object lookup extends LookupCf object counter extends CounterCf + object min extends MinCf + object max extends MaxCf val defaultColumnFamily: plain.type = plain @@ -59,8 +55,27 @@ object RocksdbDatabaseTest { writeBufferCount = 4 ).toOptions(PointLookupPattern) ) + .and( + min, + RocksdbColumnFamilyConfig( + memoryBudget = 1.mib, + blockCache = 1.mib, + blockSize = 8.kib, + writeBufferCount = 4 + ).toOptions(PointLookupPattern) + ) + .and( + max, + RocksdbColumnFamilyConfig( + memoryBudget = 1.mib, + blockCache = 1.mib, + blockSize = 8.kib, + writeBufferCount = 4 + ).toOptions(PointLookupPattern) + ) } - val columnFamilySet: ColumnFamilySet[BaseCf, CfSet] = ColumnFamilySet[BaseCf].of(plain).and(lookup).and(counter) + val columnFamilySet: ColumnFamilySet[BaseCf, CfSet] = + ColumnFamilySet[BaseCf].of(plain).and(lookup).and(counter).and(min).and(max) } val managedDb: ZManaged[ZAkkaAppEnv with KvdbIoThreadPool, Throwable, Db] = {