You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2021/08/13 15:12:07 UTC
[ignite-3] 03/03: Decouple Tuple from Schema.
This is an automated email from the ASF dual-hosted git repository.
amashenkov pushed a commit to branch gg-15253
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 5d1a4a583c0f88293627ed4ad8d74680ca5d00b4
Author: Andrew Mashenkov <an...@gmail.com>
AuthorDate: Fri Aug 13 18:10:55 2021 +0300
Decouple Tuple from Schema.
---
.../internal/table/LiveSchemaTupleBuilderImpl.java | 29 +++---
.../apache/ignite/internal/table/TupleImpl.java | 107 ++++++++-------------
.../ignite/internal/table/TupleMarshallerImpl.java | 7 +-
.../ignite/internal/table/TupleImplTest.java | 4 +-
4 files changed, 59 insertions(+), 88 deletions(-)
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/LiveSchemaTupleBuilderImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/LiveSchemaTupleBuilderImpl.java
index b6835f8..4b9a781 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/LiveSchemaTupleBuilderImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/LiveSchemaTupleBuilderImpl.java
@@ -70,8 +70,7 @@ public class LiveSchemaTupleBuilderImpl extends TupleImpl {
/** {@inheritDoc} */
@Override public Tuple set(String columnName, Object val) {
- Column col = schema().column(columnName);
-
+ Column col = null;
if (col == null) {
if (val == null)
return this;
@@ -94,19 +93,19 @@ public class LiveSchemaTupleBuilderImpl extends TupleImpl {
if (extraColumnsMap == null)
return this;
- while (!extraColumnsMap.isEmpty()) {
- createColumns(extraColumnsMap);
-
- this.schema(schemaRegistry.schema());
-
- Map<String, Object> colMap = map;
- map = new HashMap<>();
-
- extraColumnsMap.forEach(colMap::put);
- extraColumnsMap.clear();
-
- colMap.forEach(this::set);
- }
+// while (!extraColumnsMap.isEmpty()) {
+// createColumns(extraColumnsMap);
+//
+// this.schema(schemaRegistry.schema());
+//
+// Map<String, Object> colMap = map;
+// map = new HashMap<>();
+//
+// extraColumnsMap.forEach(colMap::put);
+// extraColumnsMap.clear();
+//
+// colMap.forEach(this::set);
+// }
return this;
}
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/TupleImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/TupleImpl.java
index 4d979c9..221f58c 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/TupleImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/TupleImpl.java
@@ -17,15 +17,15 @@
package org.apache.ignite.internal.table;
+import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.Objects;
import java.util.UUID;
import org.apache.ignite.binary.BinaryObject;
import org.apache.ignite.binary.BinaryObjects;
-import org.apache.ignite.internal.schema.Column;
-import org.apache.ignite.internal.schema.SchemaAware;
import org.apache.ignite.internal.schema.SchemaDescriptor;
import org.apache.ignite.table.Tuple;
import org.jetbrains.annotations.NotNull;
@@ -33,83 +33,82 @@ import org.jetbrains.annotations.NotNull;
/**
* Buildable tuple.
*/
-public class TupleImpl implements Tuple, SchemaAware {
- /** Columns values. */
- protected Map<String, Object> map;
+public class TupleImpl implements Tuple {
+ /** Column name -> index. */
+ protected Map<String, Integer> colIdxMap;
+
+ /** Columns names. */
+ private final ArrayList<String> colNames;
- /** Current schema descriptor. */
- private SchemaDescriptor schemaDesc;
+ /** Columns values. */
+ private final ArrayList<Object> vals;
/**
* Creates tuple builder.
*
* @param schemaDesc Schema descriptor.
*/
+ //TODO: Drop schema parameter.
public TupleImpl(SchemaDescriptor schemaDesc) {
- this.schemaDesc = schemaDesc;
- map = new HashMap<>();
+ colIdxMap = new HashMap<>();
+ vals = new ArrayList();
+ colNames = new ArrayList();
}
/** {@inheritDoc} */
@Override public Tuple set(String columnName, Object val) {
- getColumnOrThrow(columnName).validate(val);
-
- map.put(columnName, val);
-
- return this;
- }
+ int idx = colIdxMap.computeIfAbsent(columnName, name -> colIdxMap.size());
- /**
- * Sets column value.
- *
- * @param col Column.
- * @param value Value to set.
- * @return {@code this} for chaining.
- */
- public Tuple set(Column col, Object value) {
- assert col != null;
-
- col.validate(value);
-
- map.put(col.name(), value);
+ if (idx == colNames.size()) {
+ colNames.add(idx, columnName);
+ vals.add(idx, val);
+ }
+ else {
+ colNames.set(idx, columnName);
+ vals.set(idx, val);
+ }
return this;
}
/** {@inheritDoc} */
@Override public String columnName(int columnIndex) {
- return schemaDesc.column(columnIndex).name();
+ Objects.checkIndex(columnIndex, vals.size());
+
+ return colNames.get(columnIndex);
}
/** {@inheritDoc} */
@Override public int columnIndex(String columnName) {
- var col = schemaDesc.column(columnName);
+ Integer idx = colIdxMap.get(columnName);
- return col == null ? -1 : col.schemaIndex();
+ return idx == null ? -1 : idx;
}
/** {@inheritDoc} */
@Override public int columnCount() {
- return schemaDesc.length();
+ return colNames.size();
}
/** {@inheritDoc} */
@Override public <T> T valueOrDefault(String columnName, T def) {
- return (T)map.getOrDefault(columnName, def);
+ int idx = columnIndex(columnName);
+
+ return (idx == -1) ? def : (T)vals.get(idx);
}
/** {@inheritDoc} */
@Override public <T> T value(String columnName) {
- getColumnOrThrow(columnName);
+ int idx = columnIndex(columnName);
- return (T)map.get(columnName);
+ return (T)vals.get(idx);
}
/** {@inheritDoc} */
@Override public <T> T value(int columnIndex) {
- Column col = schemaDesc.column(columnIndex);
+ Objects.checkIndex(columnIndex, vals.size());
- return (T)map.get(col.name());
+ return (T)vals.get(columnIndex);
}
/** {@inheritDoc} */
@@ -215,48 +214,20 @@ public class TupleImpl implements Tuple, SchemaAware {
}
/** {@inheritDoc} */
- @Override public SchemaDescriptor schema() {
- return schemaDesc;
- }
-
- /** {@inheritDoc} */
@NotNull @Override public Iterator<Object> iterator() {
return new Iterator<>() {
/** Current column index. */
- private int cur;
+ private int cur = 0;
/** {@inheritDoc} */
@Override public boolean hasNext() {
- return cur < schemaDesc.length();
+ return cur < vals.size();
}
/** {@inheritDoc} */
@Override public Object next() {
- return hasNext() ? value(cur++) : null;
+ return hasNext() ? vals.get(cur++) : null;
}
};
}
-
- /**
- * @param schemaDesc New current schema descriptor.
- */
- protected void schema(SchemaDescriptor schemaDesc) {
- this.schemaDesc = schemaDesc;
- }
-
- /**
- * Gets column by name or throws an exception when not found.
- *
- * @param columnName Column name.
- * @return Column.
- * @throws ColumnNotFoundException when not found.
- */
- @NotNull private Column getColumnOrThrow(String columnName) {
- Column col = schema().column(columnName);
-
- if (col == null)
- throw new ColumnNotFoundException("Column not found [col=" + columnName + "schema=" + schemaDesc + ']');
-
- return col;
- }
}
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/TupleMarshallerImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/TupleMarshallerImpl.java
index bf667d0..1a4029d 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/TupleMarshallerImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/TupleMarshallerImpl.java
@@ -21,6 +21,7 @@ import java.util.Arrays;
import java.util.Objects;
import org.apache.ignite.internal.schema.Column;
import org.apache.ignite.internal.schema.Columns;
+import org.apache.ignite.internal.schema.SchemaAware;
import org.apache.ignite.internal.schema.SchemaDescriptor;
import org.apache.ignite.internal.schema.SchemaRegistry;
import org.apache.ignite.internal.schema.marshaller.TupleMarshaller;
@@ -88,11 +89,11 @@ public class TupleMarshallerImpl implements TupleMarshaller {
* @throws SchemaMismatchException If validation failed.
*/
private void validate(Tuple tuple, Columns columns) {
- if (tuple instanceof TupleImpl) {
- TupleImpl t0 = (TupleImpl)tuple;
-
+ if (tuple instanceof SchemaAware) {
+ SchemaAware t0 = ((SchemaAware)tuple);
SchemaDescriptor expSchema = schemaReg.schema(t0.schema().version());
+ //TODO: Does it make sense to check 'tableId' and 'version' equality instead of reference?
if (!Objects.equals(t0.schema(), expSchema))
throw new SchemaMismatchException("Unexpected schema: [expected=" + expSchema + ", actual=" + t0.schema() + ']');
}
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/TupleImplTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/TupleImplTest.java
index a8eda42..73cb725 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/TupleImplTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/TupleImplTest.java
@@ -105,8 +105,8 @@ public class TupleImplTest {
@Test
public void testColumnNameThrowsOnInvalidIndex() {
- var ex = assertThrows(IllegalArgumentException.class, () -> getTuple().columnName(-1));
- assertEquals("Column index can't be negative", ex.getMessage());
+ var ex = assertThrows(IndexOutOfBoundsException.class, () -> getTuple().columnName(-1));
+ assertEquals("Index -1 out of bounds for length 2", ex.getMessage());
}
@Test