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 2014/03/24 22:26:05 UTC

[1/9] git commit: Added draft module for Apache HBase.

Repository: incubator-metamodel
Updated Branches:
  refs/heads/master b920b5dac -> a51ff94a7


Added draft module for Apache HBase.

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

Branch: refs/heads/master
Commit: eba65a052065aea521e7d2159b94ab07de9fb528
Parents: a767740
Author: kasper <ka...@192.168.0.165>
Authored: Tue Jul 30 11:12:52 2013 +0200
Committer: kasper <ka...@192.168.0.165>
Committed: Tue Jul 30 11:12:52 2013 +0200

----------------------------------------------------------------------
 hbase/pom.xml                                   |  56 ++++++
 .../org/apache/metamodel/hbase/ByteUtils.java   | 114 +++++++++++
 .../metamodel/hbase/HBaseConfiguration.java     | 107 ++++++++++
 .../metamodel/hbase/HBaseDataContext.java       | 199 +++++++++++++++++++
 .../apache/metamodel/hbase/HBaseDataSet.java    |  77 +++++++
 .../apache/metamodel/hbase/HBaseFamilyMap.java  | 116 +++++++++++
 .../org/apache/metamodel/hbase/HBaseRow.java    |  89 +++++++++
 .../org/apache/metamodel/hbase/HBaseTable.java  | 129 ++++++++++++
 .../apache/metamodel/hbase/package-info.java    |  22 ++
 .../metamodel/hbase/HBaseDataContextTest.java   | 159 +++++++++++++++
 pom.xml                                         |   1 +
 11 files changed, 1069 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/pom.xml
----------------------------------------------------------------------
diff --git a/hbase/pom.xml b/hbase/pom.xml
new file mode 100644
index 0000000..382d116
--- /dev/null
+++ b/hbase/pom.xml
@@ -0,0 +1,56 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<parent>
+		<artifactId>MetaModel</artifactId>
+		<groupId>org.apache.metamodel</groupId>
+		<version>3.4.4</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+	<artifactId>MetaModel-hbase</artifactId>
+	<name>MetaModel module for Apache HBase</name>
+
+	<properties>
+		<hbase.version>0.95.1-hadoop1</hbase.version>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.metamodel</groupId>
+			<artifactId>MetaModel-core</artifactId>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.hbase</groupId>
+			<artifactId>hbase-client</artifactId>
+			<version>${hbase.version}</version>
+			<exclusions>
+				<exclusion>
+					<artifactId>log4j</artifactId>
+					<groupId>log4j</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>commons-logging</artifactId>
+					<groupId>commons-logging</groupId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jcl-over-slf4j</artifactId>
+		</dependency>
+		<dependency>
+		    <groupId>org.slf4j</groupId>
+		    <artifactId>slf4j-log4j12</artifactId>
+		    <scope>provided</scope>
+		</dependency>
+
+		<!-- Test dependencies -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+
+	</dependencies>
+
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/src/main/java/org/apache/metamodel/hbase/ByteUtils.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/ByteUtils.java b/hbase/src/main/java/org/apache/metamodel/hbase/ByteUtils.java
new file mode 100644
index 0000000..0a4d1bf
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/ByteUtils.java
@@ -0,0 +1,114 @@
+/**
+ * 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.math.BigDecimal;
+
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.metamodel.MetaModelException;
+
+/**
+ * Util class for Converting Object values to Bytes
+ * 
+ */
+public class ByteUtils {
+
+	public static byte[] toBytes(Object o) {
+		if (o != null) {
+			return toBytes(o, o.getClass());
+		}
+		return null;
+	}
+
+	public static byte[] toBytes(Object value, Class<?> klass) {
+		if (klass.isAssignableFrom(String.class)) {
+			return Bytes.toBytes(value.toString());
+		} else if (klass.equals(int.class)
+				|| klass.isAssignableFrom(Integer.class)) {
+			return Bytes.toBytes(value instanceof Integer ? (Integer) value
+					: new Integer(value.toString()));
+		} else if (klass.equals(long.class)
+				|| klass.isAssignableFrom(Long.class)) {
+			return Bytes.toBytes(value instanceof Long ? (Long) value
+					: new Long(value.toString()));
+		} else if (klass.equals(boolean.class)
+				|| klass.isAssignableFrom(Boolean.class)) {
+			return Bytes.toBytes(value instanceof Boolean ? (Boolean) value
+					: new Boolean(value.toString()));
+		} else if (klass.equals(double.class)
+				|| klass.isAssignableFrom(Double.class)) {
+			return Bytes.toBytes(value instanceof Double ? (Double) value
+					: new Double(value.toString()));
+		} else if (klass.equals(float.class)
+				|| klass.isAssignableFrom(Float.class)) {
+			return Bytes.toBytes(value instanceof Float ? (Float) value
+					: new Float(value.toString()));
+		} else if (klass.equals(short.class)
+				|| klass.isAssignableFrom(Short.class)) {
+			return Bytes.toBytes(value instanceof Short ? (Short) value
+					: new Short(value.toString()));
+		} else if (klass.equals(BigDecimal.class)) {
+			return Bytes
+					.toBytes(value instanceof BigDecimal ? (BigDecimal) value
+							: new BigDecimal(value.toString()));
+		} else {
+			throw new MetaModelException(
+					"Could not find a suitable Type to assign value for give type "
+							+ klass.getName());
+		}
+	}
+
+	/**
+	 * Builds Object from Bytes Picked from Hbase.
+	 * 
+	 * @param b
+	 * @param klass
+	 * @return
+	 */
+	public static Object toObject(byte[] b, Class<?> klass) {
+
+		if (klass.isAssignableFrom(String.class)) {
+			return Bytes.toString(b);
+		} else if (klass.equals(int.class)
+				|| klass.isAssignableFrom(Integer.class)) {
+			return Bytes.toInt(b);
+		} else if (klass.equals(long.class)
+				|| klass.isAssignableFrom(Long.class)) {
+			return Bytes.toLong(b);
+		} else if (klass.equals(boolean.class)
+				|| klass.isAssignableFrom(Boolean.class)) {
+			return Bytes.toBoolean(b);
+		} else if (klass.equals(double.class)
+				|| klass.isAssignableFrom(Double.class)) {
+			return Bytes.toDouble(b);
+		} else if (klass.equals(float.class)
+				|| klass.isAssignableFrom(Float.class)) {
+			return Bytes.toFloat(b);
+		} else if (klass.equals(short.class)
+				|| klass.isAssignableFrom(Short.class)) {
+			return Bytes.toShort(b);
+		} else if (klass.equals(BigDecimal.class)) {
+			return Bytes.toBigDecimal(b);
+		} else {
+			throw new MetaModelException("Could Not find a suitable Type for "
+					+ klass.getName());
+		}
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
new file mode 100644
index 0000000..b3782d5
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseConfiguration.java
@@ -0,0 +1,107 @@
+/**
+ * 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.io.Serializable;
+import java.util.List;
+
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.util.BaseObject;
+import org.apache.metamodel.util.SimpleTableDef;
+
+/**
+ * Represents the configuration of MetaModel's HBase adaptor.
+ */
+public class HBaseConfiguration extends BaseObject implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    public static final String DEFAULT_SCHEMA_NAME = "HBase";
+    public static final String DEFAULT_ZOOKEEPER_HOSTNAME = "127.0.0.1";
+    public static final int DEFAULT_ZOOKEEPER_PORT = 2181;
+
+    private final String _schemaName;
+    private final int _zookeeperPort;
+    private final String _zookeeperHostname;
+    private final SimpleTableDef[] _tableDefinitions;
+    private final ColumnType _defaultRowKeyType;
+
+    /**
+     * Creates a {@link HBaseConfiguration} using default values.
+     */
+    public HBaseConfiguration() {
+        this(DEFAULT_ZOOKEEPER_HOSTNAME, DEFAULT_ZOOKEEPER_PORT);
+    }
+
+    public HBaseConfiguration(String zookeeperHostname, int zookeeperPort) {
+        this(DEFAULT_SCHEMA_NAME, zookeeperHostname, zookeeperPort, null, ColumnType.BINARY);
+    }
+    
+    public HBaseConfiguration(String zookeeperHostname, int zookeeperPort, ColumnType defaultRowKeyType) {
+        this(DEFAULT_SCHEMA_NAME, zookeeperHostname, zookeeperPort, null, defaultRowKeyType);
+    }
+
+    /**
+     * Creates a {@link HBaseConfiguration} using detailed configuration
+     * properties.
+     * 
+     * @param schemaName
+     * @param zookeeperHostname
+     * @param zookeeperPort
+     * @param tableDefinitions
+     * @param defaultRowKeyType
+     */
+    public HBaseConfiguration(String schemaName, String zookeeperHostname, int zookeeperPort,
+            SimpleTableDef[] tableDefinitions, ColumnType defaultRowKeyType) {
+        _schemaName = schemaName;
+        _zookeeperHostname = zookeeperHostname;
+        _zookeeperPort = zookeeperPort;
+        _tableDefinitions = tableDefinitions;
+        _defaultRowKeyType = defaultRowKeyType;
+    }
+
+    public String getSchemaName() {
+        return _schemaName;
+    }
+
+    public String getZookeeperHostname() {
+        return _zookeeperHostname;
+    }
+
+    public int getZookeeperPort() {
+        return _zookeeperPort;
+    }
+
+    public SimpleTableDef[] getTableDefinitions() {
+        return _tableDefinitions;
+    }
+    
+    public ColumnType getDefaultRowKeyType() {
+        return _defaultRowKeyType;
+    }
+
+    @Override
+    protected void decorateIdentity(List<Object> list) {
+        list.add(_schemaName);
+        list.add(_zookeeperHostname);
+        list.add(_zookeeperPort);
+        list.add(_tableDefinitions);
+        list.add(_defaultRowKeyType);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/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
new file mode 100644
index 0000000..b4da5d0
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
@@ -0,0 +1,199 @@
+/**
+ * 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.io.IOException;
+import java.util.List;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.client.HTableInterface;
+import org.apache.hadoop.hbase.client.HTablePool;
+import org.apache.hadoop.hbase.client.ResultScanner;
+import org.apache.hadoop.hbase.client.Scan;
+import org.apache.metamodel.DataContext;
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.QueryPostprocessDataContext;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.schema.Column;
+import org.apache.metamodel.schema.MutableSchema;
+import org.apache.metamodel.schema.Schema;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.util.FileHelper;
+import org.apache.metamodel.util.SimpleTableDef;
+
+/**
+ * MetaModel adaptor for Apache HBase.
+ */
+public class HBaseDataContext extends QueryPostprocessDataContext {
+
+    public static final String FIELD_ID = "_id";
+
+    private final HBaseConfiguration _configuration;
+    private final HBaseAdmin _admin;
+    private final HTablePool _tablePool;
+
+    /**
+     * Creates a {@link HBaseDataContext}.
+     * 
+     * @param configuration
+     */
+    public HBaseDataContext(HBaseConfiguration configuration) {
+        Configuration config = createConfig(configuration);
+        _configuration = configuration;
+        _admin = createHbaseAdmin(config);
+        _tablePool = new HTablePool(config, 100);
+    }
+
+    /**
+     * Creates a {@link HBaseDataContext}.
+     * 
+     * @param configuration
+     * @param admin
+     * @param hTablePool
+     */
+    public HBaseDataContext(HBaseConfiguration configuration, HBaseAdmin admin, HTablePool hTablePool) {
+        _configuration = configuration;
+        _tablePool = hTablePool;
+        _admin = admin;
+    }
+
+    private HBaseAdmin createHbaseAdmin(Configuration config) {
+        try {
+            return new HBaseAdmin(config);
+        } catch (Exception e) {
+            if (e instanceof RuntimeException) {
+                throw (RuntimeException) e;
+            }
+            throw new MetaModelException(e);
+        }
+    }
+
+    private Configuration createConfig(HBaseConfiguration configuration) {
+        Configuration config = org.apache.hadoop.hbase.HBaseConfiguration.create();
+        config.set("hbase.zookeeper.quorum", configuration.getZookeeperHostname());
+        config.set("hbase.zookeeper.property.clientPort", Integer.toString(configuration.getZookeeperPort()));
+        return config;
+    }
+
+    public HTablePool getTablePool() {
+        return _tablePool;
+    }
+
+    /**
+     * Gets the HBaseAdmin used by this {@link DataContext}
+     * 
+     * @return
+     */
+    public HBaseAdmin getHBaseAdmin() {
+        return _admin;
+    }
+
+    @Override
+    protected Schema getMainSchema() throws MetaModelException {
+        final MutableSchema schema = new MutableSchema(_configuration.getSchemaName());
+
+        try {
+            SimpleTableDef[] tableDefinitions = _configuration.getTableDefinitions();
+            if (tableDefinitions == null) {
+                final HTableDescriptor[] tables = _admin.listTables();
+                tableDefinitions = new SimpleTableDef[tables.length];
+                for (int i = 0; i < tables.length; i++) {
+                    SimpleTableDef emptyTableDef = new SimpleTableDef(tables[i].getNameAsString(), new String[0]);
+                    tableDefinitions[i] = emptyTableDef;
+                }
+            }
+
+            for (SimpleTableDef tableDef : tableDefinitions) {
+                schema.addTable(new HBaseTable(tableDef, schema, _admin, _configuration.getDefaultRowKeyType()));
+            }
+
+            return schema;
+        } catch (Exception e) {
+            throw new MetaModelException(e);
+        }
+    }
+
+    /**
+     * Gets the {@link HBaseConfiguration} that is used in this datacontext.
+     * 
+     * @return
+     */
+    public HBaseConfiguration getConfiguration() {
+        return _configuration;
+    }
+
+    @Override
+    protected String getMainSchemaName() throws MetaModelException {
+        return _configuration.getSchemaName();
+    }
+
+    @Override
+    protected Number executeCountQuery(Table table, List<FilterItem> whereItems, boolean functionApproximationAllowed) {
+        if (whereItems != null && !whereItems.isEmpty()) {
+            return null;
+        }
+
+        long result = 0;
+        final HTableInterface hTable = _tablePool.getTable(table.getName());
+        try {
+            ResultScanner scanner = hTable.getScanner(new Scan());
+            try {
+                while (scanner.next() != null) {
+                    result++;
+                }                
+            } finally {
+                scanner.close();
+            }
+            return result;
+        } catch (IOException e) {
+            throw new MetaModelException(e);
+        }
+    }
+
+    @Override
+    protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+        final Scan scan = new Scan();
+        for (Column column : columns) {
+            if (!column.isPrimaryKey()) {
+                final int colonIndex = column.getName().indexOf(':');
+                if (colonIndex != -1) {
+                    String family = column.getName().substring(0, colonIndex);
+                    scan.addFamily(family.getBytes());
+                } else {
+                    scan.addFamily(column.getName().getBytes());
+                }
+            }
+        }
+
+        scan.setMaxResultSize(maxRows);
+
+        final HTableInterface hTable = _tablePool.getTable(table.getName());
+        try {
+            final ResultScanner scanner = hTable.getScanner(scan);
+            return new HBaseDataSet(columns, scanner, hTable);
+        } catch (Exception e) {
+            FileHelper.safeClose(hTable);
+            throw new MetaModelException(e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
new file mode 100644
index 0000000..699774d
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataSet.java
@@ -0,0 +1,77 @@
+/**
+ * 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.io.IOException;
+
+import org.apache.hadoop.hbase.client.HTableInterface;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.client.ResultScanner;
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.data.AbstractDataSet;
+import org.apache.metamodel.data.Row;
+import org.apache.metamodel.schema.Column;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class HBaseDataSet extends AbstractDataSet {
+
+    private static final Logger logger = LoggerFactory.getLogger(HBaseDataSet.class);
+
+    private final ResultScanner _scanner;
+    private final HTableInterface _hTable;
+    private volatile Result _nextResult;
+
+    public HBaseDataSet(Column[] columns, ResultScanner scanner, HTableInterface hTable) {
+        super(columns);
+        _scanner = scanner;
+        _hTable = hTable;
+    }
+
+    @Override
+    public void close() {
+        super.close();
+        try {
+            _scanner.close();
+        } catch (Exception e) {
+            logger.warn("Failed to close ResultScanner", e);
+        }
+        try {
+            _hTable.close();
+        } catch (Exception e) {
+            logger.warn("Failed to close HTable", e);
+        }
+    }
+
+    @Override
+    public boolean next() {
+        try {
+            _nextResult = _scanner.next();
+        } catch (IOException e) {
+            throw new MetaModelException(e);
+        }
+        return _nextResult != null;
+    }
+
+    @Override
+    public Row getRow() {
+        return new HBaseRow(getHeader(), _nextResult);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/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
new file mode 100644
index 0000000..38a6848
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseFamilyMap.java
@@ -0,0 +1,116 @@
+/**
+ * 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.Arrays;
+import java.util.Collection;
+import java.util.Map;
+import java.util.NavigableMap;
+import java.util.Set;
+
+public class HBaseFamilyMap implements Map<Object, Object> {
+
+    private final NavigableMap<byte[], byte[]> _map;
+
+    public HBaseFamilyMap(NavigableMap<byte[], byte[]> map) {
+        _map = map;
+    }
+
+    @Override
+    public int size() {
+        return _map.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return _map.isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object key) {
+        return _map.containsKey(ByteUtils.toBytes(key));
+    }
+
+    @Override
+    public boolean containsValue(Object value) {
+        return _map.containsValue(ByteUtils.toBytes(value));
+    }
+
+    @Override
+    public Object get(Object key) {
+        return _map.get(ByteUtils.toBytes(key));
+    }
+
+    @Override
+    public Object put(Object key, Object value) {
+        throw new UnsupportedOperationException("HBase row value map is immutable");
+    }
+
+    @Override
+    public Object remove(Object key) {
+        throw new UnsupportedOperationException("HBase row value map is immutable");
+    }
+
+    @Override
+    public void putAll(Map<? extends Object, ? extends Object> m) {
+        throw new UnsupportedOperationException("HBase row value map is immutable");
+    }
+
+    @Override
+    public void clear() {
+        throw new UnsupportedOperationException("HBase row value map is immutable");
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Set<Object> keySet() {
+        Set<?> keySet = _map.keySet();
+        return (Set<Object>) keySet;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Collection<Object> values() {
+        Collection<?> values = _map.values();
+        return (Collection<Object>) values;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Set<java.util.Map.Entry<Object, Object>> entrySet() {
+        final Set<?> entrySet = _map.entrySet();
+        return (Set<java.util.Map.Entry<Object, Object>>) entrySet;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append('{');
+        for (java.util.Map.Entry<byte[], byte[]> entry : _map.entrySet()) {
+            if (sb.length() > 1) {
+                sb.append(',');
+            }
+            sb.append(Arrays.toString(entry.getKey()));
+            sb.append('=');
+            sb.append(Arrays.toString(entry.getValue()));
+        }
+        sb.append('}');
+        return sb.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/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
new file mode 100644
index 0000000..b091ae1
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseRow.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.NavigableMap;
+
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.metamodel.data.AbstractRow;
+import org.apache.metamodel.data.DataSetHeader;
+import org.apache.metamodel.data.Row;
+import org.apache.metamodel.data.Style;
+import org.apache.metamodel.schema.Column;
+
+/**
+ * Row implementation around a HBase result
+ */
+final class HBaseRow extends AbstractRow implements Row {
+
+    private static final long serialVersionUID = 1L;
+
+    private final DataSetHeader _header;
+    private final Result _result;
+
+    public HBaseRow(DataSetHeader header, Result result) {
+        _header = header;
+        _result = result;
+    }
+
+    @Override
+    protected DataSetHeader getHeader() {
+        return _header;
+    }
+
+    @Override
+    public Object getValue(int index) throws IndexOutOfBoundsException {
+        final Column column = _header.getSelectItem(index).getColumn();
+        final String name = column.getName();
+        if (HBaseDataContext.FIELD_ID.equals(name)) {
+            byte[] rowKey = _result.getRow();
+            if (column.getType().isLiteral()) {
+                return Bytes.toString(rowKey);
+            }
+            return rowKey;
+        }
+
+        final int colonIndex = name.indexOf(':');
+        if (colonIndex != -1) {
+            byte[] family = name.substring(0, colonIndex).getBytes();
+            byte[] qualifier = name.substring(colonIndex + 1).getBytes();
+            byte[] value = _result.getValue(family, qualifier);
+            if (value == null) {
+                return null;
+            }
+            if (column.getType().isLiteral()) {
+                return Bytes.toString(value);
+            }
+            return value;
+        } else {
+            final NavigableMap<byte[], byte[]> map = _result.getFamilyMap(name.getBytes());
+            if (map == null || map.isEmpty()) {
+                return map;
+            }
+            return new HBaseFamilyMap(map);
+        }
+    }
+
+    @Override
+    public Style getStyle(int index) throws IndexOutOfBoundsException {
+        return Style.NO_STYLE;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
new file mode 100644
index 0000000..b79acac
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseTable.java
@@ -0,0 +1,129 @@
+/**
+ * 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.List;
+
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.schema.Column;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.MutableColumn;
+import org.apache.metamodel.schema.MutableSchema;
+import org.apache.metamodel.schema.MutableTable;
+import org.apache.metamodel.schema.TableType;
+import org.apache.metamodel.util.SimpleTableDef;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Table implementation for HBase
+ */
+final class HBaseTable extends MutableTable {
+
+    private static final long serialVersionUID = 1L;
+    private static final Logger logger = LoggerFactory.getLogger(HBaseTable.class);
+
+    private final transient HBaseAdmin _admin;
+    private final transient ColumnType _defaultRowKeyColumnType;
+
+    public HBaseTable(SimpleTableDef tableDef, MutableSchema schema, HBaseAdmin admin,
+            ColumnType defaultRowKeyColumnType) {
+        super(tableDef.getName(), TableType.TABLE, schema);
+        _admin = admin;
+        _defaultRowKeyColumnType = defaultRowKeyColumnType;
+
+        final String[] columnNames = tableDef.getColumnNames();
+        if (columnNames == null || columnNames.length == 0) {
+            logger.info("No user-defined columns specified for table {}. Columns will be auto-detected.");
+        } else {
+
+            final ColumnType[] types = tableDef.getColumnTypes();
+            int columnNumber = 1;
+
+            for (int i = 0; i < columnNames.length; i++) {
+                String columnName = columnNames[i];
+                if (HBaseDataContext.FIELD_ID.equals(columnName)) {
+                    final ColumnType type = types[i];
+                    final MutableColumn idColumn = new MutableColumn(HBaseDataContext.FIELD_ID, type)
+                            .setPrimaryKey(true).setColumnNumber(columnNumber).setTable(this);
+                    addColumn(idColumn);
+                    columnNumber++;
+                }
+            }
+
+            if (columnNumber == 1) {
+                // insert a default definition of the id column
+                final MutableColumn idColumn = new MutableColumn(HBaseDataContext.FIELD_ID,
+                        defaultRowKeyColumnType).setPrimaryKey(true).setColumnNumber(columnNumber).setTable(this);
+                addColumn(idColumn);
+                columnNumber++;
+            }
+
+            for (int i = 0; i < columnNames.length; i++) {
+                final String columnName = columnNames[i];
+
+                if (!HBaseDataContext.FIELD_ID.equals(columnName)) {
+                    final ColumnType type = types[i];
+                    final MutableColumn column = new MutableColumn(columnName, type);
+                    column.setTable(this);
+                    column.setColumnNumber(columnNumber);
+                    columnNumber++;
+                    addColumn(column);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected List<Column> getColumnsInternal() {
+        final List<Column> columnsInternal = super.getColumnsInternal();
+        if (columnsInternal.isEmpty() && _admin != null) {
+            try {
+                HTableDescriptor tableDescriptor = _admin.getTableDescriptor(getName().getBytes());
+                int columnNumber = 1;
+
+                final MutableColumn idColumn = new MutableColumn(HBaseDataContext.FIELD_ID,
+                        _defaultRowKeyColumnType).setPrimaryKey(true).setColumnNumber(columnNumber).setTable(this);
+                addColumn(idColumn);
+                columnNumber++;
+
+                // What about timestamp?
+
+                final HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
+                for (int i = 0; i < columnFamilies.length; i++) {
+                    final HColumnDescriptor columnDescriptor = columnFamilies[i];
+                    final String columnFamilyName = columnDescriptor.getNameAsString();
+                    // HBase column families are always unstructured maps.
+                    final ColumnType type = ColumnType.MAP;
+                    final MutableColumn column = new MutableColumn(columnFamilyName, type);
+                    column.setTable(this);
+                    column.setColumnNumber(columnNumber);
+                    columnNumber++;
+                    addColumn(column);
+                }
+            } catch (Exception e) {
+                throw new MetaModelException("Could not resolve table ", e);
+            }
+        }
+        return columnsInternal;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/src/main/java/org/apache/metamodel/hbase/package-info.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/metamodel/hbase/package-info.java b/hbase/src/main/java/org/apache/metamodel/hbase/package-info.java
new file mode 100644
index 0000000..f373be0
--- /dev/null
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/package-info.java
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+/**
+ * Module package for Apache HBase
+ */
+package org.apache.metamodel.hbase;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
new file mode 100644
index 0000000..0782231
--- /dev/null
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
@@ -0,0 +1,159 @@
+/**
+ * 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.Arrays;
+
+import junit.framework.TestCase;
+
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.HBaseAdmin;
+import org.apache.hadoop.hbase.client.HTableInterface;
+import org.apache.hadoop.hbase.client.HTablePool;
+import org.apache.hadoop.hbase.client.Put;
+import org.apache.metamodel.data.DataSet;
+import org.apache.metamodel.schema.ColumnType;
+import org.apache.metamodel.schema.Table;
+import org.apache.metamodel.util.SimpleTableDef;
+
+public class HBaseDataContextTest extends TestCase {
+
+    private static final String EXAMPLE_TABLE_NAME = "table_for_junit";
+
+    private final String hostname = HBaseConfiguration.DEFAULT_ZOOKEEPER_HOSTNAME;
+    private final int port = HBaseConfiguration.DEFAULT_ZOOKEEPER_PORT;
+
+    private HBaseDataContext _dataContext;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        _dataContext = new HBaseDataContext(new HBaseConfiguration(hostname, port, ColumnType.VARCHAR));
+        createTableNatively();
+    }
+
+    public void testCreateInsertQueryAndDrop() throws Exception {
+        // test the schema exploration
+        final Table table = _dataContext.getDefaultSchema().getTableByName(EXAMPLE_TABLE_NAME);
+        assertNotNull(table);
+
+        assertEquals("[_id, bar, foo]", Arrays.toString(table.getColumnNames()));
+        assertEquals(ColumnType.MAP, table.getColumn(1).getType());
+
+        // insert two records
+        insertRecordsNatively();
+
+        // query using regular configuration
+        final DataSet dataSet1 = _dataContext.query().from(EXAMPLE_TABLE_NAME).selectAll().execute();
+        try {
+            assertTrue(dataSet1.next());
+            assertEquals(
+                    "Row[values=[junit1, {[104, 101, 121]=[121, 111],[104, 105]=[116, 104, 101, 114, 101]}, {[104, 101, 108, 108, 111]=[119, 111, 114, 108, 100]}]]",
+                    dataSet1.getRow().toString());
+            assertTrue(dataSet1.next());
+            assertEquals("Row[values=[junit2, {[98, 97, 104]=[1, 2, 3],[104, 105]=[121, 111, 117]}, {}]]", dataSet1
+                    .getRow().toString());
+            assertFalse(dataSet1.next());
+        } finally {
+            dataSet1.close();
+        }
+
+        // query using custom table definitions
+        final String[] columnNames = new String[] { "foo", "bar:hi", "bar:hey" };
+        final ColumnType[] columnTypes = new ColumnType[] { ColumnType.MAP, ColumnType.VARCHAR, ColumnType.VARCHAR };
+        final SimpleTableDef[] tableDefinitions = new SimpleTableDef[] { new SimpleTableDef(EXAMPLE_TABLE_NAME,
+                columnNames, columnTypes) };
+        _dataContext = new HBaseDataContext(new HBaseConfiguration("SCH", hostname, port, tableDefinitions,
+                ColumnType.VARCHAR));
+
+        final DataSet dataSet2 = _dataContext.query().from(EXAMPLE_TABLE_NAME).select("foo", "bar:hi", "bar:hey")
+                .execute();
+        try {
+            assertTrue(dataSet2.next());
+            assertEquals("Row[values=[{[104, 101, 108, 108, 111]=[119, 111, 114, 108, 100]}, there, yo]]", dataSet2
+                    .getRow().toString());
+            assertTrue(dataSet2.next());
+            assertEquals("Row[values=[{}, you, null]]", dataSet2.getRow().toString());
+            assertFalse(dataSet2.next());
+        } finally {
+            dataSet2.close();
+        }
+
+        // query count
+        final DataSet dataSet3 = _dataContext.query().from(EXAMPLE_TABLE_NAME).selectCount().execute();
+        try {
+            assertTrue(dataSet3.next());
+            assertEquals("Row[values=[2]]", dataSet3.getRow().toString());
+            assertFalse(dataSet3.next());
+        } finally {
+            dataSet3.close();
+        }
+
+        // query only id
+        final DataSet dataSet4 = _dataContext.query().from(EXAMPLE_TABLE_NAME)
+                .select(HBaseDataContext.FIELD_ID).execute();
+        try {
+            assertTrue(dataSet4.next());
+            assertEquals("Row[values=[junit1]]", dataSet4.getRow().toString());
+            assertTrue(dataSet4.next());
+            assertEquals("Row[values=[junit2]]", dataSet4.getRow().toString());
+            assertFalse(dataSet4.next());
+        } finally {
+            dataSet4.close();
+        }
+    }
+
+    private void insertRecordsNatively() throws Exception {
+        final HTablePool tablePool = _dataContext.getTablePool();
+        final HTableInterface hTable = tablePool.getTable(EXAMPLE_TABLE_NAME);
+        try {
+            final Put put1 = new Put("junit1".getBytes());
+            put1.add("foo".getBytes(), "hello".getBytes(), "world".getBytes());
+            put1.add("bar".getBytes(), "hi".getBytes(), "there".getBytes());
+            put1.add("bar".getBytes(), "hey".getBytes(), "yo".getBytes());
+
+            final Put put2 = new Put("junit2".getBytes());
+            put2.add("bar".getBytes(), "bah".getBytes(), new byte[] { 1, 2, 3 });
+            put2.add("bar".getBytes(), "hi".getBytes(), "you".getBytes());
+
+            hTable.batch(Arrays.asList(put1, put2));
+        } finally {
+            hTable.close();
+            tablePool.closeTablePool(EXAMPLE_TABLE_NAME);
+            tablePool.close();
+        }
+    }
+
+    private void createTableNatively() throws Exception {
+        // check if the table exists
+        if (_dataContext.getHBaseAdmin().isTableAvailable(EXAMPLE_TABLE_NAME)) {
+            // table already exists
+            return;
+        }
+
+        HBaseAdmin admin = _dataContext.getHBaseAdmin();
+        System.out.println("Creating table");
+        final HTableDescriptor tableDescriptor = new HTableDescriptor(EXAMPLE_TABLE_NAME.getBytes());
+        tableDescriptor.addFamily(new HColumnDescriptor("foo".getBytes()));
+        tableDescriptor.addFamily(new HColumnDescriptor("bar".getBytes()));
+        admin.createTable(tableDescriptor);
+        System.out.println("Created table");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/eba65a05/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 2cff794..92f4106 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,7 @@
 		<module>xml</module>
 		<module>access</module>
 		<module>jdbc</module>
+		<module>hbase</module>
 		<module>mongodb</module>
 		<module>couchdb</module>
 		<module>openoffice</module>


[5/9] git commit: Added license to POM

Posted by ka...@apache.org.
Added license to POM

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

Branch: refs/heads/master
Commit: f530e638bb93be90a896d39924a8bc78a1c2bd3b
Parents: 346524a
Author: Kasper Sørensen <i....@gmail.com>
Authored: Tue Jan 28 22:06:21 2014 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Tue Jan 28 22:06:21 2014 +0100

----------------------------------------------------------------------
 hbase/pom.xml | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/f530e638/hbase/pom.xml
----------------------------------------------------------------------
diff --git a/hbase/pom.xml b/hbase/pom.xml
index 382d116..66a9344 100644
--- a/hbase/pom.xml
+++ b/hbase/pom.xml
@@ -1,9 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+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.
+-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 	<parent>
 		<artifactId>MetaModel</artifactId>
 		<groupId>org.apache.metamodel</groupId>
-		<version>3.4.4</version>
+		<version>4.0.1-incubating-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 	<artifactId>MetaModel-hbase</artifactId>


[6/9] git commit: Added gitignore

Posted by ka...@apache.org.
Added gitignore

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

Branch: refs/heads/master
Commit: 055ce27b6aac48abf86f35a191af8388d2079fd5
Parents: f530e63
Author: Kasper Sørensen <i....@gmail.com>
Authored: Tue Jan 28 22:07:39 2014 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Tue Jan 28 22:07:39 2014 +0100

----------------------------------------------------------------------
 hbase/.gitignore | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/055ce27b/hbase/.gitignore
----------------------------------------------------------------------
diff --git a/hbase/.gitignore b/hbase/.gitignore
new file mode 100644
index 0000000..4e247ee
--- /dev/null
+++ b/hbase/.gitignore
@@ -0,0 +1,4 @@
+/.settings
+/target
+/.classpath
+/.project


[7/9] git commit: Merge remote-tracking branch 'origin/hbase-module' into hbase-module

Posted by ka...@apache.org.
Merge remote-tracking branch 'origin/hbase-module' into hbase-module

Conflicts:
	hbase/pom.xml


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

Branch: refs/heads/master
Commit: 3e23c409100fc66e26ff22859425ddcdfef3f62d
Parents: 055ce27 45982c2
Author: Kasper Sørensen <i....@gmail.com>
Authored: Tue Jan 28 22:23:12 2014 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Tue Jan 28 22:23:12 2014 +0100

----------------------------------------------------------------------
 .gitignore | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[4/9] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-metamodel.git into hbase-module

Posted by ka...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-metamodel.git into hbase-module

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

Branch: refs/heads/master
Commit: 346524ad3d53ad18e51dadde17680e41be60db47
Parents: eba65a0 ea8dbeb
Author: Kasper Sørensen <i....@gmail.com>
Authored: Tue Jan 28 21:59:10 2014 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Tue Jan 28 21:59:10 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  24 ++
 DISCLAIMER                                      |  15 +
 HEADER.txt                                      |  16 -
 LICENSE                                         | 202 +++++++++
 NOTICE                                          |   9 +
 README                                          |  34 ++
 access/.gitignore                               |   4 -
 access/pom.xml                                  |  42 --
 .../metamodel/access/AccessDataContext.java     | 170 --------
 .../apache/metamodel/access/package-info.java   |  23 --
 .../metamodel/access/AccessDataContextTest.java | 125 ------
 access/src/test/resources/developers.mdb        | Bin 192512 -> 0 bytes
 core/pom.xml                                    |  21 +-
 .../apache/metamodel/AbstractDataContext.java   |  98 +++++
 .../apache/metamodel/create/CreateTable.java    |   2 +-
 .../create/CreateTableColumnBuilder.java        |   3 +
 .../org/apache/metamodel/data/DefaultRow.java   |  56 ++-
 .../org/apache/metamodel/schema/ColumnType.java |   2 +-
 .../apache/metamodel/schema/MutableColumn.java  |   5 +
 .../apache/metamodel/schema/MutableTable.java   |   5 +
 .../org/apache/metamodel/update/Update.java     |   7 +-
 .../metamodel/util/ClasspathResource.java       |  10 +-
 .../org/apache/metamodel/util/DateUtils.java    |   3 +-
 .../org/apache/metamodel/util/FileResource.java |  10 +
 .../apache/metamodel/util/InMemoryResource.java |   5 +
 .../org/apache/metamodel/util/Resource.java     |   8 +
 .../apache/metamodel/util/ResourceUtils.java    |  67 +++
 .../org/apache/metamodel/util/UrlResource.java  |   5 +
 .../metamodel/AbstractDataContextTest.java      | 410 ++++++++++---------
 .../metamodel/create/SyntaxExamplesTest.java    |  27 +-
 .../apache/metamodel/data/DefaultRowTest.java   |  18 +
 .../metamodel/update/SyntaxExamplesTest.java    |  39 ++
 .../metamodel/util/ResourceUtilsTest.java       |  51 +++
 couchdb/pom.xml                                 |  21 +-
 csv/pom.xml                                     |  21 +-
 .../apache/metamodel/csv/CsvConfiguration.java  | 270 ++++++------
 .../metamodel/csv/CsvCreateTableBuilder.java    |  39 +-
 .../apache/metamodel/csv/CsvDataContext.java    |  62 ++-
 .../org/apache/metamodel/csv/CsvDataSet.java    |   2 +-
 .../java/org/apache/metamodel/csv/CsvTable.java |  20 +-
 .../metamodel/csv/SingleLineCsvDataSet.java     | 124 ++++++
 .../apache/metamodel/csv/SingleLineCsvRow.java  | 112 +++++
 .../metamodel/csv/CsvBigFileMemoryTest.java     | 173 ++++----
 .../metamodel/csv/CsvDataContextTest.java       |  48 +--
 .../metamodel/csv/SingleLineCsvDataSetTest.java |  49 +++
 .../InterceptionCsvIntegrationTest.java         |   2 +-
 excel/pom.xml                                   |  23 +-
 .../excel/XlsxSpreadsheetReaderDelegate.java    |  12 +-
 fixedwidth/pom.xml                              |  21 +-
 .../fixedwidth/FixedWidthDataContext.java       |   5 +-
 .../fixedwidth/FixedWidthDataContextTest.java   |  22 +-
 full/pom.xml                                    |  26 +-
 .../apache/metamodel/DataContextFactory.java    |  54 +--
 jdbc/pom.xml                                    |  21 +-
 .../jdbc/dialects/DB2QueryRewriter.java         |   5 +-
 .../org/apache/metamodel/DB2Test.java           |  18 +
 .../org/apache/metamodel/FirebirdTest.java      |  18 +
 .../org/apache/metamodel/MysqlTest.java         |  18 +
 .../org/apache/metamodel/OracleTest.java        |  18 +
 .../org/apache/metamodel/PostgresqlTest.java    |  18 +
 .../metamodel/SQLServerJtdsDriverTest.java      |  18 +
 .../metamodel/SQLServerMicrosoftDriverTest.java |  18 +
 .../dialects/DB2QueryRewriterTest.java          |  36 ++
 mongodb/pom.xml                                 |  21 +-
 openoffice/pom.xml                              |  21 +-
 pojo/pom.xml                                    |  21 +-
 pom.xml                                         | 140 ++++++-
 salesforce/pom.xml                              |  21 +-
 .../salesforce/SalesforceDataContext.java       |  47 ++-
 .../metamodel/salesforce/SalesforceDataSet.java |  23 +-
 .../metamodel/salesforce/SalesforceTable.java   |   7 +-
 .../salesforce/SalesforceDataContextTest.java   | 113 ++++-
 spring/.gitignore                               |   4 +
 spring/pom.xml                                  |  77 ++++
 .../AbstractDataContextFactoryBeanDelegate.java |  95 +++++
 .../CsvDataContextFactoryBeanDelegate.java      |  46 +++
 .../spring/DataContextFactoryBean.java          | 279 +++++++++++++
 .../spring/DataContextFactoryBeanDelegate.java  |  46 +++
 .../ExcelDataContextFactoryBeanDelegate.java    |  42 ++
 .../JdbcDataContextFactoryBeanDelegate.java     |  73 ++++
 .../apache/metamodel/spring/SpringResource.java | 142 +++++++
 ...CsvDefaultConfigurationFromResourceTest.java |  58 +++
 ...vSpecifiedConfigurationFromFilenameTest.java |  58 +++
 ...lSpecifiedConfigurationFromFilenameTest.java |  59 +++
 .../MockDataContextFactoryBeanDelegate.java     |  40 ++
 .../spring/MockDataContextTypeTest.java         |  44 ++
 spring/src/test/resources/data/example.csv      |   2 +
 spring/src/test/resources/data/example.xlsx     | Bin 0 -> 7449 bytes
 .../resources/examples/csv-using-filename.xml   |  14 +
 .../examples/csv-using-spring-resource.xml      |  11 +
 .../resources/examples/excel-using-filename.xml |  13 +
 .../examples/mock-datacontext-type.xml          |  11 +
 src/site/apt/database_compliancy.apt            |  98 -----
 src/site/apt/download.apt.vm                    |  39 --
 src/site/apt/example_compiled_queries.apt       |  35 --
 src/site/apt/example_composite_datacontext.apt  |  68 ---
 src/site/apt/example_inserting_data.apt         |  63 ---
 src/site/apt/example_interceptors.apt           |  42 --
 src/site/apt/example_pojo_datastores.apt        |  39 --
 src/site/apt/example_salesforce_setup.apt       |  39 --
 src/site/apt/example_schema_traversal.apt       |  56 ---
 src/site/apt/example_simple_queries.apt         |  83 ----
 src/site/apt/example_type_conversion.apt        |  34 --
 src/site/apt/example_xml_mapping.apt            | 158 -------
 src/site/apt/goals.apt                          |  33 --
 src/site/apt/index.apt.vm                       |  72 ----
 src/site/apt/license.apt                        | 185 ---------
 src/site/apt/project_cases.apt                  |  45 --
 src/site/apt/schema_and_table_semantics.apt     |  83 ----
 src/site/fml/faq.fml                            | 207 ----------
 src/site/fml/whats_new_1.5.fml                  | 171 --------
 src/site/fml/whats_new_1.6.fml                  |  41 --
 src/site/fml/whats_new_1.7.fml                  |  77 ----
 src/site/fml/whats_new_2.0.fml                  |  86 ----
 src/site/fml/whats_new_2.1.fml                  | 106 -----
 src/site/fml/whats_new_2.2.fml                  |  91 ----
 src/site/fml/whats_new_3.0.fml                  | 128 ------
 src/site/fml/whats_new_3.1.fml                  |  51 ---
 src/site/fml/whats_new_3.2.fml                  |  49 ---
 src/site/fml/whats_new_3.3.fml                  |  68 ---
 src/site/fml/whats_new_3.4.fml                  |  94 -----
 src/site/resources/bg.png                       | Bin 241 -> 0 bytes
 src/site/resources/border-radius.htc            |  81 ----
 src/site/resources/interceptors.png             | Bin 83033 -> 0 bytes
 src/site/resources/logo.png                     | Bin 7165 -> 0 bytes
 src/site/resources/modules.png                  | Bin 139516 -> 0 bytes
 .../salesforce_security_token_menu.png          | Bin 57210 -> 0 bytes
 src/site/resources/styles.css                   | 161 --------
 src/site/site.xml                               |  70 ----
 sugarcrm/pom.xml                                |  21 +-
 sugarcrm/src/jaxws/binding/bindings.xml         |  18 +
 .../com/sugarcrm/ws/soap/Sugarsoap_handler.xml  |  18 +
 sugarcrm/src/wsdl/soap-encoding.xsd             |  19 +-
 sugarcrm/src/wsdl/soap-wsdl.xsd                 |  18 +
 sugarcrm/src/wsdl/sugarcrm.wsdl                 |  18 +
 xml/pom.xml                                     |  21 +-
 136 files changed, 3495 insertions(+), 3629 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/346524ad/pom.xml
----------------------------------------------------------------------
diff --cc pom.xml
index 92f4106,b374f93..c284e46
--- a/pom.xml
+++ b/pom.xml
@@@ -38,9 -62,7 +62,8 @@@ under the License
  		<module>excel</module>
  		<module>csv</module>
  		<module>xml</module>
- 		<module>access</module>
  		<module>jdbc</module>
 +		<module>hbase</module>
  		<module>mongodb</module>
  		<module>couchdb</module>
  		<module>openoffice</module>


[2/9] git commit: Added idea specific files in .gitignore

Posted by ka...@apache.org.
Added idea specific files in .gitignore


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

Branch: refs/heads/master
Commit: c41bf92ff534fcbcabe8e170ca01c85b903ebb5b
Parents: eba65a0
Author: Sameer Arora <sa...@apache.org>
Authored: Fri Aug 9 14:54:39 2013 +0530
Committer: Sameer Arora <sa...@apache.org>
Committed: Fri Aug 9 14:54:39 2013 +0530

----------------------------------------------------------------------
 .gitignore | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/c41bf92f/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index c0ac0f7..b920004 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
 /.project
 /.settings
-/target
\ No newline at end of file
+/target
+/.idea
+*.iml
\ No newline at end of file


[8/9] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-metamodel.git into hbase-module

Posted by ka...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-metamodel.git into hbase-module

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

Branch: refs/heads/master
Commit: e2c3d3f721133e7ee96715290202efd1e7c07e2b
Parents: 3e23c40 b920b5d
Author: Kasper Sørensen <i....@gmail.com>
Authored: Thu Mar 20 20:36:11 2014 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Thu Mar 20 20:36:11 2014 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |   2 +
 .../org/apache/metamodel/MetaModelHelper.java   |   3 +-
 .../metamodel/QueryPostprocessDataContext.java  |   7 +-
 .../org/apache/metamodel/util/FileHelper.java   |   1 +
 .../metamodel/util/SimpleTableDefParser.java    | 112 ++++++++++
 .../org/apache/metamodel/MockDataContext.java   |  30 +--
 .../util/SimpleTableDefParserTest.java          |  84 +++++++
 .../apache/metamodel/DataContextFactory.java    |  60 ++++-
 jdbc/pom.xml                                    |   6 +
 .../metamodel/jdbc/JdbcCompiledQuery.java       | 218 ++++++++++---------
 .../jdbc/JdbcCompiledQueryLeaseFactory.java     |  19 +-
 .../apache/metamodel/jdbc/JdbcDataContext.java  |   4 +
 .../metamodel/jdbc/JdbcDataContextTest.java     |  97 ++++++++-
 pom.xml                                         |  12 +-
 .../AbstractDataContextFactoryBeanDelegate.java |  12 +-
 .../CouchDbDataContextFactoryBeanDelegate.java  |  41 ++++
 .../CsvDataContextFactoryBeanDelegate.java      |  18 +-
 .../spring/DataContextFactoryBean.java          | 108 ++++++++-
 .../spring/DataContextFactoryBeanDelegate.java  |   4 +-
 .../spring/DataContextFactoryParameters.java    |  79 +++++++
 .../ExcelDataContextFactoryBeanDelegate.java    |  10 +-
 .../JdbcDataContextFactoryBeanDelegate.java     |  18 +-
 .../MongoDbDataContextFactoryBeanDelegate.java  |  42 ++++
 .../PojoDataContextFactoryBeanDelegate.java     |  55 +++++
 .../spring/DataContextFactoryBeanTest.java      |  35 +++
 .../MockDataContextFactoryBeanDelegate.java     |   2 +-
 .../PojoDataContextFactoryBeanDelegateTest.java |  53 +++++
 27 files changed, 960 insertions(+), 172 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2c3d3f7/pom.xml
----------------------------------------------------------------------


[9/9] git commit: METAMODEL-42: Applied patch for HBase GET support

Posted by ka...@apache.org.
METAMODEL-42: Applied patch for HBase GET support

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

Branch: refs/heads/master
Commit: a51ff94a727548263984c23e445f1711ff88b5e6
Parents: e2c3d3f
Author: Tomasz Guzialek <To...@humaninference.com>
Authored: Mon Mar 24 22:15:39 2014 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Mon Mar 24 22:15:39 2014 +0100

----------------------------------------------------------------------
 .../metamodel/QueryPostprocessDataContext.java  | 87 +++++++++++++++-----
 .../QueryPostprocessDataContextTest.java        | 46 ++++++++++-
 .../metamodel/hbase/HBaseDataContext.java       | 48 ++++++++++-
 .../metamodel/hbase/HBaseDataContextTest.java   | 19 ++++-
 4 files changed, 175 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/a51ff94a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
index 66565df..1791365 100644
--- a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
+++ b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java
@@ -96,28 +96,58 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
         final List<FilterItem> havingItems = query.getHavingClause().getItems();
         final List<OrderByItem> orderByItems = query.getOrderByClause().getItems();
 
-        // check for approximate SELECT COUNT(*) queries
-        if (fromItems.size() == 1 && selectItems.size() == 1 && groupByItems.isEmpty() && havingItems.isEmpty()) {
-            final SelectItem selectItem = query.getSelectClause().getItem(0);
-            if (SelectItem.isCountAllItem(selectItem)) {
-                final boolean functionApproximationAllowed = selectItem.isFunctionApproximationAllowed();
-                final FromItem fromItem = query.getFromClause().getItem(0);
-                final Table table = fromItem.getTable();
-                if (table != null) {
-                    if (isMainSchemaTable(table)) {
-                        logger.debug("Query is a COUNT query with {} where items. Trying executeCountQuery(...)",
-                                whereItems.size());
-                        final Number count = executeCountQuery(table, whereItems, functionApproximationAllowed);
-                        if (count == null) {
-                            logger.debug("DataContext did not return any count query results. Proceeding with manual counting.");
-                        } else {
-                            List<Row> data = new ArrayList<Row>(1);
-                            final DataSetHeader header = new SimpleDataSetHeader(new SelectItem[] { selectItem });
-                            data.add(new DefaultRow(header, new Object[] { count }));
-                            return new InMemoryDataSet(header, data);
+        // check certain common query types that can often be optimized by
+        // subclasses
+        if (fromItems.size() == 1 && groupByItems.isEmpty() && havingItems.isEmpty()) {
+
+            final FromItem fromItem = query.getFromClause().getItem(0);
+            final Table table = fromItem.getTable();
+            if (table != null) {
+                // check for approximate SELECT COUNT(*) queries
+                if (selectItems.size() == 1) {
+                    final SelectItem selectItem = query.getSelectClause().getItem(0);
+                    if (SelectItem.isCountAllItem(selectItem)) {
+                        final boolean functionApproximationAllowed = selectItem.isFunctionApproximationAllowed();
+                        if (isMainSchemaTable(table)) {
+                            logger.debug("Query is a COUNT query with {} where items. Trying executeCountQuery(...)",
+                                    whereItems.size());
+                            final Number count = executeCountQuery(table, whereItems, functionApproximationAllowed);
+                            if (count == null) {
+                                logger.debug("DataContext did not return any count query results. Proceeding with manual counting.");
+                            } else {
+                                List<Row> data = new ArrayList<Row>(1);
+                                final DataSetHeader header = new SimpleDataSetHeader(new SelectItem[] { selectItem });
+                                data.add(new DefaultRow(header, new Object[] { count }));
+                                return new InMemoryDataSet(header, data);
+                            }
+                        }
+                    }
+                }
+
+                // check for lookup query by primary key
+                if (whereItems.size() == 1) {
+                    final FilterItem whereItem = whereItems.get(0);
+                    final SelectItem selectItem = whereItem.getSelectItem();
+                    if (!whereItem.isCompoundFilter() && selectItem != null && selectItem.getColumn() != null) {
+                        final Column column = selectItem.getColumn();
+                        if (column.isPrimaryKey() && whereItem.getOperator() == OperatorType.EQUALS_TO) {
+                            logger.debug("Query is a primary key lookup query. Trying executePrimaryKeyLookupQuery(...)");
+                            if (table != null) {
+                                if (isMainSchemaTable(table)) {
+                                    final Object operand = whereItem.getOperand();
+                                    final Row row = executePrimaryKeyLookupQuery(table, selectItems, operand);
+                                    if (row == null) {
+                                        logger.debug("DataContext did not return any GET query results. Proceeding with manual lookup.");
+                                    } else {
+                                        final DataSetHeader header = new SimpleDataSetHeader(selectItems);
+                                        return new InMemoryDataSet(header, row);
+                                    }
+                                }
+                            }
                         }
                     }
                 }
+
             }
         }
 
@@ -206,6 +236,25 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im
         return null;
     }
 
+    /**
+     * Executes a query which obtains a row by primary key (as defined by
+     * {@link Column#isPrimaryKey()}). This method is provided to allow
+     * subclasses to optimize lookup queries since they are quite common and
+     * often a datastore can retrieve the row using some specialized means which
+     * is much more performant than scanning all records manually.
+     * 
+     * @param table
+     *            the table on which the lookup is requested.
+     * @param selectItems
+     *            the items to select from the lookup query.
+     * @param keyValue
+     *            the primary key value that is specified in the lookup query.
+     * @return the row if the particular table, or null if not available.
+     */
+    protected Row executePrimaryKeyLookupQuery(Table table, List<SelectItem> selectItems, Object keyValue) {
+        return null;
+    }
+
     protected DataSet materializeFromItem(final FromItem fromItem, final List<SelectItem> selectItems) {
         DataSet dataSet;
         JoinType joinType = fromItem.getJoin();

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/a51ff94a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
index 3933855..163af0c 100644
--- a/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
+++ b/core/src/test/java/org/apache/metamodel/QueryPostprocessDataContextTest.java
@@ -27,7 +27,9 @@ import javax.swing.table.TableModel;
 
 import org.apache.metamodel.data.DataSet;
 import org.apache.metamodel.data.DataSetTableModel;
+import org.apache.metamodel.data.DefaultRow;
 import org.apache.metamodel.data.Row;
+import org.apache.metamodel.data.SimpleDataSetHeader;
 import org.apache.metamodel.query.CompiledQuery;
 import org.apache.metamodel.query.FilterItem;
 import org.apache.metamodel.query.FromItem;
@@ -570,7 +572,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         }
         assertFalse(data.next());
     }
-    
+
     public void testJoinAndFirstRow() throws Exception {
         DataSet data;
 
@@ -582,7 +584,7 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         q.select(table2.getColumns());
         data = dc.executeQuery(q);
         assertEquals(48, data.toObjectArrays().size());
-        
+
         q.setFirstRow(3);
         data = dc.executeQuery(q);
         assertEquals(46, data.toObjectArrays().size());
@@ -858,4 +860,44 @@ public class QueryPostprocessDataContextTest extends MetaModelTestCase {
         assertEquals("Row[values=[1337]]", ds.getRow().toString());
         assertFalse(ds.next());
     }
+
+    public void testExecutePrimaryKeyLookupQuery() throws Exception {
+        QueryPostprocessDataContext dc = new QueryPostprocessDataContext() {
+            @Override
+            protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
+                throw new UnsupportedAddressTypeException();
+            }
+
+            @Override
+            protected Number executeCountQuery(Table table, List<FilterItem> whereItems,
+                    boolean functionApproximationAllowed) {
+                return null;
+            }
+
+            @Override
+            protected String getMainSchemaName() throws MetaModelException {
+                return "sch";
+            }
+
+            @Override
+            protected Row executePrimaryKeyLookupQuery(Table table, List<SelectItem> selectItems, Object keyValue) {
+                assertEquals("foo", keyValue);
+                return new DefaultRow(new SimpleDataSetHeader(selectItems), new Object[] { "hello world" });
+            }
+
+            @Override
+            protected Schema getMainSchema() throws MetaModelException {
+                MutableSchema schema = new MutableSchema(getMainSchemaName());
+                MutableTable table = new MutableTable("tabl").setSchema(schema);
+                table.addColumn(new MutableColumn("col1").setTable(table).setPrimaryKey(true));
+                table.addColumn(new MutableColumn("col2").setTable(table));
+                return schema.addTable(table);
+            }
+        };
+
+        DataSet result = dc.query().from("tabl").select("col2").where("col1").eq("foo").execute();
+        assertTrue(result.next());
+        assertEquals("Row[values=[hello world]]", result.getRow().toString());
+        assertFalse(result.next());
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/a51ff94a/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 b4da5d0..78d3e33 100644
--- a/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
+++ b/hbase/src/main/java/org/apache/metamodel/hbase/HBaseDataContext.java
@@ -19,32 +19,44 @@
 package org.apache.metamodel.hbase;
 
 import java.io.IOException;
+import java.lang.reflect.Method;
 import java.util.List;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.client.HTableInterface;
 import org.apache.hadoop.hbase.client.HTablePool;
+import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
+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.data.DataSet;
+import org.apache.metamodel.data.DataSetHeader;
+import org.apache.metamodel.data.Row;
+import org.apache.metamodel.data.SimpleDataSetHeader;
 import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.SelectItem;
 import org.apache.metamodel.schema.Column;
 import org.apache.metamodel.schema.MutableSchema;
 import org.apache.metamodel.schema.Schema;
 import org.apache.metamodel.schema.Table;
 import org.apache.metamodel.util.FileHelper;
 import org.apache.metamodel.util.SimpleTableDef;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * MetaModel adaptor for Apache HBase.
  */
 public class HBaseDataContext extends QueryPostprocessDataContext {
 
+    private static final Logger logger = LoggerFactory.getLogger(HBaseDataContext.class);
+
     public static final String FIELD_ID = "_id";
 
     private final HBaseConfiguration _configuration;
@@ -159,7 +171,7 @@ public class HBaseDataContext extends QueryPostprocessDataContext {
             try {
                 while (scanner.next() != null) {
                     result++;
-                }                
+                }
             } finally {
                 scanner.close();
             }
@@ -170,6 +182,22 @@ public class HBaseDataContext extends QueryPostprocessDataContext {
     }
 
     @Override
+    protected Row executePrimaryKeyLookupQuery(Table table, List<SelectItem> selectItems, Object keyValue) {
+        HTableInterface hTable = _tablePool.getTable(table.getName());
+        Get get = new Get(ByteUtils.toBytes(keyValue));
+        try {
+            Result result = hTable.get(get);
+            DataSetHeader header = new SimpleDataSetHeader(selectItems);
+            Row row = new HBaseRow(header, result);
+            return row;
+        } catch (IOException e) {
+            throw new IllegalStateException("Failed to execute HBase get operation with key: " + keyValue, e);
+        } finally {
+            FileHelper.safeClose(hTable);
+        }
+    }
+
+    @Override
     protected DataSet materializeMainSchemaTable(Table table, Column[] columns, int maxRows) {
         final Scan scan = new Scan();
         for (Column column : columns) {
@@ -184,7 +212,9 @@ public class HBaseDataContext extends QueryPostprocessDataContext {
             }
         }
 
-        scan.setMaxResultSize(maxRows);
+        if (maxRows > 0) {
+            setMaxRows(scan, maxRows);
+        }
 
         final HTableInterface hTable = _tablePool.getTable(table.getName());
         try {
@@ -196,4 +226,18 @@ public class HBaseDataContext extends QueryPostprocessDataContext {
         }
     }
 
+    private void setMaxRows(Scan scan, int maxRows) {
+        try {
+            // in old versions of the HBase API, the 'setMaxResultSize' method
+            // is not available
+            Method method = scan.getClass().getMethod("setMaxResultSize", long.class);
+            method.invoke(scan, (long) maxRows);
+            logger.debug("Succesfully set maxRows using Scan.setMaxResultSize({})", maxRows);
+        } catch (Exception e) {
+            logger.debug(
+                    "HBase API does not have Scan.setMaxResultSize(long) method, setting maxRows using PageFilter.", e);
+            scan.setFilter(new PageFilter(maxRows));
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/a51ff94a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
index 0782231..055149e 100644
--- a/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
+++ b/hbase/src/test/java/org/apache/metamodel/hbase/HBaseDataContextTest.java
@@ -107,8 +107,9 @@ public class HBaseDataContextTest extends TestCase {
         }
 
         // query only id
-        final DataSet dataSet4 = _dataContext.query().from(EXAMPLE_TABLE_NAME)
-                .select(HBaseDataContext.FIELD_ID).execute();
+        final DataSet dataSet4 = _dataContext.query().from(EXAMPLE_TABLE_NAME).select(HBaseDataContext.FIELD_ID)
+                .execute();
+
         try {
             assertTrue(dataSet4.next());
             assertEquals("Row[values=[junit1]]", dataSet4.getRow().toString());
@@ -118,6 +119,20 @@ public class HBaseDataContextTest extends TestCase {
         } finally {
             dataSet4.close();
         }
+
+        // primary key lookup query - using GET
+        final DataSet dataSet5 = _dataContext.query().from(EXAMPLE_TABLE_NAME).select(HBaseDataContext.FIELD_ID)
+                .where(HBaseDataContext.FIELD_ID).eq("junit1").execute();
+
+        try {
+            assertTrue(dataSet5.next());
+            assertEquals("Row[values=[junit1]]", dataSet5.getRow().toString());
+            assertFalse(dataSet5.next());
+        } finally {
+            dataSet5.close();
+        }
+
+        // TODO: Check if really GET was used instead of SCAN
     }
 
     private void insertRecordsNatively() throws Exception {


[3/9] git commit: fixed parent version in hbase module

Posted by ka...@apache.org.
fixed parent version in hbase module


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

Branch: refs/heads/master
Commit: 45982c2f10d96e97904721ca1b4426e4e7f09860
Parents: c41bf92
Author: Sameer Arora <sa...@apache.org>
Authored: Fri Aug 9 14:59:25 2013 +0530
Committer: Sameer Arora <sa...@apache.org>
Committed: Fri Aug 9 14:59:25 2013 +0530

----------------------------------------------------------------------
 hbase/pom.xml | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/45982c2f/hbase/pom.xml
----------------------------------------------------------------------
diff --git a/hbase/pom.xml b/hbase/pom.xml
index 382d116..cf26f27 100644
--- a/hbase/pom.xml
+++ b/hbase/pom.xml
@@ -1,10 +1,10 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-	<parent>
-		<artifactId>MetaModel</artifactId>
-		<groupId>org.apache.metamodel</groupId>
-		<version>3.4.4</version>
-	</parent>
+    <parent>
+        <artifactId>MetaModel</artifactId>
+        <groupId>org.apache.metamodel</groupId>
+        <version>4.0-SNAPSHOT</version>
+    </parent>
 	<modelVersion>4.0.0</modelVersion>
 	<artifactId>MetaModel-hbase</artifactId>
 	<name>MetaModel module for Apache HBase</name>