You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2017/03/09 14:54:45 UTC

ignite git commit: WIP.

Repository: ignite
Updated Branches:
  refs/heads/ignite-4565-ddl 318ddedaf -> 9e32da96e


WIP.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/9e32da96
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9e32da96
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9e32da96

Branch: refs/heads/ignite-4565-ddl
Commit: 9e32da96efb1cef44c81a360e35a494715b6483b
Parents: 318dded
Author: devozerov <vo...@gridgain.com>
Authored: Thu Mar 9 17:54:37 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Thu Mar 9 17:54:37 2017 +0300

----------------------------------------------------------------------
 .../query/QueryIndexDescriptorImpl.java         |  14 ++-
 .../processors/query/QueryIndexHandler.java     | 126 +++++++++++++++----
 .../query/QueryTypeDescriptorImpl.java          |  12 +-
 3 files changed, 127 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9e32da96/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
index 53a0dfe..ad2ed6c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexDescriptorImpl.java
@@ -45,18 +45,30 @@ public class QueryIndexDescriptorImpl implements GridQueryIndexDescriptor {
     /** Fields which should be indexed in descending order. */
     private Collection<String> descendings;
 
+    /** Index name. */
+    private final String name;
+
     /** */
     private final QueryIndexType type;
 
     /**
+     * @param name Index name.
      * @param type Type.
      */
-    public QueryIndexDescriptorImpl(QueryIndexType type) {
+    public QueryIndexDescriptorImpl(String name, QueryIndexType type) {
         assert type != null;
 
+        this.name = name;
         this.type = type;
     }
 
+    /**
+     * @return Index name.
+     */
+    public String name() {
+        return name;
+    }
+
     /** {@inheritDoc} */
     @Override public Collection<String> fields() {
         Collection<String> res = new ArrayList<>(fields.size());

http://git-wip-us.apache.org/repos/asf/ignite/blob/9e32da96/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexHandler.java
index f40b8dc..c67a585 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryIndexHandler.java
@@ -8,8 +8,10 @@ import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
 import org.apache.ignite.internal.util.future.GridFutureAdapter;
+import org.apache.ignite.internal.util.typedef.F;
 
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -26,8 +28,8 @@ public class QueryIndexHandler {
     /** Logger. */
     private final IgniteLogger log;
 
-    /** Indexes. */
-    private final Map<String, QueryIndexDescriptorImpl> idxs = new ConcurrentHashMap<>();
+    /** All indexes. */
+    private final Map<String, Descriptor> idxs = new ConcurrentHashMap<>();
 
     /** Client futures. */
     private final Map<UUID, GridFutureAdapter> cliFuts = new ConcurrentHashMap<>();
@@ -78,11 +80,28 @@ public class QueryIndexHandler {
      * Handle cache creation.
      *
      * @param cacheName Cache name.
-     * @param typDescs Type descriptors.
+     * @param typs Type descriptors.
      */
-    public void onCacheCreated(String cacheName, Collection<QueryTypeDescriptorImpl> typDescs) {
-        // TODO: Make sure indexes are unique.
-//        this.idxs.put(typ.indexes());
+    public void onCacheCreated(String cacheName, Collection<QueryTypeDescriptorImpl> typs) {
+        lock.writeLock().lock();
+
+        try {
+            for (QueryTypeDescriptorImpl typ : typs) {
+                for (QueryIndexDescriptorImpl idx : typ.indexes0()) {
+                    Descriptor desc = idxs.get(idx.name());
+
+                    if (desc != null) {
+                        throw new IgniteException("Duplicate index name [idxName=" + idx.name() +
+                            ", existingCache=" + desc.type().cacheName() + ", newCache=" + cacheName + ']');
+                    }
+
+                    idxs.put(idx.name(), new Descriptor(typ, idx));
+                }
+            }
+        }
+        finally {
+            lock.writeLock().unlock();
+        }
     }
 
     /**
@@ -91,7 +110,21 @@ public class QueryIndexHandler {
      * @param cacheName Cache name.
      */
     public void onCacheStopped(String cacheName) {
-        // TODO
+        lock.writeLock().lock();
+
+        try {
+            Iterator<Map.Entry<String, Descriptor>> iter = idxs.entrySet().iterator();
+
+            while (iter.hasNext()) {
+                Map.Entry<String, Descriptor> entry = iter.next();
+
+                if (F.eq(cacheName, entry.getValue().type().cacheName()))
+                    iter.remove();
+            }
+        }
+        finally {
+            lock.writeLock().unlock();
+        }
     }
 
     /**
@@ -100,7 +133,21 @@ public class QueryIndexHandler {
      * @param desc Descriptor.
      */
     public void onTypeUnregistered(QueryTypeDescriptorImpl desc) {
-        // TODO
+        lock.writeLock().lock();
+
+        try {
+            Iterator<Map.Entry<String, Descriptor>> iter = idxs.entrySet().iterator();
+
+            while (iter.hasNext()) {
+                Map.Entry<String, Descriptor> entry = iter.next();
+
+                if (F.eq(desc, entry.getValue().type()))
+                    iter.remove();
+            }
+        }
+        finally {
+            lock.writeLock().unlock();
+        }
     }
 
     /**
@@ -119,24 +166,23 @@ public class QueryIndexHandler {
      */
     public IgniteInternalFuture<?> onCreateIndex(String cacheName, String tblName, QueryIndex idx,
         boolean ifNotExists) {
-        // TODO: Integrated from previous impl:
-//        for (QueryTypeDescriptorImpl desc : types.values()) {
-//            if (desc.matchCacheAndTable(space, tblName))
-//                return desc.dynamicIndexCreate(idx, ifNotExists);
-//        }
-//
-//        return new GridFinishedFuture<>(new IgniteException("Failed to create index becase table is not found [" +
-//            "space=" + space + ", table=" + tblName + ']'));
+        String idxName = idx.getName() != null ? idx.getName() : QueryEntity.defaultIndexName(idx);
 
-
-        lock.writeLock().lock();
+        lock.readLock().lock();
 
         try {
-            String idxName = idx.getName() != null ? idx.getName() : QueryEntity.defaultIndexName(idx);
+            Descriptor oldIdxDesc = idxs.get(idxName);
 
-            QueryIndexDescriptorImpl oldIdx = idxs.get(idxName);
+            if (oldIdxDesc != null) {
+                // Make sure that index is bound to the same table.
+                String oldTblName = oldIdxDesc.type().tableName();
+
+                if (!F.eq(oldTblName, tblName)) {
+                    return new GridFinishedFuture<>(new IgniteException("Index already exists and is bound to " +
+                        "another table [idxName=" + idxName + ", expTblName=" + oldTblName +
+                        ", actualTblName=" + tblName + ']'));
+                }
 
-            if (oldIdx != null) {
                 if (ifNotExists)
                     return new GridFinishedFuture<>();
                 else
@@ -156,7 +202,43 @@ public class QueryIndexHandler {
             return fut;
         }
         finally {
-            lock.writeLock().unlock();
+            lock.readLock().unlock();
+        }
+    }
+
+    /**
+     * Type and index descriptor.
+     */
+    private static final class Descriptor {
+        /** Type. */
+        private final QueryTypeDescriptorImpl typ;
+
+        /** Index. */
+        private final QueryIndexDescriptorImpl idx;
+
+        /**
+         * Constructor.
+         *
+         * @param typ Type.
+         * @param idx Index.
+         */
+        private Descriptor(QueryTypeDescriptorImpl typ, QueryIndexDescriptorImpl idx) {
+            this.typ = typ;
+            this.idx = idx;
+        }
+
+        /**
+         * @return Type.
+         */
+        public QueryTypeDescriptorImpl type() {
+            return typ;
+        }
+
+        /**
+         * @return Index.
+         */
+        public QueryIndexDescriptorImpl index() {
+            return idx;
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/9e32da96/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
index 983a6f4..f38c23b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java
@@ -24,6 +24,7 @@ import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -196,6 +197,13 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
         return Collections.<String, GridQueryIndexDescriptor>unmodifiableMap(indexes);
     }
 
+    /**
+     * @return Raw index descriptors.
+     */
+    public Collection<QueryIndexDescriptorImpl> indexes0() {
+        return indexes.values();
+    }
+
     /** {@inheritDoc} */
     @Override public GridQueryIndexDescriptor textIndex() {
         return fullTextIdx;
@@ -210,7 +218,7 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
      * @throws IgniteCheckedException In case of error.
      */
     public QueryIndexDescriptorImpl addIndex(String idxName, QueryIndexType type) throws IgniteCheckedException {
-        QueryIndexDescriptorImpl idx = new QueryIndexDescriptorImpl(type);
+        QueryIndexDescriptorImpl idx = new QueryIndexDescriptorImpl(idxName, type);
 
         if (indexes.put(idxName, idx) != null)
             throw new IgniteCheckedException("Index with name '" + idxName + "' already exists.");
@@ -243,7 +251,7 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor {
      */
     public void addFieldToTextIndex(String field) {
         if (fullTextIdx == null)
-            fullTextIdx = new QueryIndexDescriptorImpl(QueryIndexType.FULLTEXT);
+            fullTextIdx = new QueryIndexDescriptorImpl(null, QueryIndexType.FULLTEXT);
 
         fullTextIdx.addField(field, 0, false);
     }