- 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 <[email protected]> Authored: Fri Jun 15 14:33:19 2018 +0200 Committer: Arjan Seijkens <[email protected]> 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 *
