This is an automated email from the ASF dual-hosted git repository.

samt pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 3ddfbc8  Add specialized IndexRegistry for offline tools/clients
3ddfbc8 is described below

commit 3ddfbc8f5871c78bde26e96a936e96deeccb4366
Author: Sam Tunnicliffe <s...@beobal.com>
AuthorDate: Fri Dec 14 16:30:05 2018 +0000

    Add specialized IndexRegistry for offline tools/clients
    
    Patch by Sam Tunnicliffe; reviewed by Marcus Eriksson for CASSANDRA-14938
---
 CHANGES.txt                                        |   1 +
 .../org/apache/cassandra/index/IndexRegistry.java  | 144 ++++++++++++++++++++-
 2 files changed, 144 insertions(+), 1 deletion(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 4254ae2..32217d9 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0
+ * Use a stub IndexRegistry for non-daemon use cases (CASSANDRA-14938)
  * Don't enable client transports when bootstrap is pending (CASSANDRA-14525)
  * Make antiCompactGroup throw exception on error and anticompaction non 
cancellable
    again (CASSANDRA-14936)
diff --git a/src/java/org/apache/cassandra/index/IndexRegistry.java 
b/src/java/org/apache/cassandra/index/IndexRegistry.java
index e4c531b..0cf1cbb 100644
--- a/src/java/org/apache/cassandra/index/IndexRegistry.java
+++ b/src/java/org/apache/cassandra/index/IndexRegistry.java
@@ -23,10 +23,20 @@ package org.apache.cassandra.index;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Optional;
+import java.util.concurrent.Callable;
+import java.util.function.BiFunction;
 
-import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.Operator;
+import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.RowFilter;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.partitions.PartitionIterator;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.index.transactions.IndexTransaction;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 
@@ -79,6 +89,135 @@ public interface IndexRegistry
         }
     };
 
+    /**
+     * An {@code IndexRegistry} intended for use when Cassandra is initialized 
in client or tool mode.
+     * Contains a single stub {@code Index} which possesses no actual indexing 
or searching capabilities
+     * but enables query validation and preparation to succeed. Useful for 
tools which need to prepare
+     * CQL statements without instantiating the whole ColumnFamilyStore 
infrastructure.
+     */
+    public static final IndexRegistry NON_DAEMON = new IndexRegistry()
+    {
+        Index index = new Index()
+        {
+            public Callable<?> getInitializationTask()
+            {
+                return null;
+            }
+
+            public IndexMetadata getIndexMetadata()
+            {
+                return null;
+            }
+
+            public Callable<?> getMetadataReloadTask(IndexMetadata 
indexMetadata)
+            {
+                return null;
+            }
+
+            public void register(IndexRegistry registry)
+            {
+
+            }
+
+            public Optional<ColumnFamilyStore> getBackingTable()
+            {
+                return Optional.empty();
+            }
+
+            public Callable<?> getBlockingFlushTask()
+            {
+                return null;
+            }
+
+            public Callable<?> getInvalidateTask()
+            {
+                return null;
+            }
+
+            public Callable<?> getTruncateTask(long truncatedAt)
+            {
+                return null;
+            }
+
+            public boolean shouldBuildBlocking()
+            {
+                return false;
+            }
+
+            public boolean dependsOn(ColumnMetadata column)
+            {
+                return false;
+            }
+
+            public boolean supportsExpression(ColumnMetadata column, Operator 
operator)
+            {
+                return true;
+            }
+
+            public AbstractType<?> customExpressionValueType()
+            {
+                return BytesType.instance;
+            }
+
+            public RowFilter getPostIndexQueryFilter(RowFilter filter)
+            {
+                return null;
+            }
+
+            public long getEstimatedResultRows()
+            {
+                return 0;
+            }
+
+            public void validate(PartitionUpdate update) throws 
InvalidRequestException
+            {
+            }
+
+            public Indexer indexerFor(DecoratedKey key, 
RegularAndStaticColumns columns, int nowInSec, WriteContext ctx, 
IndexTransaction.Type transactionType)
+            {
+                return null;
+            }
+
+            public BiFunction<PartitionIterator, ReadCommand, 
PartitionIterator> postProcessorFor(ReadCommand command)
+            {
+                return null;
+            }
+
+            public Searcher searcherFor(ReadCommand command)
+            {
+                return null;
+            }
+        };
+
+        public void registerIndex(Index index)
+        {
+        }
+
+        public void unregisterIndex(Index index)
+        {
+        }
+
+        public Index getIndex(IndexMetadata indexMetadata)
+        {
+            return index;
+        }
+
+        public Collection<Index> listIndexes()
+        {
+            return Collections.singletonList(index);
+        }
+
+        public Optional<Index> getBestIndexFor(RowFilter.Expression expression)
+        {
+            return Optional.empty();
+        }
+
+        public void validate(PartitionUpdate update)
+        {
+
+        }
+    };
+
     void registerIndex(Index index);
     void unregisterIndex(Index index);
 
@@ -106,6 +245,9 @@ public interface IndexRegistry
      */
     public static IndexRegistry obtain(TableMetadata table)
     {
+        if (!DatabaseDescriptor.isDaemonInitialized())
+            return NON_DAEMON;
+
         return table.isVirtual() ? EMPTY : 
Keyspace.openAndGetStore(table).indexManager;
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to