Repository: ignite Updated Branches: refs/heads/master 654ccf016 -> 5d63d7f44
IGNITE-7701: SQL: implemented NODE_ATTRIBUTES system view. This closes #4445. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5d63d7f4 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5d63d7f4 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5d63d7f4 Branch: refs/heads/master Commit: 5d63d7f44c343c72deb4ff1b3f5a41362646f1a4 Parents: 654ccf0 Author: Aleksey Plekhanov <plehanov.a...@gmail.com> Authored: Fri Aug 17 17:10:04 2018 +0300 Committer: devozerov <voze...@gridgain.com> Committed: Fri Aug 17 17:10:04 2018 +0300 ---------------------------------------------------------------------- .../processors/query/h2/IgniteH2Indexing.java | 2 + .../processors/query/h2/sys/SqlSystemIndex.java | 5 +- .../processors/query/h2/sys/SqlSystemTable.java | 4 +- .../h2/sys/view/SqlAbstractLocalSystemView.java | 18 +++- .../query/h2/sys/view/SqlSystemView.java | 3 +- .../sys/view/SqlSystemViewNodeAttributes.java | 108 +++++++++++++++++++ .../query/h2/sys/view/SqlSystemViewNodes.java | 23 +--- .../query/SqlSystemViewsSelfTest.java | 38 ++++++- 8 files changed, 171 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java index cff2525..5f74c04 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java @@ -114,6 +114,7 @@ import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser; import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter; import org.apache.ignite.internal.processors.query.h2.sql.GridSqlStatement; import org.apache.ignite.internal.processors.query.h2.sys.SqlSystemTableEngine; +import org.apache.ignite.internal.processors.query.h2.sys.view.SqlSystemViewNodeAttributes; import org.apache.ignite.internal.processors.query.h2.sys.view.SqlSystemViewNodes; import org.apache.ignite.internal.processors.query.h2.twostep.GridMapQueryExecutor; import org.apache.ignite.internal.processors.query.h2.twostep.GridReduceQueryExecutor; @@ -2641,6 +2642,7 @@ public class IgniteH2Indexing implements GridQueryIndexing { Collection<SqlSystemView> views = new ArrayList<>(); views.add(new SqlSystemViewNodes(ctx)); + views.add(new SqlSystemViewNodeAttributes(ctx)); return views; } http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemIndex.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemIndex.java index 55f5f29..2b4896e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemIndex.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.query.h2.sys; +import java.util.Iterator; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Cursor; import org.h2.engine.Session; import org.h2.index.BaseIndex; @@ -73,9 +74,9 @@ public class SqlSystemIndex extends BaseIndex { @Override public Cursor find(Session ses, SearchRow first, SearchRow last) { assert table instanceof SqlSystemTable; - Iterable<Row> rows = ((SqlSystemTable)table).getRows(ses, first, last); + Iterator<Row> rows = ((SqlSystemTable)table).getRows(ses, first, last); - return new GridH2Cursor(rows.iterator()); + return new GridH2Cursor(rows); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemTable.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemTable.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemTable.java index 23106ee..664da0f 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemTable.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/SqlSystemTable.java @@ -18,7 +18,7 @@ package org.apache.ignite.internal.processors.query.h2.sys; import java.util.ArrayList; - +import java.util.Iterator; import org.apache.ignite.internal.processors.query.h2.sys.view.SqlSystemView; import org.h2.command.ddl.CreateTableData; import org.h2.engine.Session; @@ -202,7 +202,7 @@ public class SqlSystemTable extends TableBase { * @param first First. * @param last Last. */ - public Iterable<Row> getRows(Session ses, SearchRow first, SearchRow last) { + public Iterator<Row> getRows(Session ses, SearchRow first, SearchRow last) { return view.getRows(ses, first, last); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java index c601708..e8d52d2 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlAbstractLocalSystemView.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.query.h2.sys.view; +import java.util.UUID; import org.apache.ignite.internal.GridKernalContext; import org.h2.engine.Session; import org.h2.result.Row; @@ -27,7 +28,7 @@ import org.h2.value.ValueNull; import org.h2.value.ValueString; /** - * Local meta view base class (which uses only local node data). + * Local system view base class (which uses only local node data). */ public abstract class SqlAbstractLocalSystemView extends SqlAbstractSystemView { /** @@ -42,7 +43,6 @@ public abstract class SqlAbstractLocalSystemView extends SqlAbstractSystemView { super(tblName, desc, ctx, cols, indexes); assert tblName != null; - assert ctx != null; assert cols != null; assert indexes != null; } @@ -101,4 +101,18 @@ public abstract class SqlAbstractLocalSystemView extends SqlAbstractSystemView { protected SqlSystemViewColumnCondition conditionForColumn(String colName, SearchRow first, SearchRow last) { return SqlSystemViewColumnCondition.forColumn(getColumnIndex(colName), first, last); } + + /** + * Converts value to UUID safe (suppressing exceptions). + * + * @param val UUID. + */ + protected static UUID uuidFromValue(Value val) { + try { + return UUID.fromString(val.getString()); + } + catch (RuntimeException e) { + return null; + } + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemView.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemView.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemView.java index 7eab521..93fdfa0 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemView.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemView.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.query.h2.sys.view; +import java.util.Iterator; import org.h2.engine.Session; import org.h2.result.Row; import org.h2.result.SearchRow; @@ -53,7 +54,7 @@ public interface SqlSystemView { * @param first First. * @param last Last. */ - public Iterable<Row> getRows(Session ses, SearchRow first, SearchRow last); + public Iterator<Row> getRows(Session ses, SearchRow first, SearchRow last); /** * Gets row count for this view (or approximated row count, if real value can't be calculated quickly). http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeAttributes.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeAttributes.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeAttributes.java new file mode 100644 index 0000000..1ba0c7f --- /dev/null +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodeAttributes.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.query.h2.sys.view; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.util.typedef.F; +import org.h2.engine.Session; +import org.h2.result.Row; +import org.h2.result.SearchRow; +import org.h2.value.Value; + +/** + * System view: node attributes. + */ +public class SqlSystemViewNodeAttributes extends SqlAbstractLocalSystemView { + /** + * @param ctx Grid context. + */ + public SqlSystemViewNodeAttributes(GridKernalContext ctx) { + super("NODE_ATTRIBUTES", "Node attributes", ctx, new String[] {"NODE_ID,NAME", "NAME"}, + newColumn("NODE_ID", Value.UUID), + newColumn("NAME"), + newColumn("VALUE") + ); + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override public Iterator<Row> getRows(Session ses, SearchRow first, SearchRow last) { + Collection<ClusterNode> nodes; + + SqlSystemViewColumnCondition idCond = conditionForColumn("NODE_ID", first, last); + SqlSystemViewColumnCondition nameCond = conditionForColumn("NAME", first, last); + + if (idCond.isEquality()) { + try { + UUID nodeId = uuidFromValue(idCond.valueForEquality()); + + ClusterNode node = nodeId == null ? null : ctx.discovery().node(nodeId); + + if (node != null) + nodes = Collections.singleton(node); + else + nodes = Collections.emptySet(); + } + catch (Exception e) { + nodes = Collections.emptySet(); + } + } + else + nodes = F.concat(false, ctx.discovery().allNodes(), ctx.discovery().daemonNodes()); + + if (nameCond.isEquality()) { + String attrName = nameCond.valueForEquality().getString(); + + List<Row> rows = new ArrayList<>(); + + for (ClusterNode node : nodes) { + if (node.attributes().containsKey(attrName)) + rows.add( + createRow(ses, rows.size(), + node.id(), + attrName, + node.attribute(attrName) + ) + ); + } + + return rows.iterator(); + } + else { + AtomicLong rowKey = new AtomicLong(); + + return F.concat(F.iterator(nodes, + node -> F.iterator(node.attributes().entrySet(), + attr -> createRow(ses, + rowKey.incrementAndGet(), + node.id(), + attr.getKey(), + attr.getValue()), + true).iterator(), + true)); + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodes.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodes.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodes.java index e944b4f..3e97faa 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodes.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/sys/view/SqlSystemViewNodes.java @@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.query.h2.sys.view; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.UUID; import org.apache.ignite.cluster.ClusterNode; @@ -31,7 +32,7 @@ import org.h2.result.SearchRow; import org.h2.value.Value; /** - * Meta view: nodes. + * System view: nodes. */ public class SqlSystemViewNodes extends SqlAbstractLocalSystemView { /** @@ -52,7 +53,7 @@ public class SqlSystemViewNodes extends SqlAbstractLocalSystemView { } /** {@inheritDoc} */ - @Override public Iterable<Row> getRows(Session ses, SearchRow first, SearchRow last) { + @Override public Iterator<Row> getRows(Session ses, SearchRow first, SearchRow last) { List<Row> rows = new ArrayList<>(); Collection<ClusterNode> nodes; @@ -63,7 +64,7 @@ public class SqlSystemViewNodes extends SqlAbstractLocalSystemView { if (locCond.isEquality() && locCond.valueForEquality().getBoolean()) nodes = Collections.singleton(ctx.discovery().localNode()); else if (idCond.isEquality()) { - UUID nodeId = uuidFromString(idCond.valueForEquality().getString()); + UUID nodeId = uuidFromValue(idCond.valueForEquality()); nodes = nodeId == null ? Collections.emptySet() : Collections.singleton(ctx.discovery().node(nodeId)); } @@ -87,7 +88,7 @@ public class SqlSystemViewNodes extends SqlAbstractLocalSystemView { ); } - return rows; + return rows.iterator(); } /** {@inheritDoc} */ @@ -99,18 +100,4 @@ public class SqlSystemViewNodes extends SqlAbstractLocalSystemView { @Override public long getRowCount() { return ctx.discovery().allNodes().size() + ctx.discovery().daemonNodes().size(); } - - /** - * Converts string to UUID safe (suppressing exceptions). - * - * @param val UUID in string format. - */ - private static UUID uuidFromString(String val) { - try { - return UUID.fromString(val); - } - catch (RuntimeException e) { - return null; - } - } } http://git-wip-us.apache.org/repos/asf/ignite/blob/5d63d7f4/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java index 9c7ce38..acd2a1c 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java @@ -26,13 +26,14 @@ import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.internal.IgniteNodeAttributes; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.testframework.GridTestUtils; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; /** - * Tests for ignite SQL meta views. + * Tests for ignite SQL system views. */ public class SqlSystemViewsSelfTest extends GridCommonAbstractTest { /** {@inheritDoc} */ @@ -70,7 +71,7 @@ public class SqlSystemViewsSelfTest extends GridCommonAbstractTest { */ private void assertSqlError(final String sql) { Throwable t = GridTestUtils.assertThrowsWithCause(new Callable<Void>() { - @Override public Void call() throws Exception { + @Override public Void call() { execSql(sql); return null; @@ -85,7 +86,7 @@ public class SqlSystemViewsSelfTest extends GridCommonAbstractTest { } /** - * Test meta views modifications. + * Test system views modifications. */ public void testModifications() throws Exception { startGrid(); @@ -140,7 +141,7 @@ public class SqlSystemViewsSelfTest extends GridCommonAbstractTest { } /** - * Test that we can't use cache tables and meta views in the same query. + * Test that we can't use cache tables and system views in the same query. */ public void testCacheToViewJoin() throws Exception { Ignite ignite = startGrid(); @@ -163,7 +164,7 @@ public class SqlSystemViewsSelfTest extends GridCommonAbstractTest { } /** - * Test nodes meta view. + * Test nodes system view. * * @throws Exception If failed. */ @@ -243,5 +244,32 @@ public class SqlSystemViewsSelfTest extends GridCommonAbstractTest { assertEquals(ignite1.cluster().localNode().id(), execSql("SELECT N1.ID FROM IGNITE.NODES N1 " + "WHERE NOT EXISTS (SELECT 1 FROM IGNITE.NODES N2 WHERE N2.ID = N1.ID AND N2.IS_LOCAL = false)") .get(0).get(0)); + + // Check node attributes view + UUID cliNodeId = ignite2.cluster().localNode().id(); + + String cliAttrName = IgniteNodeAttributes.ATTR_CLIENT_MODE; + + assertColumnTypes(execSql("SELECT NODE_ID, NAME, VALUE FROM IGNITE.NODE_ATTRIBUTES").get(0), + UUID.class, String.class, String.class); + + assertEquals(1, + execSql("SELECT NODE_ID FROM IGNITE.NODE_ATTRIBUTES WHERE NAME = ? AND VALUE = 'true'", + cliAttrName).size()); + + assertEquals(3, + execSql("SELECT NODE_ID FROM IGNITE.NODE_ATTRIBUTES WHERE NAME = ?", cliAttrName).size()); + + assertEquals(1, + execSql("SELECT NODE_ID FROM IGNITE.NODE_ATTRIBUTES WHERE NODE_ID = ? AND NAME = ? AND VALUE = 'true'", + cliNodeId, cliAttrName).size()); + + assertEquals(0, + execSql("SELECT NODE_ID FROM IGNITE.NODE_ATTRIBUTES WHERE NODE_ID = '-' AND NAME = ?", + cliAttrName).size()); + + assertEquals(0, + execSql("SELECT NODE_ID FROM IGNITE.NODE_ATTRIBUTES WHERE NODE_ID = ? AND NAME = '-'", + cliNodeId).size()); } }