You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2018/06/21 05:51:17 UTC

[26/31] metamodel git commit: - Refactored contructing String representation of byte arrays. - Have the HBaseRowInsertionBuilder no longer extend the AbstractRowInsertionBuilder, because it does things structurally different in some parts.

- Refactored contructing String representation of byte arrays.
- Have the HBaseRowInsertionBuilder no longer extend the AbstractRowInsertionBuilder, because it does things structurally different in some parts.


Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/1dc52f64
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/1dc52f64
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/1dc52f64

Branch: refs/heads/master
Commit: 1dc52f64311433d597ba87220eca54da0e85d942
Parents: 0ca1fd2
Author: Arjan Seijkens <a....@quadient.com>
Authored: Fri Jun 15 14:33:19 2018 +0200
Committer: Arjan Seijkens <a....@quadient.com>
Committed: Fri Jun 15 14:33:19 2018 +0200

----------------------------------------------------------------------
 .../apache/metamodel/hbase/HBaseFamilyMap.java  |   6 +-
 .../hbase/HBaseRowInsertionBuilder.java         | 139 ++++++++++++++-----
 .../apache/metamodel/hbase/InsertRowTest.java   |  14 ++
 3 files changed, 126 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/1dc52f64/hbase/src/main/java/org/apache/metamodel/hbase/HBaseFamilyMap.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseFamilyMap.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseFamilyMap.java
index 7483c63..32656c2 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseFamilyMap.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseFamilyMap.java
@@ -23,6 +23,8 @@ import java.util.Map;
 import java.util.NavigableMap;
 import java.util.Set;
 
+import org.apache.hadoop.hbase.util.Bytes;
+
 public class HBaseFamilyMap implements Map<Object, Object> {
 
     private final NavigableMap<byte[], byte[]> _map;
@@ -105,9 +107,9 @@ public class HBaseFamilyMap implements Map<Object, Object> {
             if (sb.length() > 1) {
                 sb.append(',');
             }
-            sb.append(new String(entry.getKey()));
+            sb.append(Bytes.toString(entry.getKey()));
             sb.append('=');
-            sb.append(new String(entry.getValue()));
+            sb.append(Bytes.toString(entry.getValue()));
         }
         sb.append('}');
         return sb.toString();

http://git-wip-us.apache.org/repos/asf/metamodel/blob/1dc52f64/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
index abbbfee..fe6e07a 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
@@ -27,32 +27,39 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.data.DefaultRow;
+import org.apache.metamodel.data.Row;
+import org.apache.metamodel.data.SimpleDataSetHeader;
 import org.apache.metamodel.data.Style;
-import org.apache.metamodel.insert.AbstractRowInsertionBuilder;
 import org.apache.metamodel.insert.RowInsertionBuilder;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 
 /**
  * A builder-class to insert rows in a HBase datastore.
  */
-public class HBaseRowInsertionBuilder extends AbstractRowInsertionBuilder<HBaseUpdateCallback> {
-    private List<HBaseColumn> columns = new ArrayList<>();
-    private List<Object> values = new ArrayList<>();
+public class HBaseRowInsertionBuilder implements RowInsertionBuilder {
+    private List<HBaseColumn> _columns = new ArrayList<>();
+    private List<Object> _values = new ArrayList<>();
 
     private int _indexOfIdColumn = -1;
 
+    private final HBaseUpdateCallback _updateCallback;
+    private final HBaseTable _table;
+
     /**
      * Creates a {@link HBaseRowInsertionBuilder}. The table and the column's columnFamilies are checked to exist in the schema.
      * @param updateCallback
      * @param table
-     * @param columns
+     * @param _columns
      * @throws IllegalArgumentException the columns list can't be null or empty
      * @throws MetaModelException when no ID-column is found.
      */
     public HBaseRowInsertionBuilder(final HBaseUpdateCallback updateCallback, final HBaseTable table) {
-        super(updateCallback, table);
+        _updateCallback = updateCallback;
+        _table = table;
 
-        checkTable(updateCallback, table);
+        checkTable(table);
     }
 
     /**
@@ -62,8 +69,11 @@ public class HBaseRowInsertionBuilder extends AbstractRowInsertionBuilder<HBaseU
      * @param tableGettingInserts
      * @throws MetaModelException If the table or the columnFamilies don't exist
      */
-    private void checkTable(final HBaseUpdateCallback updateCallback, final HBaseTable tableGettingInserts) {
-        final HBaseTable tableInSchema = (HBaseTable) updateCallback.getDataContext().getDefaultSchema().getTableByName(
+    private void checkTable(final HBaseTable tableGettingInserts) {
+        final HBaseTable tableInSchema = (HBaseTable) _updateCallback
+                .getDataContext()
+                .getDefaultSchema()
+                .getTableByName(
                 tableGettingInserts.getName());
         if (tableInSchema == null) {
             throw new MetaModelException("Trying to insert data into table: " + tableGettingInserts.getName()
@@ -113,20 +123,18 @@ public class HBaseRowInsertionBuilder extends AbstractRowInsertionBuilder<HBaseU
         }
 
         // The columns parameter should match the table's columns, just to be sure, this is checked again
-        checkColumnFamilies((HBaseTable) getTable(), getColumnFamilies(getColumns()));
+        checkColumnFamilies(getTable(), getColumnFamilies(getColumns()));
 
-        ((HBaseDataContext) getUpdateCallback().getDataContext()).getHBaseClient().insertRow(getTable().getName(),
+        ((HBaseDataContext) _updateCallback.getDataContext()).getHBaseClient().insertRow(getTable().getName(),
                 getColumns(), getValues(), _indexOfIdColumn);
     }
 
-    @Override
-    protected HBaseColumn[] getColumns() {
-        return columns.toArray(new HBaseColumn[columns.size()]);
+    private HBaseColumn[] getColumns() {
+        return _columns.toArray(new HBaseColumn[_columns.size()]);
     }
 
-    @Override
-    protected Object[] getValues() {
-        return values.toArray(new Object[values.size()]);
+    private Object[] getValues() {
+        return _values.toArray(new Object[_values.size()]);
     }
 
     @Override
@@ -137,19 +145,19 @@ public class HBaseRowInsertionBuilder extends AbstractRowInsertionBuilder<HBaseU
 
         final HBaseColumn hbaseColumn = getHbaseColumn(column);
 
-        for (int i = 0; i < columns.size(); i++) {
-            if (columns.get(i).equals(hbaseColumn)) {
-                values.set(i, value);
+        for (int i = 0; i < _columns.size(); i++) {
+            if (_columns.get(i).equals(hbaseColumn)) {
+                _values.set(i, value);
                 return this;
             }
         }
 
         if (hbaseColumn.isPrimaryKey()) {
-            _indexOfIdColumn = columns.size();
+            _indexOfIdColumn = _columns.size();
         }
 
-        columns.add((HBaseColumn) hbaseColumn);
-        values.add(value);
+        _columns.add((HBaseColumn) hbaseColumn);
+        _values.add(value);
 
         return this;
     }
@@ -171,30 +179,99 @@ public class HBaseRowInsertionBuilder extends AbstractRowInsertionBuilder<HBaseU
     }
 
     @Override
+    public boolean isSet(final Column column) {
+        for (int i = 0; i < _columns.size(); i++) {
+            if (_columns.get(i).equals(column)) {
+                return _values.get(i) != null;
+            }
+        }
+        return false;
+    }
+
+    @Override
     public RowInsertionBuilder value(final int columnIndex, final Object value) {
-        values.set(columnIndex, value);
+        return value(columnIndex, value, null);
+    }
+
+    @Override
+    public RowInsertionBuilder value(int columnIndex, Object value, Style style) {
+        _values.set(columnIndex, value);
         return this;
     }
 
     @Override
     public RowInsertionBuilder value(final String columnName, final Object value) {
-        for (Column column : columns) {
+        return value(columnName, value, null);
+    }
+
+    @Override
+    public RowInsertionBuilder value(Column column, Object value) {
+        return value(column, value, null);
+    }
+
+    @Override
+    public RowInsertionBuilder value(String columnName, Object value, Style style) {
+        for (Column column : _columns) {
             if (column.getName().equals(columnName)) {
                 return value(column, value, null);
             }
         }
 
         throw new IllegalArgumentException("No such column in table: " + columnName + ", available columns are: "
-                + columns);
+                + _columns);
     }
 
     @Override
-    public boolean isSet(final Column column) {
-        for (int i = 0; i < columns.size(); i++) {
-            if (columns.get(i).equals(column)) {
-                return values.get(i) != null;
+    public Row toRow() {
+        return new DefaultRow(new SimpleDataSetHeader(_columns.stream().map(SelectItem::new).collect(Collectors
+                .toList())), getValues());
+    }
+
+    @Override
+    public HBaseTable getTable() {
+        return _table;
+    }
+
+    @Override
+    public RowInsertionBuilder like(Row row) {
+        List<SelectItem> selectItems = row.getSelectItems();
+        for (int i = 0; i < selectItems.size(); i++) {
+            SelectItem selectItem = selectItems.get(i);
+            Column column = selectItem.getColumn();
+            if (column != null) {
+                if (_table == column.getTable()) {
+                    value(column, row.getValue(i));
+                } else {
+                    value(column.getName(), row.getValue(i));
+                }
             }
         }
-        return false;
+        return this;
+    }
+
+    @Override
+    public String toSql() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("INSERT INTO ");
+        sb.append(_table.getQualifiedLabel());
+        sb.append("(");
+        sb.append(_columns.stream().map(Column::getName).collect(Collectors.joining(",")));
+        sb.append(") VALUES (");
+        sb.append(_values.stream().map(value -> {
+            if (value == null) {
+                return "NULL";
+            } else if (value instanceof String) {
+                return "\"" + value + "\"";
+            } else {
+                return value.toString();
+            }
+        }).collect(Collectors.joining(",")));
+        sb.append(")");
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        return toSql();
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/1dc52f64/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
index 31a33d0..1c21cba 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/InsertRowTest.java
@@ -245,6 +245,20 @@ public class InsertRowTest extends HBaseUpdateCallbackTest {
         checkRows(true, false);
     }
 
+    @Test
+    public void testSqlRepresentation() throws IOException {
+        final HBaseTable table = createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO, CF_BAR);
+
+        RowInsertionBuilder insertBuilder = getUpdateCallback()
+                .insertInto(table)
+                .value(new HBaseColumn(CF_FOO, Q_BAH, table), V_WORLD)
+                .value(new HBaseColumn(CF_FOO, Q_HELLO, table), V_THERE)
+                .value(new HBaseColumn(CF_BAR, Q_HEY, table), V_YO);
+
+        assertEquals("INSERT INTO HBase.table_for_junit(foo:bah,foo:hello,bar:hey) "
+                + "VALUES (\"world\",\"there\",\"yo\")", insertBuilder.toSql());
+    }
+
     /**
      * Converts a list of {@link HBaseColumn}'s to an array of {@link HBaseColumn}'s
      *