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);
}