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 -&gt; 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