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:13 UTC

[22/31] metamodel git commit: - Made HBaseColumn private, even though in the future, I would like to see something like a WideColumn interface to use for Wide Column stores. - Refactored the HBaseCreateTableBuilder so you don't have to pass the column fa

- Made HBaseColumn private, even though in the future, I would like to see something like a WideColumn interface to use for Wide Column stores.
- Refactored the HBaseCreateTableBuilder so you don't have to pass the column families to the constructor, but it can determine them based on the columns set on it using the "withColumn" method.
- Refactored the HBaseDeletionBuilder so it uses the "whereItems" instead of the custom "setKey" method to determine what rows it deletes.
- Refactored the HBaseRowInsertionBuilder so it works with "normal" MetaModel columns and it will construct HBaseColumn for internal usage only.
- Removed the no longer needed, not part of the interface createTable method from HBaseUpdateCallback
- Move some test cases to a new HBaseClientTest class, because they specifically test the HBaseClient class
- Updated some test in accordance with the refactorings mentioned above.


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

Branch: refs/heads/master
Commit: e37546de91200cb13661bf438152e422df6e8814
Parents: 909cb48
Author: Arjan Seijkens <a....@quadient.com>
Authored: Fri Jun 8 14:50:05 2018 +0200
Committer: Arjan Seijkens <a....@quadient.com>
Committed: Fri Jun 8 14:50:05 2018 +0200

----------------------------------------------------------------------
 .../org/apache/metamodel/hbase/HBaseColumn.java |   2 +-
 .../hbase/HBaseCreateTableBuilder.java          |  47 +++++----
 .../metamodel/hbase/HBaseDataContext.java       |   2 +-
 .../hbase/HBaseRowDeletionBuilder.java          |  57 ++++++++--
 .../hbase/HBaseRowInsertionBuilder.java         |  27 +++--
 .../metamodel/hbase/HBaseUpdateCallback.java    |  17 ---
 .../apache/metamodel/hbase/CreateTableTest.java | 104 +++++++++----------
 .../apache/metamodel/hbase/DeleteRowTest.java   |  34 ++----
 .../apache/metamodel/hbase/HBaseClientTest.java |  89 ++++++++++++++++
 .../hbase/HBaseUpdateCallbackTest.java          |   9 +-
 10 files changed, 243 insertions(+), 145 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
index d07c477..f798b07 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseColumn.java
@@ -22,7 +22,7 @@ import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.MutableColumn;
 import org.apache.metamodel.schema.Table;
 
-public final class HBaseColumn extends MutableColumn {
+final class HBaseColumn extends MutableColumn {
     public static final ColumnType DEFAULT_COLUMN_TYPE_FOR_ID_COLUMN = ColumnType.BINARY;
     public static final ColumnType DEFAULT_COLUMN_TYPE_FOR_COLUMN_FAMILIES = ColumnType.LIST;
 

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
index 4f8865c..28963cb 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseCreateTableBuilder.java
@@ -19,6 +19,7 @@
 package org.apache.metamodel.hbase;
 
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.create.AbstractTableCreationBuilder;
@@ -32,12 +33,6 @@ import org.apache.metamodel.util.SimpleTableDef;
  */
 public class HBaseCreateTableBuilder extends AbstractTableCreationBuilder<HBaseUpdateCallback> {
 
-    private Set<String> _columnFamilies;
-
-    public HBaseCreateTableBuilder(final HBaseUpdateCallback updateCallback, final Schema schema, final String name) {
-        this(updateCallback, schema, name, null);
-    }
-
     /**
      * Create a {@link HBaseCreateTableBuilder}.
      * Throws an {@link IllegalArgumentException} if the schema isn't a {@link MutableSchema}.
@@ -46,40 +41,47 @@ public class HBaseCreateTableBuilder extends AbstractTableCreationBuilder<HBaseU
      * @param name
      * @param columnFamilies
      */
-    public HBaseCreateTableBuilder(final HBaseUpdateCallback updateCallback, final Schema schema, final String name,
-            final Set<String> columnFamilies) {
+    public HBaseCreateTableBuilder(final HBaseUpdateCallback updateCallback, final Schema schema, final String name) {
         super(updateCallback, schema, name);
         if (!(schema instanceof MutableSchema)) {
             throw new IllegalArgumentException("Not a mutable schema: " + schema);
         }
-        this._columnFamilies = columnFamilies;
     }
 
     @Override
     public Table execute() {
-        if (_columnFamilies == null || _columnFamilies.isEmpty()) {
-            throw new MetaModelException("Creating a table without columnFamilies");
+        Set<String> columnFamilies = getColumnFamilies();
+
+        if (columnFamilies == null || columnFamilies.isEmpty()) {
+            throw new MetaModelException("Can't create a table without column families.");
         }
 
         final Table table = getTable();
 
         // Add the table to the datastore
         ((HBaseDataContext) getUpdateCallback().getDataContext()).getHBaseClient().createTable(table.getName(),
-                _columnFamilies);
+                columnFamilies);
 
         // Update the schema
         addNewTableToSchema(table);
         return getSchema().getTableByName(table.getName());
     }
 
-    /**
-     * Set the columnFamilies. This should be used when creating this object using the
-     * {@link HBaseCreateTableBuilder#HBaseCreateTableBuilder(HBaseUpdateCallback, Schema, String)}
-     * constructor
-     * @param columnFamilies
-     */
-    public void setColumnFamilies(final Set<String> columnFamilies) {
-        this._columnFamilies = columnFamilies;
+    private Set<String> getColumnFamilies() {
+        return getTable().getColumns().stream().map(column -> {
+            if (column instanceof HBaseColumn) {
+                return ((HBaseColumn) column).getColumnFamily();
+            } else {
+                String columnName = column.getName();
+
+                String[] columnNameParts = columnName.split(":");
+                if (columnNameParts.length > 0 && columnNameParts.length < 3) {
+                    return columnNameParts[0];
+                } else {
+                    throw new MetaModelException("Can't determine column family for column \"" + columnName + "\".");
+                }
+            }
+        }).distinct().collect(Collectors.toSet());
     }
 
     /**
@@ -90,8 +92,9 @@ public class HBaseCreateTableBuilder extends AbstractTableCreationBuilder<HBaseU
      */
     private void addNewTableToSchema(final Table table) {
         final MutableSchema schema = (MutableSchema) getSchema();
-        final SimpleTableDef emptyTableDef = new SimpleTableDef(table.getName(), _columnFamilies.toArray(
-                new String[_columnFamilies.size()]));
+        final Set<String> columnFamilies = getColumnFamilies();
+        final SimpleTableDef emptyTableDef = new SimpleTableDef(table.getName(), columnFamilies.toArray(
+                new String[columnFamilies.size()]));
         schema.addTable(new HBaseTable((HBaseDataContext) getUpdateCallback().getDataContext(), emptyTableDef, schema,
                 HBaseConfiguration.DEFAULT_ROW_KEY_TYPE));
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
index 0386ec3..9c989db 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
@@ -251,7 +251,7 @@ public class HBaseDataContext extends QueryPostprocessDataContext implements Upd
         return callback.getUpdateSummary();
     }
 
-    public HBaseClient getHBaseClient() {
+    HBaseClient getHBaseClient() {
         return new HBaseClient(this.getConnection());
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
index 75301e3..078fe5b 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
@@ -18,8 +18,17 @@
  */
 package org.apache.metamodel.hbase;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.delete.AbstractRowDeletionBuilder;
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.LogicalOperator;
+import org.apache.metamodel.query.OperatorType;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.Table;
 
 /**
@@ -28,7 +37,6 @@ import org.apache.metamodel.schema.Table;
 public class HBaseRowDeletionBuilder extends AbstractRowDeletionBuilder {
 
     private final HBaseDataContext _dataContext;
-    private Object _key;
 
     /**
      * Creates a {@link HBaseRowDeletionBuilder}
@@ -49,13 +57,50 @@ public class HBaseRowDeletionBuilder extends AbstractRowDeletionBuilder {
      */
     @Override
     public synchronized void execute() {
-        if (_key == null) {
-            throw new MetaModelException("Key cannot be null");
+        final List<FilterItem> whereItems = getWhereItems();
+        if (whereItems == null || whereItems.size() == 0) {
+            throw new IllegalArgumentException("HBase currently only supports deleting items by their row key.");
+        }
+
+        final FilterItem filterItem = whereItems.get(0);
+        if (!HBaseDataContext.FIELD_ID.equals(filterItem.getSelectItem().getColumn().getName())) {
+            throw new IllegalArgumentException("HBase currently only supports deleting items by their row key.");
         }
-        _dataContext.getHBaseClient().deleteRow(getTable().getName(), _key);
+
+        getRowKeys(filterItem).forEach(rowKey -> _dataContext.getHBaseClient().deleteRow(getTable().getName(), rowKey));
     }
 
-    public void setKey(final Object key) {
-        this._key = key;
+    private List<Object> getRowKeys(final FilterItem whereItem) {
+        final List<Object> rowKeys = new ArrayList<>();
+
+        if (whereItem.isCompoundFilter()) {
+            final LogicalOperator logicalOperator = whereItem.getLogicalOperator();
+            if (logicalOperator != LogicalOperator.OR) {
+                throw new IllegalStateException(
+                        "HBase currently only supports deleting items by their row key. Violated by operator between where items: "
+                                + whereItem);
+            }
+
+            Arrays.stream(whereItem.getChildItems()).forEach(childItem -> rowKeys.addAll(getRowKeys(childItem)));
+        } else {
+            final OperatorType operator = whereItem.getOperator();
+            if (!OperatorType.EQUALS_TO.equals(operator) && !OperatorType.IN.equals(operator)) {
+                throw new IllegalStateException(
+                        "HBase currently only supports deleting items by their row key. Violated by operator in where item: "
+                                + whereItem);
+            }
+
+            final SelectItem selectItem = whereItem.getSelectItem();
+            final Column column = selectItem.getColumn();
+            final Object operand = whereItem.getOperand();
+
+            if (column == null || operand == null || !column.isPrimaryKey() || selectItem.hasFunction()) {
+                throw new IllegalStateException(
+                        "HBase currently only supports deleting items by their row key. Violated by where item: "
+                                + whereItem);
+            }
+            rowKeys.add(operand);
+        }
+        return rowKeys;
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/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 0a3a4a3..abbbfee 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowInsertionBuilder.java
@@ -134,27 +134,42 @@ public class HBaseRowInsertionBuilder extends AbstractRowInsertionBuilder<HBaseU
         if (column == null) {
             throw new IllegalArgumentException("Column cannot be null.");
         }
-        if (!(column instanceof HBaseColumn)) {
-            throw new IllegalArgumentException("Column is not an HBaseColumn.");
-        }
+
+        final HBaseColumn hbaseColumn = getHbaseColumn(column);
 
         for (int i = 0; i < columns.size(); i++) {
-            if (columns.get(i).equals(column)) {
+            if (columns.get(i).equals(hbaseColumn)) {
                 values.set(i, value);
                 return this;
             }
         }
 
-        if (column.isPrimaryKey()) {
+        if (hbaseColumn.isPrimaryKey()) {
             _indexOfIdColumn = columns.size();
         }
 
-        columns.add((HBaseColumn) column);
+        columns.add((HBaseColumn) hbaseColumn);
         values.add(value);
 
         return this;
     }
 
+    private HBaseColumn getHbaseColumn(final Column column) {
+        if (column instanceof HBaseColumn) {
+            return (HBaseColumn) column;
+        } else {
+            final String columnName = column.getName();
+            final String[] columnNameParts = columnName.split(":");
+            if (columnNameParts.length == 1) {
+                return new HBaseColumn(columnNameParts[0], getTable());
+            }
+            if (columnNameParts.length == 2) {
+                return new HBaseColumn(columnNameParts[0], columnNameParts[1], getTable());
+            }
+            throw new MetaModelException("Can't determine column family for column \"" + columnName + "\".");
+        }
+    }
+
     @Override
     public RowInsertionBuilder value(final int columnIndex, final Object value) {
         values.set(columnIndex, value);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
index 5f44200..503de46 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
@@ -18,8 +18,6 @@
  */
 package org.apache.metamodel.hbase;
 
-import java.util.Set;
-
 import org.apache.metamodel.AbstractUpdateCallback;
 import org.apache.metamodel.UpdateCallback;
 import org.apache.metamodel.create.TableCreationBuilder;
@@ -43,18 +41,6 @@ final class HBaseUpdateCallback extends AbstractUpdateCallback implements Update
         return new HBaseCreateTableBuilder(this, schema, name);
     }
 
-    /**
-     * Initiates the building of a table creation operation.
-     * @param schema the schema to create the table in
-     * @param name the name of the new table
-     * @param columnFamilies the columnFamilies of the new table
-     * @return {@link HBaseCreateTableBuilder}
-     */
-    public HBaseCreateTableBuilder createTable(final Schema schema, final String name,
-            final Set<String> columnFamilies) {
-        return new HBaseCreateTableBuilder(this, schema, name, columnFamilies);
-    }
-
     @Override
     public boolean isDropTableSupported() {
         return true;
@@ -65,9 +51,6 @@ final class HBaseUpdateCallback extends AbstractUpdateCallback implements Update
         return new HBaseTableDropBuilder(table, this);
     }
 
-    /**
-     * @throws UnsupportedOperationException use {@link HBaseUpdateCallback#insertInto(String, String)}
-     */
     @Override
     public RowInsertionBuilder insertInto(final Table table) {
         if (table instanceof HBaseTable) {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
index 0415c12..4c71a47 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/CreateTableTest.java
@@ -18,20 +18,18 @@
  */
 package org.apache.metamodel.hbase;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
-import java.util.LinkedHashSet;
-import java.util.Set;
 
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.schema.ImmutableSchema;
+import org.apache.metamodel.schema.Table;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
-import com.google.common.collect.Sets;
-
 public class CreateTableTest extends HBaseUpdateCallbackTest {
     @Rule
     public ExpectedException exception = ExpectedException.none();
@@ -58,73 +56,36 @@ public class CreateTableTest extends HBaseUpdateCallbackTest {
     }
 
     /**
-     * Create a table without columnFamilies, should throw a MetaModelException
+     * Create a table without column families, should throw a MetaModelException
      */
     @Test
-    public void testCreateTableWithoutColumnFamilies() {
+    public void testWithoutColumnFamilies() {
         exception.expect(MetaModelException.class);
-        exception.expectMessage("Creating a table without columnFamilies");
+        exception.expectMessage("Can't create a table without column families.");
 
         getUpdateCallback().createTable(getSchema(), TABLE_NAME).execute();
     }
 
     /**
-     * Create a table with columnFamilies null, should throw a MetaModelException
-     */
-    @Test
-    public void testColumnFamiliesNull() {
-        exception.expect(MetaModelException.class);
-        exception.expectMessage("Creating a table without columnFamilies");
-
-        getUpdateCallback().createTable(getSchema(), TABLE_NAME, null).execute();
-    }
-
-    /**
-     * Create a table with columnFamilies empty, should throw a MetaModelException
-     */
-    @Test
-    public void testColumnFamiliesEmpty() {
-        exception.expect(MetaModelException.class);
-        exception.expectMessage("Creating a table without columnFamilies");
-
-        final Set<String> columnFamilies = new LinkedHashSet<String>();
-        getUpdateCallback().createTable(getSchema(), TABLE_NAME, columnFamilies).execute();
-    }
-
-    /**
-     * Creating a HBaseClient with the tableName null, should throw a exception
-     */
-    @Test
-    public void testCreatingTheHBaseClientWithTableNameNull() {
-        exception.expect(IllegalArgumentException.class);
-        exception.expectMessage("Can't create a table without having the tableName or columnFamilies");
-
-        final Set<String> columnFamilies = new LinkedHashSet<>();
-        columnFamilies.add("1");
-        new HBaseClient(getDataContext().getConnection()).createTable(null, columnFamilies);
-    }
-
-    /**
-     * Creating a HBaseClient with the tableName null, should throw a exception
+     * Create a table without column families, should throw a MetaModelException
      */
     @Test
-    public void testCreatingTheHBaseClientWithColumnFamiliesNull() {
+    public void testWithEmptyColumn() {
         exception.expect(IllegalArgumentException.class);
-        exception.expectMessage("Can't create a table without having the tableName or columnFamilies");
+        exception.expectMessage("Family name can not be empty");
 
-        new HBaseClient(getDataContext().getConnection()).createTable("1", null);
+        getUpdateCallback().createTable(getSchema(), TABLE_NAME).withColumn("").execute();
     }
 
     /**
-     * Creating a HBaseClient with the tableName null, should throw a exception
+     * Create a table without column families, should throw a MetaModelException
      */
     @Test
-    public void testCreatingTheHBaseClientWithColumnFamiliesEmpty() {
-        exception.expect(IllegalArgumentException.class);
-        exception.expectMessage("Can't create a table without having the tableName or columnFamilies");
+    public void testWithIndeterminableColumn() {
+        exception.expect(MetaModelException.class);
+        exception.expectMessage("Can't determine column family for column \"a:b:c\".");
 
-        final Set<String> columnFamilies = new LinkedHashSet<>();
-        new HBaseClient(getDataContext().getConnection()).createTable("1", columnFamilies);
+        getUpdateCallback().createTable(getSchema(), TABLE_NAME).withColumn("a:b:c").execute();
     }
 
     /**
@@ -137,9 +98,17 @@ public class CreateTableTest extends HBaseUpdateCallbackTest {
         final HBaseCreateTableBuilder hBaseCreateTableBuilder = (HBaseCreateTableBuilder) getUpdateCallback()
                 .createTable(getSchema(), TABLE_NAME);
 
-        hBaseCreateTableBuilder.setColumnFamilies(Sets.newHashSet(CF_FOO, CF_BAR));
+        hBaseCreateTableBuilder.withColumn(CF_FOO);
+        hBaseCreateTableBuilder.withColumn(CF_BAR);
         hBaseCreateTableBuilder.execute();
         checkSuccesfullyInsertedTable();
+
+        final Table table = getDataContext().getDefaultSchema().getTableByName(TABLE_NAME);
+        assertTrue(table instanceof HBaseTable);
+
+        // Assert that the Table has 3 column families, a default "_id" one, and two based on the column families for
+        // the columns.
+        assertEquals(3, ((HBaseTable) table).getColumnFamilies().size());
     }
 
     /**
@@ -148,13 +117,23 @@ public class CreateTableTest extends HBaseUpdateCallbackTest {
      * @throws IOException
      */
     @Test
-    public void testSettingColumnFamiliesAfterConstrutor() throws IOException {
+    public void testCreateTableWithQualifiedColumns() throws IOException {
         final HBaseCreateTableBuilder hBaseCreateTableBuilder = (HBaseCreateTableBuilder) getUpdateCallback()
                 .createTable(getSchema(), TABLE_NAME);
 
-        hBaseCreateTableBuilder.setColumnFamilies(Sets.newHashSet(CF_FOO, CF_BAR));
+        hBaseCreateTableBuilder.withColumn(CF_FOO + ":" + Q_BAH);
+        hBaseCreateTableBuilder.withColumn(CF_FOO + ":" + Q_HELLO);
+        hBaseCreateTableBuilder.withColumn(CF_BAR + ":" + Q_HEY);
+        hBaseCreateTableBuilder.withColumn(CF_BAR + ":" + Q_HI);
         hBaseCreateTableBuilder.execute();
         checkSuccesfullyInsertedTable();
+
+        final Table table = getDataContext().getDefaultSchema().getTableByName(TABLE_NAME);
+        assertTrue(table instanceof HBaseTable);
+
+        // Assert that the Table has 3 column families, a default "_id" one, and two based on the column families for
+        // the columns.
+        assertEquals(3, ((HBaseTable) table).getColumnFamilies().size());
     }
 
     /**
@@ -164,7 +143,18 @@ public class CreateTableTest extends HBaseUpdateCallbackTest {
      */
     @Test
     public void testCreateTableColumnFamiliesInConstrutor() throws IOException {
-        getUpdateCallback().createTable(getSchema(), TABLE_NAME, Sets.newHashSet(CF_FOO, CF_BAR)).execute();
+        final HBaseCreateTableBuilder hBaseCreateTableBuilder = (HBaseCreateTableBuilder) getUpdateCallback()
+                .createTable(getSchema(), TABLE_NAME);
+
+        hBaseCreateTableBuilder.withColumn(HBaseDataContext.FIELD_ID);
+        hBaseCreateTableBuilder.withColumn(CF_BAR);
+        hBaseCreateTableBuilder.execute();
         checkSuccesfullyInsertedTable();
+
+        final Table table = getDataContext().getDefaultSchema().getTableByName(TABLE_NAME);
+        assertTrue(table instanceof HBaseTable);
+
+        // Assert that the Table has 2 column families.
+        assertEquals(2, ((HBaseTable) table).getColumnFamilies().size());
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
index 5a95032..2eefb06 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/DeleteRowTest.java
@@ -23,7 +23,6 @@ import static org.junit.Assert.assertTrue;
 import java.io.IOException;
 import java.util.Map;
 
-import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.insert.RowInsertionBuilder;
 import org.apache.metamodel.schema.MutableTable;
 import org.junit.Rule;
@@ -76,35 +75,14 @@ public class DeleteRowTest extends HBaseUpdateCallbackTest {
      */
     @Test
     public void testNotSettingRowkey() throws IOException {
-        exception.expect(MetaModelException.class);
-        exception.expectMessage("Key cannot be null");
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("HBase currently only supports deleting items by their row key.");
 
         final HBaseTable existingTable = createAndAddTableToDatastore(TABLE_NAME, HBaseDataContext.FIELD_ID, CF_FOO,
                 CF_BAR);
         getUpdateCallback().deleteFrom(existingTable).execute();
     }
 
-    /**
-     * Creating a HBaseClient with the tableName null, should throw a exception
-     */
-    @Test
-    public void testCreatingTheHBaseClientWithTableNameNull() {
-        exception.expect(IllegalArgumentException.class);
-        exception.expectMessage("Can't delete a row without having tableName or rowKey");
-
-        new HBaseClient(getDataContext().getConnection()).deleteRow(null, new String("1"));
-    }
-
-    /**
-     * Creating a HBaseClient with the rowKey null, should throw a exception
-     */
-    @Test
-    public void testCreatingTheHBaseClientWithRowKeyNull() {
-        exception.expect(IllegalArgumentException.class);
-        exception.expectMessage("Can't delete a row without having tableName or rowKey");
-
-        new HBaseClient(getDataContext().getConnection()).deleteRow("tableName", null);
-    }
 
     /**
      * Goodflow. Deleting a row, that doesn't exist, should not throw an exception
@@ -119,7 +97,7 @@ public class DeleteRowTest extends HBaseUpdateCallbackTest {
         checkRows(false, false);
         final HBaseRowDeletionBuilder rowDeletionBuilder = (HBaseRowDeletionBuilder) getUpdateCallback().deleteFrom(
                 existingTable);
-        rowDeletionBuilder.setKey(RK_1);
+        rowDeletionBuilder.where(HBaseDataContext.FIELD_ID).eq(RK_1);
         rowDeletionBuilder.execute();
         checkRows(false, false);
     }
@@ -137,13 +115,13 @@ public class DeleteRowTest extends HBaseUpdateCallbackTest {
         checkRows(false, false);
         final HBaseRowDeletionBuilder rowDeletionBuilder = (HBaseRowDeletionBuilder) getUpdateCallback().deleteFrom(
                 existingTable);
-        rowDeletionBuilder.setKey("");
+        rowDeletionBuilder.where(HBaseDataContext.FIELD_ID).eq("");
         rowDeletionBuilder.execute();
         checkRows(false, false);
     }
 
     /**
-     * Goodflow. Deleting a row succesfully.
+     * Goodflow. Deleting a row successfully.
      *
      * @throws IOException
      */
@@ -160,7 +138,7 @@ public class DeleteRowTest extends HBaseUpdateCallbackTest {
         checkRows(true, false);
         final HBaseRowDeletionBuilder rowDeletionBuilder = (HBaseRowDeletionBuilder) getUpdateCallback().deleteFrom(
                 existingTable);
-        rowDeletionBuilder.setKey(RK_1);
+        rowDeletionBuilder.where(HBaseDataContext.FIELD_ID).eq(RK_1);
         rowDeletionBuilder.execute();
         checkRows(false, false);
     }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/test/java/org/apache/metamodel/hbase/HBaseClientTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseClientTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseClientTest.java
new file mode 100644
index 0000000..35aa310
--- /dev/null
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseClientTest.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.hbase;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class HBaseClientTest extends HBaseTestCase {
+    @Rule
+    public ExpectedException exception = ExpectedException.none();
+
+    /**
+     * Creating a HBaseClient with the tableName null, should throw a exception
+     */
+    @Test
+    public void testCreatingTheHBaseClientWithTableNameNull() {
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("Can't create a table without having the tableName or columnFamilies");
+
+        final Set<String> columnFamilies = new LinkedHashSet<>();
+        columnFamilies.add("1");
+        new HBaseClient(getDataContext().getConnection()).createTable(null, columnFamilies);
+    }
+
+    /**
+     * Creating a HBaseClient with the tableName null, should throw a exception
+     */
+    @Test
+    public void testCreatingTheHBaseClientWithColumnFamiliesNull() {
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("Can't create a table without having the tableName or columnFamilies");
+
+        new HBaseClient(getDataContext().getConnection()).createTable("1", null);
+    }
+
+    /**
+     * Creating a HBaseClient with the tableName null, should throw a exception
+     */
+    @Test
+    public void testCreatingTheHBaseClientWithColumnFamiliesEmpty() {
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("Can't create a table without having the tableName or columnFamilies");
+
+        final Set<String> columnFamilies = new LinkedHashSet<>();
+        new HBaseClient(getDataContext().getConnection()).createTable("1", columnFamilies);
+    }
+
+    /**
+     * Creating a HBaseClient with the tableName null, should throw a exception
+     */
+    @Test
+    public void testDeleteRowWithoutTableName() {
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("Can't delete a row without having tableName or rowKey");
+
+        new HBaseClient(getDataContext().getConnection()).deleteRow(null, new String("1"));
+    }
+
+    /**
+     * Creating a HBaseClient with the rowKey null, should throw a exception
+     */
+    @Test
+    public void testCreatingTheHBaseClientWithRowKeyNull() {
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage("Can't delete a row without having tableName or rowKey");
+
+        new HBaseClient(getDataContext().getConnection()).deleteRow("tableName", null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e37546de/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
index 14205fb..7d03641 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseUpdateCallbackTest.java
@@ -24,10 +24,8 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.hadoop.hbase.TableName;
@@ -108,11 +106,8 @@ public abstract class HBaseUpdateCallbackTest extends HBaseTestCase {
      */
     protected HBaseTable createAndAddTableToDatastore(final String tableName, final String idColumn,
             final String columnFamily1, final String columnFamily2) throws IOException {
-        final Set<String> columnFamilies = new LinkedHashSet<>();
-        columnFamilies.add(idColumn);
-        columnFamilies.add(columnFamily1);
-        columnFamilies.add(columnFamily2);
-        updateCallback.createTable(schema, tableName, columnFamilies).execute();
+        updateCallback.createTable(schema, tableName).withColumn(columnFamily1).withColumn(columnFamily2).execute();
+
         checkSuccesfullyInsertedTable();
         return (HBaseTable) getDataContext().getDefaultSchema().getTableByName(tableName);
     }