diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java index ecfc88dbf6..e3126dbe89 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java @@ -141,11 +141,12 @@ public void columns(Collection bytesColumns) { } @Override - public void columns(BackendColumn... bytesColumns) { - this.columns.addAll(Arrays.asList(bytesColumns)); + public void columns(BackendColumn bytesColumn) { + this.columns.add(bytesColumn); long maxSize = BackendEntryIterator.INLINE_BATCH_SIZE; - E.checkState(this.columns.size() <= maxSize, - "Too many columns in one entry: %s", maxSize); + if (this.columns.size() > maxSize) { + E.checkState(false, "Too many columns in one entry: %s", maxSize); + } } public BackendColumn removeColumn(int index) { diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java index 496b3ef7ee..6d1ecd9843 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java @@ -265,7 +265,7 @@ public void columns(Collection bytesColumns) { } @Override - public void columns(BackendEntry.BackendColumn... bytesColumns) { + public void columns(BackendEntry.BackendColumn bytesColumn) { throw new NotImplementedException("Not supported by table backend"); } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java index 9d8239857b..8e764a29bf 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java @@ -264,11 +264,9 @@ public void columns(Collection bytesColumns) { } @Override - public void columns(BackendColumn... bytesColumns) { - for (BackendColumn column : bytesColumns) { - this.columns.put(StringEncoding.decode(column.name), - StringEncoding.decode(column.value)); - } + public void columns(BackendColumn bytesColumn) { + this.columns.put(StringEncoding.decode(bytesColumn.name), + StringEncoding.decode(bytesColumn.value)); } @Override diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java index 2bc2bc75a2..1ab839973d 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java @@ -19,7 +19,6 @@ package com.baidu.hugegraph.backend.store; -import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.NoSuchElementException; @@ -87,7 +86,7 @@ public boolean equals(Object obj) { public Collection columns(); public void columns(Collection columns); - public void columns(BackendColumn... columns); + public void columns(BackendColumn column); public void merge(BackendEntry other); public boolean mergeable(BackendEntry other); @@ -104,6 +103,7 @@ public default boolean olap() { public interface BackendIterator extends Iterator, AutoCloseable { + @Override public void close(); public byte[] position(); @@ -116,7 +116,18 @@ public static BackendColumnIterator empty() { return EMPTY; } - public final BackendColumnIterator EMPTY = new BackendColumnIterator() { + public static BackendColumnIterator iterator(BackendColumn element) { + return new OneColumnIterator(element); + } + + public static BackendColumnIterator wrap(Iterator iter) { + return new BackendColumnIteratorWrapper(iter); + } + + public static final BackendColumnIterator EMPTY = new EmptyIterator(); + + public static final class EmptyIterator + implements BackendColumnIterator { @Override public boolean hasNext() { @@ -137,41 +148,74 @@ public void close() { public byte[] position() { return null; } - }; - } + } - public static class BackendColumnIteratorWrapper - implements BackendColumnIterator { + public static final class OneColumnIterator + implements BackendColumnIterator { - private final Iterator iter; + private BackendColumn element; - public BackendColumnIteratorWrapper(BackendColumn... cols) { - this.iter = Arrays.asList(cols).iterator(); - } + public OneColumnIterator(BackendColumn element) { + assert element != null; + this.element = element; + } - public BackendColumnIteratorWrapper(Iterator cols) { - E.checkNotNull(cols, "cols"); - this.iter = cols; - } + @Override + public boolean hasNext() { + return this.element != null; + } - @Override - public boolean hasNext() { - return iter.hasNext(); - } + @Override + public BackendColumn next() { + if (this.element == null) { + throw new NoSuchElementException(); + } + BackendColumn result = this.element; + this.element = null; + return result; + } - @Override - public BackendColumn next() { - return iter.next(); - } + @Override + public void close() { + // pass + } - @Override - public void close() { - WrappedIterator.close(this.iter); + @Override + public byte[] position() { + return null; + } } - @Override - public byte[] position() { - return null; + public static final class BackendColumnIteratorWrapper + implements BackendColumnIterator { + + private final Iterator iter; + + public BackendColumnIteratorWrapper(Iterator iter) { + E.checkNotNull(iter, "iter"); + this.iter = iter; + } + + @Override + public boolean hasNext() { + return this.iter.hasNext(); + } + + @Override + public BackendColumn next() { + return this.iter.next(); + } + + @Override + public void close() { + WrappedIterator.close(this.iter); + } + + @Override + public byte[] position() { + // No paging position for discrete iterators like queryByIds() + return null; + } } } } diff --git a/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java b/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java index 639e69debe..427161bfff 100644 --- a/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java +++ b/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java @@ -44,7 +44,6 @@ import com.baidu.hugegraph.backend.store.BackendEntry; import com.baidu.hugegraph.backend.store.BackendEntry.BackendColumn; import com.baidu.hugegraph.backend.store.BackendEntry.BackendColumnIterator; -import com.baidu.hugegraph.backend.store.BackendEntry.BackendColumnIteratorWrapper; import com.baidu.hugegraph.backend.store.BackendEntryIterator; import com.baidu.hugegraph.backend.store.BackendTable; import com.baidu.hugegraph.backend.store.Shard; @@ -199,7 +198,7 @@ protected BackendColumnIterator queryByIds(Session session, } // NOTE: this will lead to lazy create rocksdb iterator - return new BackendColumnIteratorWrapper(new FlatMapperIterator<>( + return BackendColumnIterator.wrap(new FlatMapperIterator<>( ids.iterator(), id -> this.queryById(session, id) )); } @@ -210,7 +209,7 @@ protected BackendColumnIterator getById(Session session, Id id) { return BackendColumnIterator.empty(); } BackendColumn col = BackendColumn.of(id.asBytes(), value); - return new BackendEntry.BackendColumnIteratorWrapper(col); + return BackendColumnIterator.iterator(col); } protected BackendColumnIterator getByIds(Session session, Set ids) { diff --git a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java index 9526b3bbf5..9849195c2d 100644 --- a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java +++ b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java @@ -37,6 +37,54 @@ public class RocksDBPerfTest extends BaseRocksDBUnitTest { private static final int TIMES = 10000 * 1000; + @Test + public void testSeekExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + Iterator iter = session.scan(TABLE, b("exist")); + while (iter.hasNext()) { + iter.next(); + } + } + } + + @Test + public void testSeekNonExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + Iterator iter = session.scan(TABLE, b("non-exist")); + while (iter.hasNext()) { + iter.next(); + } + } + } + + @Test + public void testGetExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + byte[] value = session.get(TABLE, b("exist")); + assert value.length == "value".length(); + } + } + + @Test + public void testGetNonExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + byte[] value = session.get(TABLE, b("non-exist")); + assert value == null; + } + } + @Test public void testPut() throws RocksDBException { for (int i = 0; i < TIMES; i++) { diff --git a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java index 7f4179893c..9728921457 100644 --- a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java +++ b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java @@ -88,9 +88,7 @@ private static BackendEntry parse(BackendEntry originEntry) { byte[] bytes = originEntry.id().asBytes(); BackendEntry parsedEntry = new BinaryBackendEntry(originEntry.type(), bytes); - for (BackendEntry.BackendColumn col : originEntry.columns()) { - parsedEntry.columns(col); - } + parsedEntry.columns(originEntry.columns()); return parsedEntry; } }