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/06/25 16:19:28 UTC

[ignite-3] 02/02: Minor optimizations.

This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-14743-row-formats
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 1181d7c2eaed00b02ce56576fdfdad41776ce9f6
Author: Andrew Mashenkov <an...@gmail.com>
AuthorDate: Fri Jun 25 18:21:02 2021 +0300

    Minor optimizations.
---
 .../main/java/org/apache/ignite/table/Tuple.java   |  5 +-
 .../ignite/internal/table/RowChunkAdapter.java     | 11 +++
 .../org/apache/ignite/internal/table/TableRow.java | 23 +-----
 .../ignite/internal/table/TupleBuilderImpl.java    |  6 +-
 .../ignite/internal/table/TupleMarshallerImpl.java | 91 +++++++++++-----------
 .../TupleMarshallerVarlenOnlyBenchmark.java        |  2 +-
 .../internal/table/impl/TestTupleBuilder.java      | 20 ++---
 7 files changed, 77 insertions(+), 81 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/table/Tuple.java b/modules/api/src/main/java/org/apache/ignite/table/Tuple.java
index c9e0374..93605d5 100644
--- a/modules/api/src/main/java/org/apache/ignite/table/Tuple.java
+++ b/modules/api/src/main/java/org/apache/ignite/table/Tuple.java
@@ -31,9 +31,10 @@ public interface Tuple {
      * Returns {@code true} if this tuple contains a column with the specified name.
      *
      * @param colName Column name.
-     * @return {@code true} if this tuple contains a column with the specified name. Otherwise returns {@code false}.
+     * @param def Default value.
+     * @return Column value if this tuple contains a column with the specified name. Otherwise returns {@code default}.
      */
-    boolean contains(String colName);
+    <T> T valueOrDefault(String colName, T def);
 
     /**
      * Gets column value for given column name.
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/RowChunkAdapter.java b/modules/table/src/main/java/org/apache/ignite/internal/table/RowChunkAdapter.java
index 2e213f1..dc9ab74 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/RowChunkAdapter.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/RowChunkAdapter.java
@@ -33,6 +33,7 @@ public abstract class RowChunkAdapter implements Tuple {
     /**
      * @param colName Column name.
      * @return Column.
+     * @throws ColumnNotFoundException If column wasn't found.
      */
     @NotNull protected abstract Column columnByName(@NotNull String colName);
 
@@ -42,6 +43,16 @@ public abstract class RowChunkAdapter implements Tuple {
     protected abstract Row row();
 
     /** {@inheritDoc} */
+    @Override public <T> T valueOrDefault(String colName, T def) {
+        try {
+            return value(colName);
+        }
+        catch (ColumnNotFoundException ex) {
+            return def;
+        }
+    }
+
+    /** {@inheritDoc} */
     @Override public <T> T value(String colName) {
         final Column col = columnByName(colName);
 
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/TableRow.java b/modules/table/src/main/java/org/apache/ignite/internal/table/TableRow.java
index 31ab606..de111e2 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/TableRow.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/TableRow.java
@@ -19,8 +19,8 @@ package org.apache.ignite.internal.table;
 
 import java.util.Objects;
 import org.apache.ignite.internal.schema.Column;
-import org.apache.ignite.internal.schema.row.Row;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
+import org.apache.ignite.internal.schema.row.Row;
 import org.apache.ignite.table.Tuple;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -57,7 +57,7 @@ public class TableRow extends RowChunkAdapter {
         final Column col = schema.column(colName);
 
         if (col == null)
-            throw new IllegalArgumentException("Invalid column name: columnName=" + colName + ", schemaVersion=" + schema.version());
+            throw new ColumnNotFoundException("Invalid column name: columnName=" + colName + ", schemaVersion=" + schema.version());
 
         return col;
     }
@@ -81,11 +81,6 @@ public class TableRow extends RowChunkAdapter {
         return row;
     }
 
-    /** */
-    @Override public boolean contains(String colName) {
-        return schema.column(colName) != null;
-    }
-
     /** Key column chunk. */
     private class KeyRowChunk extends RowChunkAdapter {
         /** {@inheritDoc} */
@@ -100,15 +95,10 @@ public class TableRow extends RowChunkAdapter {
             final Column col = schema.column(colName);
 
             if (col == null || !schema.isKeyColumn(col.schemaIndex()))
-                throw new IllegalArgumentException("Invalid key column name: columnName=" + colName + ", schemaVersion=" + schema.version());
+                throw new ColumnNotFoundException("Invalid key column name: columnName=" + colName + ", schemaVersion=" + schema.version());
 
             return col;
         }
-
-        /** */
-        @Override public boolean contains(String colName) {
-            return schema.column(colName) != null;
-        }
     }
 
     /** Value column chunk. */
@@ -125,14 +115,9 @@ public class TableRow extends RowChunkAdapter {
             final Column col = schema.column(colName);
 
             if (col == null || schema.isKeyColumn(col.schemaIndex()))
-                throw new IllegalArgumentException("Invalid key column name: columnName=" + colName + ", schemaVersion=" + schema.version());
+                throw new ColumnNotFoundException("Invalid key column name: columnName=" + colName + ", schemaVersion=" + schema.version());
 
             return col;
         }
-
-        /** */
-        @Override public boolean contains(String colName) {
-            return schema.column(colName) != null;
-        }
     }
 }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/TupleBuilderImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/TupleBuilderImpl.java
index 66e93aa..10dcfcd 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/TupleBuilderImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/TupleBuilderImpl.java
@@ -48,7 +48,7 @@ public class TupleBuilderImpl implements TupleBuilder, Tuple {
         Objects.requireNonNull(schemaDesc);
 
         this.schemaDesc = schemaDesc;
-        map = new HashMap<>();
+        map = new HashMap<>(schemaDesc.length());
     }
 
     /** {@inheritDoc} */
@@ -71,8 +71,8 @@ public class TupleBuilderImpl implements TupleBuilder, Tuple {
     }
 
     /** {@inheritDoc} */
-    @Override public boolean contains(String colName) {
-        return map.containsKey(colName);
+    @Override public <T> T valueOrDefault(String colName, T def) {
+        return (T)map.getOrDefault(colName, def);
     }
 
     @Override public <T> T value(String colName) {
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 0406bd6..1407b0f 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
@@ -62,10 +62,7 @@ public class TupleMarshallerImpl implements TupleMarshaller {
 
         validate(keyTuple, schema.keyColumns());
 
-        TupleStatistics keyStat = tupleStatistics(schema.keyColumns(), keyTuple);
-        TupleStatistics valStat = tupleStatistics(schema.valueColumns(), valTuple);
-
-        final RowAssembler rowBuilder = createAssembler(schema, keyStat, valStat);
+        final RowAssembler rowBuilder = createAssembler(schema, keyTuple, valTuple);
 
         for (int i = 0; i < schema.keyColumns().length(); i++) {
             final Column col = schema.keyColumns().column(i);
@@ -87,38 +84,6 @@ public class TupleMarshallerImpl implements TupleMarshaller {
     }
 
     /**
-     * Analyze given tuple and gather statistics.
-     *
-     * @param cols Columns which statistics is calculated for.
-     * @param tup Tuple to analyze.
-     * @return Tuple statistics.
-     */
-    private TupleStatistics tupleStatistics(Columns cols, Tuple tup) {
-        if (tup == null)
-            return new TupleStatistics();
-
-        TupleStatistics chunk = new TupleStatistics();
-
-        for (int i = 0; i < cols.length(); i++) {
-            Column col = cols.column(i);
-
-            Object val = (tup.contains(col.name())) ? tup.value(col.name()) : col.defaultValue();
-
-            if (val == null)
-                chunk.hasNulls = true;
-            else if (col.type().spec().fixedLength())
-                chunk.payloadLen += col.type().sizeInBytes();
-            else {
-                chunk.nonNullVarlen++;
-
-                chunk.payloadLen += getValueSize(val, col.type());
-            }
-        }
-
-        return chunk;
-    }
-
-    /**
      * Validates columns values.
      *
      * @param tuple Tuple to validate.
@@ -142,11 +107,14 @@ public class TupleMarshallerImpl implements TupleMarshaller {
     /**
      * Creates {@link RowAssembler} for key-value tuples.
      *
-     * @param keyStat Key tuple statistics.
-     * @param valStat Value tuple statistics.
+     * @param keyTuple Key tuple.
+     * @param valTuple Value tuple.
      * @return Row assembler.
      */
-    private RowAssembler createAssembler(SchemaDescriptor schema, TupleStatistics keyStat, TupleStatistics valStat) {
+    private RowAssembler createAssembler(SchemaDescriptor schema, Tuple keyTuple, Tuple valTuple) {
+        TupleStatistics keyStat = tupleStatistics(schema.keyColumns(), keyTuple);
+        TupleStatistics valStat = tupleStatistics(schema.valueColumns(), valTuple);
+
         return new RowAssembler(
             schema,
             keyStat.payloadLen,
@@ -163,7 +131,7 @@ public class TupleMarshallerImpl implements TupleMarshaller {
      * @param tup Tuple.
      */
     private void writeColumn(RowAssembler rowAsm, Column col, Tuple tup) {
-        Object val = tup.contains(col.name()) ? tup.value(col.name()) : col.defaultValue();
+        Object val = tup.valueOrDefault(col.name(), col.defaultValue());
 
         if (val == null) {
             rowAsm.appendNull();
@@ -228,16 +196,51 @@ public class TupleMarshallerImpl implements TupleMarshaller {
     }
 
     /**
+     * Analyze given tuple and gather statistics.
+     *
+     * @param cols Columns which statistics is calculated for.
+     * @param tup Tuple to analyze.
+     * @return Tuple statistics.
+     */
+    private TupleStatistics tupleStatistics(Columns cols, Tuple tup) {
+        if (tup == null)
+            return TupleStatistics.ZERO_VARLEN_STATISTICS;
+
+        TupleStatistics chunk = new TupleStatistics();
+
+        for (int i = 0; i < cols.length(); i++) {
+            Column col = cols.column(i);
+
+            final Object val = tup.valueOrDefault(col.name(), col.defaultValue());
+
+            if (val == null)
+                chunk.hasNulls = true;
+            else if (col.type().spec().fixedLength())
+                chunk.payloadLen += col.type().sizeInBytes();
+            else {
+                chunk.nonNullVarlen++;
+
+                chunk.payloadLen += getValueSize(val, col.type());
+            }
+        }
+
+        return chunk;
+    }
+
+    /**
      * Tuple statistics record.
      */
     private static class TupleStatistics {
-        /** Tuple has nulls. */
-        boolean hasNulls;
+        /** Cached zero statistics. */
+        static final TupleStatistics ZERO_VARLEN_STATISTICS = new TupleStatistics();
+
+        /** Number of non-null varlen columns. */
+        int nonNullVarlen;
 
         /** Payload length in bytes. */
         int payloadLen;
 
-        /** Number of non-null varlen columns. */
-        int nonNullVarlen;
+        /** Tuple has nulls. */
+        boolean hasNulls;
     }
 }
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/benchmarks/TupleMarshallerVarlenOnlyBenchmark.java b/modules/table/src/test/java/org/apache/ignite/internal/benchmarks/TupleMarshallerVarlenOnlyBenchmark.java
index 2d25935..de5b063 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/benchmarks/TupleMarshallerVarlenOnlyBenchmark.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/benchmarks/TupleMarshallerVarlenOnlyBenchmark.java
@@ -77,7 +77,7 @@ public class TupleMarshallerVarlenOnlyBenchmark {
 
     /** Nullable cols. */
     @Param({"true", "false"})
-    public boolean nullable ;
+    public boolean nullable;
 
     /** Column types. */
     @Param({"string", "bytes"})
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/impl/TestTupleBuilder.java b/modules/table/src/test/java/org/apache/ignite/internal/table/impl/TestTupleBuilder.java
index 00450cf..f8520dc 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/impl/TestTupleBuilder.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/impl/TestTupleBuilder.java
@@ -24,34 +24,30 @@ import java.util.UUID;
 import org.apache.ignite.binary.BinaryObject;
 import org.apache.ignite.binary.BinaryObjects;
 import org.apache.ignite.table.Tuple;
+import org.apache.ignite.table.TupleBuilder;
 
 /**
  * Dummy table storage implementation.
  */
-public class TestTupleBuilder implements Tuple {
+public class TestTupleBuilder implements TupleBuilder, Tuple {
     /** Columns values. */
     private final Map<String, Object> map = new HashMap<>();
 
-    /**
-     * Constructor.
-     */
-    public TestTupleBuilder() {
-    }
-
-    public TestTupleBuilder set(String colName, Object value) {
+    /** {@inheritDoc} */
+    @Override public TestTupleBuilder set(String colName, Object value) {
         map.put(colName, value);
 
         return this;
     }
 
-    /** */
-    public Tuple build() {
+    /** {@inheritDoc} */
+    @Override public Tuple build() {
         return this;
     }
 
     /** {@inheritDoc} */
-    @Override public boolean contains(String colName) {
-        return map.containsKey(colName);
+    @Override public <T> T valueOrDefault(String colName, T def) {
+        return (T)map.getOrDefault(colName, def);
     }
 
     /** {@inheritDoc} */