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:50:56 UTC

[05/31] metamodel git commit: HBase improvements - Added row-deletion functionality, also made HBaseDataContext implement UpdateableDataContext

HBase improvements - Added row-deletion functionality, also made HBaseDataContext implement UpdateableDataContext


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

Branch: refs/heads/master
Commit: 0ffeeb20af4d58061d042bb6ebccafb2ab7d6502
Parents: f2d2ff2
Author: Gerard Dellemann <g....@quadient.com>
Authored: Tue May 1 14:34:36 2018 +0200
Committer: Gerard Dellemann <g....@quadient.com>
Committed: Tue May 1 14:34:36 2018 +0200

----------------------------------------------------------------------
 .../metamodel/hbase/HBaseDataContext.java       | 13 ++++-
 .../org/apache/metamodel/hbase/HBaseRow.java    |  5 --
 .../hbase/HBaseRowDeletionBuilder.java          | 50 ++++++++++++++++++++
 .../metamodel/hbase/HBaseUpdateCallback.java    | 25 ++++++++--
 .../org/apache/metamodel/hbase/HBaseWriter.java | 19 ++++++--
 5 files changed, 97 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/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 841b225..b913ca0 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
@@ -35,6 +35,9 @@ import org.apache.hadoop.hbase.filter.PageFilter;
 import org.apache.metamodel.DataContext;
 import org.apache.metamodel.MetaModelException;
 import org.apache.metamodel.QueryPostprocessDataContext;
+import org.apache.metamodel.UpdateScript;
+import org.apache.metamodel.UpdateSummary;
+import org.apache.metamodel.UpdateableDataContext;
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetHeader;
 import org.apache.metamodel.data.Row;
@@ -53,7 +56,7 @@ import org.slf4j.LoggerFactory;
 /**
  * MetaModel adaptor for Apache HBase.
  */
-public class HBaseDataContext extends QueryPostprocessDataContext {
+public class HBaseDataContext extends QueryPostprocessDataContext implements UpdateableDataContext {
 
     private static final Logger logger = LoggerFactory.getLogger(HBaseDataContext.class);
 
@@ -243,4 +246,12 @@ public class HBaseDataContext extends QueryPostprocessDataContext {
     private void setMaxRows(Scan scan, int maxRows) {
         scan.setFilter(new PageFilter(maxRows));
     }
+
+    @Override
+    public UpdateSummary executeUpdate(UpdateScript update) {
+        final HBaseUpdateCallback callback = new HBaseUpdateCallback(this);
+        update.run(callback);
+
+        return callback.getUpdateSummary();
+    }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java
index 2820602..79267da 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.java
@@ -61,11 +61,6 @@ final class HBaseRow extends AbstractRow implements Row {
         }
         final int colonIndex = name.indexOf(':');
         if (colonIndex != -1) {
-            /*
-             * I think this is DEATH code! The first line of this method: implementation
-             * _header.getSelectItem(index).getColumn() will always return only a columnfamily with our current
-             * implementations.
-             */
             byte[] family = name.substring(0, colonIndex).getBytes();
             byte[] qualifier = name.substring(colonIndex + 1).getBytes();
             byte[] value = _result.getValue(family, qualifier);

http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/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
new file mode 100644
index 0000000..925537a
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRowDeletionBuilder.java
@@ -0,0 +1,50 @@
+/**
+ * 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 org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.delete.AbstractRowDeletionBuilder;
+import org.apache.metamodel.schema.Table;
+
+public class HBaseRowDeletionBuilder extends AbstractRowDeletionBuilder {
+
+    private HBaseUpdateCallback _updateCallback;
+    private Object _key;
+
+    public HBaseRowDeletionBuilder(HBaseUpdateCallback updateCallback, Table table) {
+        super(table);
+        if (updateCallback == null) {
+            throw new IllegalArgumentException("UpdateCallback cannot be null");
+        }
+        _updateCallback = updateCallback;
+
+    }
+
+    @Override
+    public void execute() throws MetaModelException {
+        if (_key == null) {
+            throw new IllegalArgumentException("Key cannot be null");
+        }
+        _updateCallback.deleteRow((HBaseTable) getTable(), _key);
+    }
+
+    public void setKey(Object _key) {
+        this._key = _key;
+    }
+}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/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 6cc1522..39670db 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseUpdateCallback.java
@@ -79,11 +79,10 @@ public class HBaseUpdateCallback extends AbstractUpdateCallback implements Updat
     @Override
     public RowInsertionBuilder insertInto(Table table) throws IllegalArgumentException, IllegalStateException,
             UnsupportedOperationException {
-        throw new UnsupportedOperationException("Use insertInto(String tableName, HBaseColumn[] outputColumns)");
+        throw new UnsupportedOperationException("Use insertInto(Table table, HBaseColumn[] outputColumns)");
     }
 
-    public HBaseRowInsertionBuilder insertInto(Table table, HBaseColumn[] columns)
-            throws IllegalArgumentException {
+    public HBaseRowInsertionBuilder insertInto(Table table, HBaseColumn[] columns) throws IllegalArgumentException {
         if (table instanceof HBaseTable) {
             return new HBaseRowInsertionBuilder(this, (HBaseTable) table, columns);
         }
@@ -107,7 +106,25 @@ public class HBaseUpdateCallback extends AbstractUpdateCallback implements Updat
     @Override
     public RowDeletionBuilder deleteFrom(Table table) throws IllegalArgumentException, IllegalStateException,
             UnsupportedOperationException {
-        throw new UnsupportedOperationException();
+        throw new UnsupportedOperationException(
+                "Use deleteFrom(HBaseUpdateCallback updateCallback, Table table, Object key)");
+    }
+
+    public HBaseRowDeletionBuilder deleteFrom(HBaseUpdateCallback updateCallback, Table table)
+            throws IllegalArgumentException {
+        if (table instanceof HBaseTable) {
+            return new HBaseRowDeletionBuilder(this, (HBaseTable) table);
+        }
+        throw new IllegalArgumentException("Not an HBase table: " + table);
+    }
+
+    protected synchronized void deleteRow(HBaseTable hBaseTable, Object key) {
+        try {
+            final HBaseWriter HbaseWriter = new HBaseWriter(HBaseDataContext.createConfig(_configuration));
+            HbaseWriter.deleteRow(hBaseTable, key);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
     }
 
     public HBaseConfiguration getConfiguration() {

http://git-wip-us.apache.org/repos/asf/metamodel/blob/0ffeeb20/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java
index f8897da..ad63597 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseWriter.java
@@ -30,17 +30,17 @@ import org.apache.hadoop.hbase.client.Admin;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
 import org.apache.hadoop.hbase.client.Delete;
+import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.metamodel.MetaModelException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class HBaseWriter extends Configured {
 
-    static final byte[] INFO_COLUMNFAMILY = Bytes.toBytes("info");
-    static final byte[] NAME_QUALIFIER = Bytes.toBytes("name");
-    static final byte[] LOCATION_QUALIFIER = Bytes.toBytes("location");
-    static final byte[] DESCRIPTION_QUALIFIER = Bytes.toBytes("description");
+    private static final Logger logger = LoggerFactory.getLogger(HBaseWriter.class);
 
     private final Connection _connection;
 
@@ -86,7 +86,11 @@ public final class HBaseWriter extends Configured {
         try {
             Table table = _connection.getTable(TableName.valueOf(hBaseTable.getName()));
             try {
-                table.delete(new Delete(Bytes.toBytes(key.toString())));
+                if (rowExists(table, key) == true) {
+                    table.delete(new Delete(Bytes.toBytes(key.toString())));
+                } else {
+                    logger.warn("Rowkey with value " + key.toString() + " doesn't exist in the table");
+                }
             } finally {
                 table.close();
             }
@@ -95,6 +99,11 @@ public final class HBaseWriter extends Configured {
         }
     }
 
+    private boolean rowExists(Table table, Object key) throws IOException {
+        Get get = new Get(Bytes.toBytes(key.toString()));
+        return (table.get(get).isEmpty()) == true ? false : true;
+    }
+
     public void createTable(String tableName, Set<String> columnFamilies) throws IOException {
         try {
             // Create table