You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/10/16 12:55:50 UTC
[4/7] ignite git commit: IGNITE-6632: SQL: simplified GridH2Row
inheritance tree. This closes #2856.
IGNITE-6632: SQL: simplified GridH2Row inheritance tree. This closes #2856.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/03234688
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/03234688
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/03234688
Branch: refs/heads/ignite-3478
Commit: 0323468816f3bb5fa8cdcaa3cac1958f3dc89f6e
Parents: 583e3461
Author: devozerov <vo...@gridgain.com>
Authored: Mon Oct 16 12:38:54 2017 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Mon Oct 16 12:38:54 2017 +0300
----------------------------------------------------------------------
.../processors/query/h2/IgniteH2Indexing.java | 4 +-
.../query/h2/database/H2RowFactory.java | 2 +-
.../query/h2/database/io/H2ExtrasInnerIO.java | 4 +-
.../query/h2/database/io/H2ExtrasLeafIO.java | 4 +-
.../query/h2/database/io/H2InnerIO.java | 4 +-
.../query/h2/database/io/H2LeafIO.java | 4 +-
.../query/h2/opt/GridH2KeyRowOnheap.java | 59 +++
.../query/h2/opt/GridH2KeyValueRowOnheap.java | 35 --
.../query/h2/opt/GridH2MetaTable.java | 13 +-
.../query/h2/opt/GridH2PlainRowFactory.java | 181 +++++++++
.../processors/query/h2/opt/GridH2Row.java | 122 ++----
.../query/h2/opt/GridH2RowDescriptor.java | 12 +-
.../query/h2/opt/GridH2RowFactory.java | 194 ----------
.../query/h2/opt/GridH2SearchRowAdapter.java | 103 ++++++
.../processors/query/h2/opt/GridH2Table.java | 2 +-
.../query/h2/twostep/GridMergeIndexSorted.java | 4 +-
.../h2/twostep/GridMergeIndexUnsorted.java | 4 +-
.../query/h2/opt/GridH2TableSelfTest.java | 369 -------------------
18 files changed, 400 insertions(+), 720 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/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 dd35723..0fdc2e4 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
@@ -106,7 +106,7 @@ import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2QueryContext;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table;
import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser;
import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter;
@@ -199,7 +199,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
private static final String DB_OPTIONS = ";LOCK_MODE=3;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE" +
";DEFAULT_LOCK_TIMEOUT=10000;FUNCTIONS_IN_SCHEMA=true;OPTIMIZE_REUSE_RESULTS=0;QUERY_CACHE_SIZE=0" +
";RECOMPILE_ALWAYS=1;MAX_OPERATION_MEMORY=0;NESTED_JOINS=0;BATCH_JOINS=1" +
- ";ROW_FACTORY=\"" + GridH2RowFactory.class.getName() + "\"" +
+ ";ROW_FACTORY=\"" + GridH2PlainRowFactory.class.getName() + "\"" +
";DEFAULT_TABLE_ENGINE=" + GridH2DefaultTableEngine.class.getName();
// Uncomment this setting to get debug output from H2 to sysout.
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
index 92ecd3d..7116fe7 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2RowFactory.java
@@ -71,7 +71,7 @@ public class H2RowFactory {
throw new IgniteException(e);
}
- assert row.ver != null;
+ assert row.version() != null;
return row;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
index 7d41617..b8877e9 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasInnerIO.java
@@ -81,7 +81,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
@Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
GridH2Row row0 = (GridH2Row)row;
- assert row0.link != 0 : row0;
+ assert row0.link() != 0 : row0;
List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes();
@@ -101,7 +101,7 @@ public class H2ExtrasInnerIO extends BPlusInnerIO<SearchRow> {
fieldOff += size;
}
- PageUtils.putLong(pageAddr, off + payloadSize, row0.link);
+ PageUtils.putLong(pageAddr, off + payloadSize, row0.link());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
index 3fe72b7..6161f8d 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2ExtrasLeafIO.java
@@ -81,7 +81,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
@Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
GridH2Row row0 = (GridH2Row)row;
- assert row0.link != 0;
+ assert row0.link() != 0;
List<InlineIndexHelper> inlineIdxs = InlineIndexHelper.getCurrentInlineIndexes();
@@ -100,7 +100,7 @@ public class H2ExtrasLeafIO extends BPlusLeafIO<SearchRow> {
fieldOff += size;
}
- PageUtils.putLong(pageAddr, off + payloadSize, row0.link);
+ PageUtils.putLong(pageAddr, off + payloadSize, row0.link());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
index 4d7b3a2..a1f1ce9 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2InnerIO.java
@@ -47,9 +47,9 @@ public class H2InnerIO extends BPlusInnerIO<SearchRow> implements H2RowLinkIO {
@Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
GridH2Row row0 = (GridH2Row)row;
- assert row0.link != 0;
+ assert row0.link() != 0;
- PageUtils.putLong(pageAddr, off, row0.link);
+ PageUtils.putLong(pageAddr, off, row0.link());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
index f292fc1..85dcf50 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/io/H2LeafIO.java
@@ -47,9 +47,9 @@ public class H2LeafIO extends BPlusLeafIO<SearchRow> implements H2RowLinkIO {
@Override public void storeByOffset(long pageAddr, int off, SearchRow row) {
GridH2Row row0 = (GridH2Row)row;
- assert row0.link != 0;
+ assert row0.link() != 0;
- PageUtils.putLong(pageAddr, off, row0.link);
+ PageUtils.putLong(pageAddr, off, row0.link());
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java
new file mode 100644
index 0000000..a0716c9
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyRowOnheap.java
@@ -0,0 +1,59 @@
+/*
+ * 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.opt;
+
+import org.h2.value.Value;
+
+/**
+ * Heap-based key-only row for remove operations.
+ */
+public class GridH2KeyRowOnheap extends GridH2Row {
+ /** */
+ private Value key;
+
+ /**
+ * @param key Key.
+ */
+ public GridH2KeyRowOnheap(Value key) {
+ this.key = key;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getColumnCount() {
+ return 1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Value getValue(int idx) {
+ assert idx == 0 : idx;
+
+ return key;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setValue(int idx, Value v) {
+ assert idx == 0 : idx;
+
+ key = v;
+ }
+
+ /** {@inheritDoc} */
+ @Override public long expireTime() {
+ return 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
index 63b4606..ad93fec 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOnheap.java
@@ -89,11 +89,6 @@ public class GridH2KeyValueRowOnheap extends GridH2Row {
}
/** {@inheritDoc} */
- @Override public Value[] getValueList() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
@Override public long expireTime() {
return expirationTime;
}
@@ -225,41 +220,11 @@ public class GridH2KeyValueRowOnheap extends GridH2Row {
}
/** {@inheritDoc} */
- @Override public void setKeyAndVersion(SearchRow old) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
@Override public void setKey(long key) {
throw new UnsupportedOperationException();
}
/** {@inheritDoc} */
- @Override public Row getCopy() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setDeleted(boolean deleted) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public long getKey() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setSessionId(int sesId) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setVersion(int ver) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
@Override public void setValue(int idx, Value v) {
throw new UnsupportedOperationException();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
index d23515b..5e09a86 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2MetaTable.java
@@ -86,7 +86,7 @@ public class GridH2MetaTable extends TableBase {
/** {@inheritDoc} */
@Override public SearchRow getTemplateSimpleRow(boolean singleColumn) {
if (singleColumn)
- return GridH2RowFactory.create((Value)null);
+ return GridH2PlainRowFactory.create((Value)null);
return new MetaRow();
}
@@ -219,7 +219,7 @@ public class GridH2MetaTable extends TableBase {
/**
* Get value row.
*/
- private static class MetaRow extends GridH2Row {
+ private static class MetaRow extends GridH2SearchRowAdapter {
/** */
private Value v0;
@@ -284,11 +284,6 @@ public class GridH2MetaTable extends TableBase {
throw new IllegalStateException("Index: " + idx);
}
}
-
- /** {@inheritDoc} */
- @Override public long expireTime() {
- return 0;
- }
}
/**
@@ -296,7 +291,7 @@ public class GridH2MetaTable extends TableBase {
*/
private static class MetaIndex extends BaseIndex {
/** */
- private final ConcurrentMap<ValueInt, GridH2Row> rows = new ConcurrentHashMap8<>();
+ private final ConcurrentMap<ValueInt, Row> rows = new ConcurrentHashMap8<>();
/** {@inheritDoc} */
@Override public void checkRename() {
@@ -322,7 +317,7 @@ public class GridH2MetaTable extends TableBase {
/** {@inheritDoc} */
@Override public void add(Session session, Row row) {
- rows.put(id(row), (GridH2Row)row);
+ rows.put(id(row), row);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
new file mode 100644
index 0000000..fd8a613
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2PlainRowFactory.java
@@ -0,0 +1,181 @@
+/*
+ * 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.opt;
+
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.h2.result.Row;
+import org.h2.result.RowFactory;
+import org.h2.value.Value;
+
+/**
+ * Row factory.
+ */
+public class GridH2PlainRowFactory extends RowFactory {
+ /**
+ * @param v Value.
+ * @return Row.
+ */
+ public static Row create(Value v) {
+ return new RowKey(v);
+ }
+
+ /**
+ * @param data Values.
+ * @return Row.
+ */
+ public static Row create(Value... data) {
+ switch (data.length) {
+ case 0:
+ throw new IllegalStateException("Zero columns row.");
+
+ case 1:
+ return new RowKey(data[0]);
+
+ case 2:
+ return new RowPair(data[0], data[1]);
+
+ default:
+ return new RowSimple(data);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public Row createRow(Value[] data, int memory) {
+ return create(data);
+ }
+
+ /**
+ * Single value row.
+ */
+ private static final class RowKey extends GridH2SearchRowAdapter {
+ /** */
+ private Value key;
+
+ /**
+ * @param key Key.
+ */
+ public RowKey(Value key) {
+ this.key = key;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getColumnCount() {
+ return 1;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Value getValue(int idx) {
+ assert idx == 0 : idx;
+ return key;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setValue(int idx, Value v) {
+ assert idx == 0 : idx;
+ key = v;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(RowKey.class, this);
+ }
+ }
+
+ /**
+ * Row of two values.
+ */
+ private static final class RowPair extends GridH2SearchRowAdapter {
+ /** */
+ private Value v1;
+
+ /** */
+ private Value v2;
+
+ /**
+ * @param v1 First value.
+ * @param v2 Second value.
+ */
+ private RowPair(Value v1, Value v2) {
+ this.v1 = v1;
+ this.v2 = v2;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getColumnCount() {
+ return 2;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Value getValue(int idx) {
+ return idx == 0 ? v1 : v2;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setValue(int idx, Value v) {
+ if (idx == 0)
+ v1 = v;
+ else {
+ assert idx == 1 : idx;
+
+ v2 = v;
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(RowPair.class, this);
+ }
+ }
+
+ /**
+ * Simple array based row.
+ */
+ private static final class RowSimple extends GridH2SearchRowAdapter {
+ /** */
+ @GridToStringInclude
+ private Value[] vals;
+
+ /**
+ * @param vals Values.
+ */
+ private RowSimple(Value[] vals) {
+ this.vals = vals;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getColumnCount() {
+ return vals.length;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Value getValue(int idx) {
+ return vals[idx];
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setValue(int idx, Value v) {
+ vals[idx] = v;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(RowSimple.class, this);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
index fdeb009..4cb603b 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
@@ -21,29 +21,25 @@ import org.apache.ignite.internal.processors.cache.CacheObject;
import org.apache.ignite.internal.processors.cache.KeyCacheObject;
import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
-import org.h2.result.Row;
-import org.h2.result.SearchRow;
-import org.h2.store.Data;
-import org.h2.value.Value;
/**
* Row with locking support needed for unique key conflicts resolution.
*/
-public abstract class GridH2Row implements SearchRow, CacheDataRow, Row {
- /** */
- public long link; // TODO remove
+public abstract class GridH2Row extends GridH2SearchRowAdapter implements CacheDataRow {
+ /** Link. */
+ private long link;
- /** */
- public KeyCacheObject key; // TODO remove
+ /** Key. */
+ private KeyCacheObject key;
- /** */
- public CacheObject val; // TODO remove
+ /** Value. */
+ private CacheObject val;
- /** */
- public GridCacheVersion ver; // TODO remove
+ /** Version. */
+ private GridCacheVersion ver;
- /** */
- public int partId; // TODO remove
+ /** Partition. */
+ private int partId;
/** {@inheritDoc} */
@Override public KeyCacheObject key() {
@@ -60,16 +56,37 @@ public abstract class GridH2Row implements SearchRow, CacheDataRow, Row {
return val;
}
+ /**
+ * @param val Value.
+ */
+ public void value(CacheObject val) {
+ this.val = val;
+ }
+
/** {@inheritDoc} */
@Override public GridCacheVersion version() {
return ver;
}
+ /**
+ * @param ver Version.
+ */
+ public void version(GridCacheVersion ver) {
+ this.ver = ver;
+ }
+
/** {@inheritDoc} */
@Override public int partition() {
return partId;
}
+ /**
+ * @param partId Partition.
+ */
+ public void partition(int partId) {
+ this.partId = partId;
+ }
+
/** {@inheritDoc} */
@Override public long link() {
return link;
@@ -81,81 +98,6 @@ public abstract class GridH2Row implements SearchRow, CacheDataRow, Row {
}
/** {@inheritDoc} */
- @Override public Row getCopy() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setVersion(int version) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public int getByteCount(Data dummy) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public boolean isEmpty() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setDeleted(boolean deleted) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setSessionId(int sessionId) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public int getSessionId() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void commit() {
- // No-op.
- }
-
- /** {@inheritDoc} */
- @Override public boolean isDeleted() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setKeyAndVersion(SearchRow old) {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public int getVersion() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public void setKey(long key) {
- // No-op, may be set in H2 INFORMATION_SCHEMA.
- }
-
- /** {@inheritDoc} */
- @Override public long getKey() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public int getMemory() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
- @Override public Value[] getValueList() {
- throw new UnsupportedOperationException();
- }
-
- /** {@inheritDoc} */
@Override public int hash() {
throw new UnsupportedOperationException();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
index 081805e..503e487 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowDescriptor.java
@@ -287,7 +287,7 @@ public class GridH2RowDescriptor {
try {
if (val == null) // Only can happen for remove operation, can create simple search row.
- row = GridH2RowFactory.create(wrap(key, keyType));
+ row = new GridH2KeyRowOnheap(wrap(key, keyType));
else
row = new GridH2KeyValueRowOnheap(this, key, keyType, val, valType, ver, expirationTime);
}
@@ -297,12 +297,10 @@ public class GridH2RowDescriptor {
"or configure key type as common super class for all actual keys for this value type.", e);
}
- row.ver = ver;
-
- row.key = key;
- row.val = val;
- row.partId = partId;
-
+ row.version(ver);
+ row.key(key);
+ row.value(val);
+ row.partition(partId);
row.link(link);
return row;
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java
deleted file mode 100644
index d33917f..0000000
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2RowFactory.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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.opt;
-
-import org.apache.ignite.internal.util.tostring.GridToStringInclude;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.h2.result.RowFactory;
-import org.h2.value.Value;
-
-/**
- * Row factory.
- */
-public class GridH2RowFactory extends RowFactory {
- /**
- * @param v Value.
- * @return Row.
- */
- public static GridH2Row create(Value v) {
- return new RowKey(v);
- }
-
- /**
- * @param v1 Value 1.
- * @param v2 Value 2.
- * @return Row.
- */
- public static GridH2Row create(Value v1, Value v2) {
- return new RowPair(v1, v2);
- }
-
- /**
- * @param data Values.
- * @return Row.
- */
- public static GridH2Row create(Value... data) {
- switch (data.length) {
- case 0:
- throw new IllegalStateException("Zero columns row.");
-
- case 1:
- return new RowKey(data[0]);
-
- case 2:
- return new RowPair(data[0], data[1]);
-
- default:
- return new RowSimple(data);
- }
- }
-
- /** {@inheritDoc} */
- @Override public GridH2Row createRow(Value[] data, int memory) {
- return create(data);
- }
-
- /**
- * Single value row.
- */
- private static final class RowKey extends GridH2Row {
- /** */
- private Value key;
-
- /**
- * @param key Key.
- */
- public RowKey(Value key) {
- this.key = key;
- }
-
- /** {@inheritDoc} */
- @Override public int getColumnCount() {
- return 1;
- }
-
- /** {@inheritDoc} */
- @Override public Value getValue(int idx) {
- assert idx == 0 : idx;
- return key;
- }
-
- /** {@inheritDoc} */
- @Override public void setValue(int idx, Value v) {
- assert idx == 0 : idx;
- key = v;
- }
-
- /** {@inheritDoc} */
- @Override public long expireTime() {
- return 0;
- }
- }
-
- /**
- * Row of two values.
- */
- private static final class RowPair extends GridH2Row {
- /** */
- private Value v1;
-
- /** */
- private Value v2;
-
- /**
- * @param v1 First value.
- * @param v2 Second value.
- */
- private RowPair(Value v1, Value v2) {
- this.v1 = v1;
- this.v2 = v2;
- }
-
- /** {@inheritDoc} */
- @Override public int getColumnCount() {
- return 2;
- }
-
- /** {@inheritDoc} */
- @Override public Value getValue(int idx) {
- return idx == 0 ? v1 : v2;
- }
-
- /** {@inheritDoc} */
- @Override public void setValue(int idx, Value v) {
- if (idx == 0)
- v1 = v;
- else {
- assert idx == 1 : idx;
-
- v2 = v;
- }
- }
-
- /** {@inheritDoc} */
- @Override public long expireTime() {
- return 0;
- }
- }
-
- /**
- * Simple array based row.
- */
- private static final class RowSimple extends GridH2Row {
- /** */
- @GridToStringInclude
- private Value[] vals;
-
- /**
- * @param vals Values.
- */
- private RowSimple(Value[] vals) {
- this.vals = vals;
- }
-
- /** {@inheritDoc} */
- @Override public int getColumnCount() {
- return vals.length;
- }
-
- /** {@inheritDoc} */
- @Override public Value getValue(int idx) {
- return vals[idx];
- }
-
- /** {@inheritDoc} */
- @Override public void setValue(int idx, Value v) {
- vals[idx] = v;
- }
-
- /** {@inheritDoc} */
- @Override public String toString() {
- return S.toString(RowSimple.class, this);
- }
-
- /** {@inheritDoc} */
- @Override public long expireTime() {
- return 0;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java
new file mode 100644
index 0000000..24a90b3
--- /dev/null
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SearchRowAdapter.java
@@ -0,0 +1,103 @@
+/*
+ * 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.opt;
+
+import org.h2.result.Row;
+import org.h2.result.SearchRow;
+import org.h2.store.Data;
+import org.h2.value.Value;
+
+/**
+ * Dummy H2 search row adadpter.
+ */
+public abstract class GridH2SearchRowAdapter implements Row {
+ /** {@inheritDoc} */
+ @Override public void setKeyAndVersion(SearchRow old) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getVersion() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setKey(long key) {
+ // No-op, may be set in H2 INFORMATION_SCHEMA.
+ }
+
+ /** {@inheritDoc} */
+ @Override public long getKey() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getMemory() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Row getCopy() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setVersion(int version) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getByteCount(Data dummy) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isEmpty() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setDeleted(boolean deleted) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setSessionId(int sessionId) {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public int getSessionId() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void commit() {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public boolean isDeleted() {
+ throw new UnsupportedOperationException();
+ }
+
+ /** {@inheritDoc} */
+ @Override public Value[] getValueList() {
+ throw new UnsupportedOperationException();
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index d20b56b..add2488 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -463,7 +463,7 @@ public class GridH2Table extends TableBase {
GridH2IndexBase pk = pk();
if (!del) {
- assert rowFactory == null || row.link != 0 : row;
+ assert rowFactory == null || row.link() != 0 : row;
GridH2Row old = pk.put(row); // Put to PK.
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
index 54c8dd4..0dc8354 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexSorted.java
@@ -33,7 +33,7 @@ import java.util.concurrent.locks.ReentrantLock;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2Cursor;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.h2.engine.Session;
@@ -368,7 +368,7 @@ public final class GridMergeIndexSorted extends GridMergeIndex {
if (!iter.hasNext())
return false;
- cur = GridH2RowFactory.create(iter.next());
+ cur = GridH2PlainRowFactory.create(iter.next());
return true;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
index c53b58f..487d386 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndexUnsorted.java
@@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.query.h2.opt.GridH2Cursor;
-import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowFactory;
+import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory;
import org.h2.engine.Session;
import org.h2.index.Cursor;
import org.h2.index.IndexType;
@@ -139,7 +139,7 @@ public final class GridMergeIndexUnsorted extends GridMergeIndex {
}
@Override public Row next() {
- return GridH2RowFactory.create(iter.next());
+ return GridH2PlainRowFactory.create(iter.next());
}
@Override public void remove() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/03234688/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
deleted file mode 100644
index a1a64e8..0000000
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TableSelfTest.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * 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.opt;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.sql.Timestamp;
-import java.util.Random;
-import java.util.UUID;
-import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
-import org.h2.value.ValueLong;
-import org.h2.value.ValueString;
-import org.h2.value.ValueTimestamp;
-import org.h2.value.ValueUuid;
-
-/**
- * Tests H2 Table.
- */
-@SuppressWarnings({"TypeMayBeWeakened", "FieldAccessedSynchronizedAndUnsynchronized"})
-public class GridH2TableSelfTest extends GridCommonAbstractTest {
- /** */
- private static final long MAX_X = 2000;
-
- /** */
- private static final String DB_URL = "jdbc:h2:mem:gg_table_engine;MULTI_THREADED=1;OPTIMIZE_REUSE_RESULTS=0;" +
- "QUERY_CACHE_SIZE=0;RECOMPILE_ALWAYS=1";
-
- /** */
- private static final String CREATE_TABLE_SQL = "CREATE TABLE T(ID UUID, T TIMESTAMP, STR VARCHAR, X BIGINT)";
-
- /** */
- private static final String PK_NAME = "__GG_PK_";
-
- /** Hash. */
- private static final String HASH = "__GG_HASH";
-
- /** */
- private static final String STR_IDX_NAME = "__GG_IDX_";
-
- /** */
- private static final String NON_UNIQUE_IDX_NAME = "__GG_IDX_";
-
- /** */
- private static final String SCAN_IDX_NAME = GridH2PrimaryScanIndex.SCAN_INDEX_NAME_SUFFIX;
-
- /** */
- private Connection conn;
-
- /** */
- private GridH2Table tbl;
-
- /** {@inheritDoc} */
- @Override protected void beforeTest() throws Exception {
- // TODO: IGNITE-4994: Restore mock.
-// Driver.load();
-//
-// conn = DriverManager.getConnection(DB_URL);
-//
-// tbl = GridH2Table.Engine.createTable(conn, CREATE_TABLE_SQL, null, new GridH2Table.IndexesFactory() {
-// @Override public void onTableCreated(GridH2Table tbl) {
-// // No-op.
-// }
-//
-// @Override public H2RowFactory createRowFactory(GridH2Table tbl) {
-// return null;
-// }
-//
-// @Override public ArrayList<Index> createIndexes(GridH2Table tbl) {
-// ArrayList<Index> idxs = new ArrayList<>();
-//
-// IndexColumn id = tbl.indexColumn(0, SortOrder.ASCENDING);
-// IndexColumn t = tbl.indexColumn(1, SortOrder.ASCENDING);
-// IndexColumn str = tbl.indexColumn(2, SortOrder.DESCENDING);
-// IndexColumn x = tbl.indexColumn(3, SortOrder.DESCENDING);
-//
-// idxs.add(new H2PkHashIndex(null, tbl, HASH, F.asList(id)));
-// idxs.add(new GridH2TreeIndex(PK_NAME, tbl, true, F.asList(id)));
-// idxs.add(new GridH2TreeIndex(NON_UNIQUE_IDX_NAME, tbl, false, F.asList(x, t, id)));
-// idxs.add(new GridH2TreeIndex(STR_IDX_NAME, tbl, false, F.asList(str, id)));
-//
-// return idxs;
-// }
-// }, null);
- }
-
- /** {@inheritDoc} */
- @Override protected void afterTest() throws Exception {
- conn.close();
-
- conn = null;
- tbl = null;
- }
-
- /**
- * @param id Id.
- * @param t Timestamp.
- * @param str String.
- * @param x X.
- * @return New row.
- */
- private GridH2Row row(UUID id, long t, String str, long x) {
- return GridH2RowFactory.create(
- ValueUuid.get(id.getMostSignificantBits(), id.getLeastSignificantBits()),
- ValueTimestamp.get(new Timestamp(t)),
- ValueString.get(str),
- ValueLong.get(x));
- }
-
-
- /**
- * Simple table test.
- *
- * @throws Exception If failed.
- */
- public void testTable() throws Exception {
- // Test insert.
- long x = MAX_X;
-
- Random rnd = new Random();
-
- while(x-- > 0) {
- UUID id = UUID.randomUUID();
-
- GridH2Row row = row(id, System.currentTimeMillis(), rnd.nextBoolean() ? id.toString() :
- UUID.randomUUID().toString(), rnd.nextInt(100));
-
- tbl.doUpdate(row, false);
- }
-
- assertEquals(MAX_X, tbl.getRowCountApproximation());
- assertEquals(MAX_X, tbl.getRowCount(null));
-
- for (GridH2IndexBase idx : tbl.indexes()) {
- assertEquals(MAX_X, idx.getRowCountApproximation());
- assertEquals(MAX_X, idx.getRowCount(null));
- }
-
- // Check unique index.
- UUID id = UUID.randomUUID();
- UUID id2 = UUID.randomUUID();
-
- assertTrue(tbl.doUpdate(row(id, System.currentTimeMillis(), id.toString(), rnd.nextInt(100)), false));
- assertTrue(tbl.doUpdate(row(id2, System.currentTimeMillis(), id2.toString(), rnd.nextInt(100)), false));
-
- // Check index selection.
- checkQueryPlan(conn, "SELECT * FROM T", SCAN_IDX_NAME);
-
- checkQueryPlan(conn, "SELECT * FROM T WHERE ID IS NULL", PK_NAME);
- checkQueryPlan(conn, "SELECT * FROM T WHERE ID = RANDOM_UUID()", PK_NAME);
- checkQueryPlan(conn, "SELECT * FROM T WHERE ID > RANDOM_UUID()", PK_NAME);
- checkQueryPlan(conn, "SELECT * FROM T ORDER BY ID", PK_NAME);
-
- checkQueryPlan(conn, "SELECT * FROM T WHERE STR IS NULL", STR_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T WHERE STR = 'aaaa'", STR_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T WHERE STR > 'aaaa'", STR_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T ORDER BY STR DESC", STR_IDX_NAME);
-
- checkQueryPlan(conn, "SELECT * FROM T WHERE X IS NULL", NON_UNIQUE_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T WHERE X = 10000", NON_UNIQUE_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T WHERE X > 10000", NON_UNIQUE_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T ORDER BY X DESC", NON_UNIQUE_IDX_NAME);
- checkQueryPlan(conn, "SELECT * FROM T ORDER BY X DESC, T", NON_UNIQUE_IDX_NAME);
-
- checkQueryPlan(conn, "SELECT * FROM T ORDER BY T, X DESC", SCAN_IDX_NAME);
-
- // Simple queries.
-
- Statement s = conn.createStatement();
-
- ResultSet rs = s.executeQuery("select id from t where x between 0 and 100");
-
- int i = 0;
- while (rs.next())
- i++;
-
- assertEquals(MAX_X + 2, i);
-
- // -----
-
- rs = s.executeQuery("select id from t where t is not null");
-
- i = 0;
- while (rs.next())
- i++;
-
- assertEquals(MAX_X + 2, i);
-
- // ----
-
- int cnt = 10 + rnd.nextInt(25);
-
- long t = System.currentTimeMillis();
-
- for (i = 0; i < cnt; i++) {
- id = UUID.randomUUID();
-
- assertTrue(tbl.doUpdate(row(id, t, id.toString(), 51), false));
- }
-
- rs = s.executeQuery("select x, id from t where x = 51 limit " + cnt);
-
- i = 0;
-
- while (rs.next()) {
- assertEquals(51, rs.getInt(1));
-
- i++;
- }
-
- assertEquals(cnt, i);
- }
-
- /**
- * @throws Exception If failed.
- */
- public void testRangeQuery() throws Exception {
- int rows = 3000;
- int xs = 37;
-
- long t = System.currentTimeMillis();
-
- Random rnd = new Random();
-
- for (int i = 0 ; i < rows; i++) {
- UUID id = UUID.randomUUID();
-
- GridH2Row row = row(id, t++, id.toString(), rnd.nextInt(xs));
-
- assertTrue(tbl.doUpdate(row, false));
- }
-
- PreparedStatement ps = conn.prepareStatement("select count(*) from t where x = ?");
-
- int cnt = 0;
-
- for (int x = 0; x < xs; x++) {
- ps.setInt(1, x);
-
- ResultSet rs = ps.executeQuery();
-
- assertTrue(rs.next());
-
- cnt += rs.getInt(1);
- }
-
- assertEquals(rows, cnt);
- }
-
- /**
- * @throws Exception If failed.
- */
- public void testDataLoss() throws Exception {
- final int threads = 37;
- final int iterations = 15000;
-
- final AtomicInteger cntr = new AtomicInteger();
-
- final UUID[] ids = new UUID[threads * iterations];
-
- for (int i = 0; i < ids.length; i++)
- ids[i] = UUID.randomUUID();
-
- final long t = System.currentTimeMillis();
-
- final AtomicInteger deleted = new AtomicInteger();
-
- multithreaded(new Callable<Void>() {
- @Override public Void call() throws Exception {
- Random rnd = new Random();
-
- int offset = cntr.getAndIncrement() * iterations;
-
- synchronized (ids[offset]) {
- for (int i = 0; i < iterations; i++) {
- UUID id = ids[offset + i];
-
- int x = rnd.nextInt(50);
-
- GridH2Row row = row(id, t, id.toString(), x);
-
- assertTrue(tbl.doUpdate(row, false));
- }
- }
-
- offset = (offset + iterations) % ids.length;
-
- synchronized (ids[offset]) {
- for (int i = 0; i < iterations; i += 2) {
- UUID id = ids[offset + i];
-
- int x = rnd.nextInt(50);
-
- GridH2Row row = row(id, t, id.toString(), x);
-
- if (tbl.doUpdate(row, true))
- deleted.incrementAndGet();
- }
- }
-
- return null;
- }
- }, threads);
-
- assertTrue(deleted.get() > 0);
-
- PreparedStatement p = conn.prepareStatement("select count(*) from t where id = ?");
-
- for (int i = 1; i < ids.length; i += 2) {
- p.setObject(1, ids[i]);
-
- ResultSet rs = p.executeQuery();
-
- assertTrue(rs.next());
-
- assertEquals(1, rs.getInt(1));
- }
-
- Statement s = conn.createStatement();
-
- ResultSet rs = s.executeQuery("select count(*) from t");
-
- assertTrue(rs.next());
-
- assertEquals(ids.length - deleted.get(), rs.getInt(1));
- }
-
-
- /**
- * Check query plan to correctly select index.
- *
- * @param conn Connection.
- * @param sql Select.
- * @param search Search token in result.
- * @throws SQLException If failed.
- */
- private void checkQueryPlan(Connection conn, String sql, String search) throws SQLException {
-
- try (Statement s = conn.createStatement()) {
- try (ResultSet r = s.executeQuery("EXPLAIN ANALYZE " + sql)) {
- assertTrue(r.next());
-
- String plan = r.getString(1);
-
- assertTrue("Execution plan for '" + sql + "' query should contain '" + search + "'",
- plan.contains(search));
- }
- }
- }
-}
\ No newline at end of file