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 <voze...@gridgain.com> Authored: Mon Oct 16 12:38:54 2017 +0300 Committer: devozerov <voze...@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