Merge branches 'ignite-745' and 'ignite-sprint-5' of https://git-wip-us.apache.org/repos/asf/incubator-ignite into ignite-745
Conflicts: modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/f8169a95 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/f8169a95 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/f8169a95 Branch: refs/heads/ignite-389 Commit: f8169a95fefac6187087c0b2137e234aceeae540 Parents: b32b5e3 Author: Yakov Zhdanov <yzhda...@gridgain.com> Authored: Tue Jun 2 16:08:17 2015 +0300 Committer: Yakov Zhdanov <yzhda...@gridgain.com> Committed: Tue Jun 2 16:08:17 2015 +0300 ---------------------------------------------------------------------- .../apache/ignite/cache/query/QueryMetrics.java | 7 +- .../processors/query/GridQueryProcessor.java | 202 ++++++++++--------- 2 files changed, 115 insertions(+), 94 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8169a95/modules/core/src/main/java/org/apache/ignite/cache/query/QueryMetrics.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/query/QueryMetrics.java b/modules/core/src/main/java/org/apache/ignite/cache/query/QueryMetrics.java index e3f63a1..ef8fc49 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/query/QueryMetrics.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/query/QueryMetrics.java @@ -17,11 +17,12 @@ package org.apache.ignite.cache.query; -import org.apache.ignite.internal.processors.cache.query.CacheQuery; +import org.apache.ignite.internal.processors.cache.query.*; /** - * Cache query metrics used to obtain statistics on query. You can get metrics for particular query - * via {@link CacheQuery#metrics()} method or accumulated metrics for all queries via {@link CacheQuery#metrics()}. + * Cache query metrics used to obtain statistics on query. Metrics for particular query + * can be get via {@link CacheQuery#metrics()} method or aggregated metrics for all queries + * via {@link CacheQuery#metrics()}. */ public interface QueryMetrics { /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f8169a95/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index 03316d2..ed8e1e2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -121,7 +121,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (F.isEmpty(meta.getValueType())) throw new IgniteCheckedException("Value type is not set: " + meta); - TypeDescriptor desc = new TypeDescriptor(ccfg); + TypeDescriptor desc = new TypeDescriptor(); Class<?> valCls = U.classForName(meta.getValueType(), null); @@ -160,7 +160,7 @@ public class GridQueryProcessor extends GridProcessorAdapter { Class<?> keyCls = clss[i]; Class<?> valCls = clss[i + 1]; - TypeDescriptor desc = processKeyAndValueClasses(ccfg, keyCls, valCls); + TypeDescriptor desc = processKeyAndValueClasses(keyCls, valCls); addTypeByName(ccfg, desc); types.put(new TypeId(ccfg.getName(), valCls), desc); @@ -188,15 +188,17 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * @param ccfg Cache configuration. * @param keyCls Key class. * @param valCls Value class. * @return Type descriptor. * @throws IgniteCheckedException If failed. */ - private TypeDescriptor processKeyAndValueClasses(CacheConfiguration<?,?> ccfg, Class<?> keyCls, Class<?> valCls) + private TypeDescriptor processKeyAndValueClasses( + Class<?> keyCls, + Class<?> valCls + ) throws IgniteCheckedException { - TypeDescriptor d = new TypeDescriptor(ccfg); + TypeDescriptor d = new TypeDescriptor(); d.keyClass(keyCls); d.valueClass(valCls); @@ -318,7 +320,12 @@ public class GridQueryProcessor extends GridProcessorAdapter { throw new IllegalStateException("Failed to rebuild indexes (grid is stopping)."); try { - return rebuildIndexes(space, typesByName.get(new TypeName(space, valTypeName))); + return rebuildIndexes( + space, + typesByName.get( + new TypeName( + space, + valTypeName))); } finally { busyLock.leaveBusy(); @@ -539,7 +546,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { throw new IllegalStateException("Failed to execute query (grid is stopping)."); try { - return idx.queryTwoStep(ctx.cache().internalCache(space).context(), qry); + return idx.queryTwoStep( + ctx.cache().internalCache(space).context(), + qry); } finally { busyLock.leaveBusy(); @@ -589,49 +598,62 @@ public class GridQueryProcessor extends GridProcessorAdapter { * @param qry Query. * @return Cursor. */ - public <K,V> Iterator<Cache.Entry<K,V>> queryLocal(final GridCacheContext<?,?> cctx, final SqlQuery qry) { + public <K, V> Iterator<Cache.Entry<K, V>> queryLocal(final GridCacheContext<?, ?> cctx, final SqlQuery qry) { if (!busyLock.enterBusy()) throw new IllegalStateException("Failed to execute query (grid is stopping)."); try { - return executeQuery(cctx, new IgniteOutClosureX<Iterator<Cache.Entry<K, V>>>() { - @Override public Iterator<Cache.Entry<K, V>> applyx() throws IgniteCheckedException { - String space = cctx.name(); - String type = qry.getType(); - String sqlQry = qry.getSql(); - Object[] params = qry.getArgs(); - - TypeDescriptor typeDesc = typesByName.get(new TypeName(space, type)); - - if (typeDesc == null || !typeDesc.registered()) - throw new CacheException("Failed to find SQL table for type: " + type); - - final GridCloseableIterator<IgniteBiTuple<K, V>> i = idx.query(space, sqlQry, F.asList(params), - typeDesc, idx.backupFilter()); - - sendQueryExecutedEvent(sqlQry, params); - - return new ClIter<Cache.Entry<K, V>>() { - @Override public void close() throws Exception { - i.close(); - } - - @Override public boolean hasNext() { - return i.hasNext(); - } - - @Override public Cache.Entry<K, V> next() { - IgniteBiTuple<K, V> t = i.next(); - - return new CacheEntryImpl<>(t.getKey(), t.getValue()); - } - - @Override public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - }); + return executeQuery( + cctx, + new IgniteOutClosureX<Iterator<Cache.Entry<K, V>>>() { + @Override public Iterator<Cache.Entry<K, V>> applyx() throws IgniteCheckedException { + String space = cctx.name(); + String type = qry.getType(); + String sqlQry = qry.getSql(); + Object[] params = qry.getArgs(); + + TypeDescriptor typeDesc = typesByName.get( + new TypeName( + space, + type)); + + if (typeDesc == null || !typeDesc.registered()) + throw new CacheException("Failed to find SQL table for type: " + type); + + final GridCloseableIterator<IgniteBiTuple<K, V>> i = idx.query( + space, + sqlQry, + F.asList(params), + typeDesc, + idx.backupFilter()); + + sendQueryExecutedEvent( + sqlQry, + params); + + return new ClIter<Cache.Entry<K, V>>() { + @Override public void close() throws Exception { + i.close(); + } + + @Override public boolean hasNext() { + return i.hasNext(); + } + + @Override public Cache.Entry<K, V> next() { + IgniteBiTuple<K, V> t = i.next(); + + return new CacheEntryImpl<>( + t.getKey(), + t.getValue()); + } + + @Override public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + }); } catch (IgniteCheckedException e) { throw new IgniteException(e); @@ -795,7 +817,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (type == null || !type.registered()) throw new CacheException("Failed to find SQL table for type: " + resType); - return idx.queryText(space, clause, type, filters); + return idx.queryText( + space, + clause, + type, + filters); } finally { busyLock.leaveBusy(); @@ -839,7 +865,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (ctx.indexing().enabled()) { CacheObjectContext coctx = cacheObjectContext(spaceName); - ctx.indexing().onSwap(spaceName, key.value(coctx, false)); + ctx.indexing().onSwap( + spaceName, + key.value( + coctx, + false)); } if (idx == null) @@ -849,7 +879,9 @@ public class GridQueryProcessor extends GridProcessorAdapter { throw new IllegalStateException("Failed to process swap event (grid is stopping)."); try { - idx.onSwap(spaceName, key); + idx.onSwap( + spaceName, + key); } finally { busyLock.leaveBusy(); @@ -1069,7 +1101,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { assert valCls != null; for (Map.Entry<String, Class<?>> entry : meta.getAscendingFields().entrySet()) { - ClassProperty prop = buildClassProperty(keyCls, valCls, entry.getKey(), entry.getValue()); + ClassProperty prop = buildClassProperty( + keyCls, + valCls, + entry.getKey(), + entry.getValue()); d.addProperty(prop, false); @@ -1081,7 +1117,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (Map.Entry<String, Class<?>> entry : meta.getDescendingFields().entrySet()) { - ClassProperty prop = buildClassProperty(keyCls, valCls, entry.getKey(), entry.getValue()); + ClassProperty prop = buildClassProperty( + keyCls, + valCls, + entry.getKey(), + entry.getValue()); d.addProperty(prop, false); @@ -1093,7 +1133,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (String txtIdx : meta.getTextFields()) { - ClassProperty prop = buildClassProperty(keyCls, valCls, txtIdx, String.class); + ClassProperty prop = buildClassProperty( + keyCls, + valCls, + txtIdx, + String.class); d.addProperty(prop, false); @@ -1111,7 +1155,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { int order = 0; for (Map.Entry<String, IgniteBiTuple<Class<?>, Boolean>> idxField : idxFields.entrySet()) { - ClassProperty prop = buildClassProperty(keyCls, valCls, idxField.getKey(), idxField.getValue().get1()); + ClassProperty prop = buildClassProperty( + keyCls, + valCls, + idxField.getKey(), + idxField.getValue().get1()); d.addProperty(prop, false); @@ -1125,7 +1173,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { } for (Map.Entry<String, Class<?>> entry : meta.getQueryFields().entrySet()) { - ClassProperty prop = buildClassProperty(keyCls, valCls, entry.getKey(), entry.getValue()); + ClassProperty prop = buildClassProperty( + keyCls, + valCls, + entry.getKey(), + entry.getValue()); d.addProperty(prop, false); } @@ -1233,7 +1285,11 @@ public class GridQueryProcessor extends GridProcessorAdapter { */ private static ClassProperty buildClassProperty(Class<?> keyCls, Class<?> valCls, String pathStr, Class<?> resType) throws IgniteCheckedException { - ClassProperty res = buildClassProperty(true, keyCls, pathStr, resType); + ClassProperty res = buildClassProperty( + true, + keyCls, + pathStr, + resType); if (res == null) // We check key before value consistently with PortableProperty. res = buildClassProperty(false, valCls, pathStr, resType); @@ -1332,31 +1388,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { } /** - * @param cls Field type. - * @return {@code True} if given type is a spatial geometry type based on {@code com.vividsolutions.jts} library. - * @throws IgniteCheckedException If failed. - */ - private static boolean isGeometryClass(Class<?> cls) throws IgniteCheckedException { // TODO optimize - Class<?> dataTypeCls; - - try { - dataTypeCls = Class.forName("org.h2.value.DataType"); - } - catch (ClassNotFoundException ignored) { - return false; // H2 is not in classpath. - } - - try { - Method method = dataTypeCls.getMethod("isGeometryClass", Class.class); - - return (Boolean)method.invoke(null, cls); - } - catch (Exception e) { - throw new IgniteCheckedException("Failed to invoke 'org.h2.value.DataType.isGeometryClass' method.", e); - } - } - - /** * @param cctx Cache context. * @param clo Closure. */ @@ -1407,7 +1438,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { if (log.isTraceEnabled()) log.trace("Query execution finished [startTime=" + startTime + ", duration=" + duration + ", fail=" + (err != null) + ", res=" + res + ']'); - } /** @@ -1619,9 +1649,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { */ private static class TypeDescriptor implements GridQueryTypeDescriptor { /** */ - private CacheConfiguration<?,?> ccfg; - - /** */ private String name; /** Value field names and types with preserved order. */ @@ -1652,13 +1679,6 @@ public class GridQueryProcessor extends GridProcessorAdapter { private boolean registered; /** - * @param ccfg Cache configuration. - */ - private TypeDescriptor(CacheConfiguration<?,?> ccfg) { - this.ccfg = ccfg; - } - - /** * @return {@code True} if type registration in SPI was finished and type was not rejected. */ boolean registered() {