From 6877de268aedfc0715bcc3578a7695c4ee278a7f Mon Sep 17 00:00:00 2001
From: vharseko <vharseko@3a-systems.ru>
Date: Tue, 24 Oct 2023 09:59:18 +0000
Subject: [PATCH] CASSANDRA storage: cursor performance (#312)

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/cassandra/Storage.java |   52 ++++++++++++++++++++++++----------------------------
 1 files changed, 24 insertions(+), 28 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/cassandra/Storage.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/cassandra/Storage.java
index b807234..547b085 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/cassandra/Storage.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/cassandra/Storage.java
@@ -62,7 +62,6 @@
 import com.datastax.oss.driver.api.core.cql.ResultSet;
 import com.datastax.oss.driver.api.core.cql.Row;
 import com.datastax.oss.driver.api.core.cql.Statement;
-import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
@@ -311,6 +310,8 @@
 		public CursorImpl(TransactionImpl tx,TreeName treeName) {
 			this.treeName=treeName;
 			this.tx=tx;
+			rc=full();
+			iterator=rc.iterator();
 		}
 
 		ResultSet full(){
@@ -322,10 +323,6 @@
 		
 		@Override
 		public boolean next() {
-			if (iterator==null) {
-				rc=full();
-				iterator=rc.iterator();
-			}
 			try {
 				current=iterator.next();
 				return true;
@@ -371,20 +368,17 @@
 			rc=null;
 		}
 
-		ResultSet full(ByteSequence key){
-			return execute(
-						prepared.getUnchecked("SELECT key,value FROM "+getTableName()+" WHERE baseDN=:baseDN and indexId=:indexId and key>=:key ORDER BY key").bind()
-							.setString("baseDN", treeName.getBaseDN()).setString("indexId", treeName.getIndexId()) 
-							.setByteBuffer("key", ByteBuffer.wrap(key.toByteArray()))
-						);
-		}
+
 		@Override
 		public boolean positionToKeyOrNext(ByteSequence key) {
-			rc=full(key); // start iterator from key key>=:key 
-			iterator=rc.iterator();
-			if (iterator.hasNext()) {
+			if (!isDefined() || key.compareTo(getKey())<0) { //restart iterator
+				iterator=rc.iterator();
+			}
+			while (iterator.hasNext()) {
 				current=iterator.next();
-				return true;
+				if (key.compareTo(getKey())<=0) {
+					return true;
+				}
 			}
 			current=null;
 			return false;
@@ -392,35 +386,37 @@
 		
 		@Override
 		public boolean positionToKey(ByteSequence key) {
-			if (positionToKeyOrNext(key) && key.equals(getKey())){
+			if (!isDefined() || key.compareTo(getKey())<0) {  //restart iterator
+				iterator=rc.iterator();
+			}
+			if (isDefined() && key.compareTo(getKey())==0) {
 				return true;
 			}
+			while (iterator.hasNext()) {
+				current=iterator.next();
+				if (key.compareTo(getKey())==0) {
+					return true;
+				}
+			}
 			current=null;
 			return false;
 		}
 
-		ResultSet last(){
-			return execute(
-						prepared.getUnchecked("SELECT key,value FROM "+getTableName()+" WHERE baseDN=:baseDN and indexId=:indexId ORDER BY key DESC LIMIT 1").bind()
-							.setString("baseDN", treeName.getBaseDN()).setString("indexId", treeName.getIndexId()) 
-						);
-		}
 		
 		@Override
 		public boolean positionToLastKey() {
-			rc=last(); 
-			iterator=rc.iterator();
-			if (iterator.hasNext()) {
+			while (iterator.hasNext()) {
 				current=iterator.next();
+			}
+			if (current!=null) {
 				return true;
 			}
-			current=null;
 			return false;
 		}
 
 		@Override
 		public boolean positionToIndex(int index) {
-			iterator=rc.iterator(); //reset position
+			iterator=rc.iterator();  //restart iterator
 			int ct=0;
 			while(iterator.hasNext()){
 				current=iterator.next();

--
Gitblit v1.10.0