diff --git a/java/rocksjni/cassandra_value_operator.cc b/java/rocksjni/cassandra_value_operator.cc index 5ba13cfe56dce75f2cadf4ad36cd032aff9ed868..034f33cc39e2923eaa44e524143a05341a5423b0 100644 --- a/java/rocksjni/cassandra_value_operator.cc +++ b/java/rocksjni/cassandra_value_operator.cc @@ -23,13 +23,14 @@ /* * Class: org_rocksdb_CassandraValueMergeOperator * Method: newSharedCassandraValueMergeOperator - * Signature: (I)J + * Signature: (II)J */ jlong Java_org_rocksdb_CassandraValueMergeOperator_newSharedCassandraValueMergeOperator( - JNIEnv* env, jclass jclazz, jint gcGracePeriodInSeconds) { + JNIEnv* env, jclass jclazz, jint gcGracePeriodInSeconds, + jint operands_limit) { auto* op = new std::shared_ptr( new rocksdb::cassandra::CassandraValueMergeOperator( - gcGracePeriodInSeconds)); + gcGracePeriodInSeconds, operands_limit)); return reinterpret_cast(op); } diff --git a/java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java b/java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java index 310a6e8ff5e66ea462ef18b3b82975300a6a90de..4b0c71ba5a5fdeb4494724d1a90003e13ed5862b 100644 --- a/java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java +++ b/java/src/main/java/org/rocksdb/CassandraValueMergeOperator.java @@ -11,10 +11,15 @@ package org.rocksdb; */ public class CassandraValueMergeOperator extends MergeOperator { public CassandraValueMergeOperator(int gcGracePeriodInSeconds) { - super(newSharedCassandraValueMergeOperator(gcGracePeriodInSeconds)); + super(newSharedCassandraValueMergeOperator(gcGracePeriodInSeconds, 0)); } - private native static long newSharedCassandraValueMergeOperator(int gcGracePeriodInSeconds); + public CassandraValueMergeOperator(int gcGracePeriodInSeconds, int operandsLimit) { + super(newSharedCassandraValueMergeOperator(gcGracePeriodInSeconds, operandsLimit)); + } + + private native static long newSharedCassandraValueMergeOperator( + int gcGracePeriodInSeconds, int limit); @Override protected final native void disposeInternal(final long handle); } diff --git a/utilities/cassandra/merge_operator.h b/utilities/cassandra/merge_operator.h index 272bfc21e5c9f2cc45f8b1b005e54a3fe11f7fc0..4d02c26de434bb8f3b8bb57a307627eaf0b015ee 100644 --- a/utilities/cassandra/merge_operator.h +++ b/utilities/cassandra/merge_operator.h @@ -15,8 +15,10 @@ namespace cassandra { */ class CassandraValueMergeOperator : public MergeOperator { public: - explicit CassandraValueMergeOperator(int32_t gc_grace_period_in_seconds) - : gc_grace_period_in_seconds_(gc_grace_period_in_seconds) {} + explicit CassandraValueMergeOperator(int32_t gc_grace_period_in_seconds, + size_t operands_limit = 0) + : gc_grace_period_in_seconds_(gc_grace_period_in_seconds), + operands_limit_(operands_limit) {} virtual bool FullMergeV2(const MergeOperationInput& merge_in, MergeOperationOutput* merge_out) const override; @@ -30,8 +32,13 @@ public: virtual bool AllowSingleOperand() const override { return true; } + virtual bool ShouldMerge(const std::vector& operands) const override { + return operands_limit_ > 0 && operands.size() >= operands_limit_; + } + private: int32_t gc_grace_period_in_seconds_; + size_t operands_limit_; }; } // namespace cassandra } // namespace rocksdb