You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ar...@apache.org on 2018/05/30 08:15:31 UTC

[4/7] metamodel git commit: Refactoring -- chain or responsibility pattern was replaced by if-then block. JUnit for new functionality.

Refactoring -- chain or responsibility pattern was replaced by if-then block.
JUnit for new functionality.


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

Branch: refs/heads/master
Commit: e0a821c3c55c61245097aa22e4fdb6cdc8d1e7b0
Parents: 59ec9cc
Author: jakub <j....@quadient.com>
Authored: Wed May 23 16:28:43 2018 +0200
Committer: jakub <j....@quadient.com>
Committed: Wed May 23 16:28:43 2018 +0200

----------------------------------------------------------------------
 .../metamodel/neo4j/Neo4jDataContext.java       | 77 +++++++++---------
 .../neo4j/utils/AbstractColumnTypeHandler.java  | 33 --------
 .../neo4j/utils/ArrayColumnTypeHandler.java     | 39 ----------
 .../neo4j/utils/BooleanColumnTypeHandler.java   | 39 ----------
 .../neo4j/utils/ColumnTypeHandler.java          | 38 ---------
 .../neo4j/utils/ColumnTypeResolver.java         | 43 ++++++----
 .../neo4j/utils/DoubleColumnTypeHandler.java    | 39 ----------
 .../neo4j/utils/IntegerColumnTypeHandler.java   | 39 ----------
 .../neo4j/utils/LongColumnTypeHandler.java      | 39 ----------
 .../neo4j/utils/MapColumnTypeHandler.java       | 39 ----------
 .../neo4j/utils/StringColumnTypeHandler.java    | 39 ----------
 .../neo4j/utils/ColumnTypeResolverTest.java     | 82 ++++++++++++++++++++
 12 files changed, 150 insertions(+), 396 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
index b23f1c9..524d29c 100644
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
+++ b/neo4j/src/main/java/org/apache/metamodel/neo4j/Neo4jDataContext.java
@@ -167,55 +167,59 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
             labelsJsonArray = new JSONArray(labelsJsonString);
             
             for (int i = 0; i < labelsJsonArray.length(); i++) {
-                fillTableDefsFromLabel(labelsJsonArray.getString(i), tableDefs);
+                final SimpleTableDef tableDefFromLabel = createTableDefFromLabel(labelsJsonArray.getString(i));
+                
+                if (tableDefFromLabel != null) {
+                    tableDefs.add(tableDefFromLabel);
+                }
             }
             
             return tableDefs.toArray(new SimpleTableDef[tableDefs.size()]);
         } catch (final JSONException e) {
-            logger.error("Error occured in parsing JSON while detecting the schema: ", e);
+            logger.error("Error occurred in parsing JSON while detecting the schema: ", e);
             throw new IllegalStateException(e);
         }
     }
     
-    private void fillTableDefsFromLabel(final String label, final List<SimpleTableDef> tableDefs) throws JSONException {
+    private SimpleTableDef createTableDefFromLabel(final String label) throws JSONException {
         final List<JSONObject> nodesPerLabel = getAllNodesPerLabel(label);
         final List<String> propertiesPerLabel = getPropertiesFromLabelNodes(nodesPerLabel);
         final Set<String> relationshipPropertiesPerLabel = new LinkedHashSet<>();
 
         for (final JSONObject node : nodesPerLabel) {
             final Integer nodeId = (Integer) node.getJSONObject("metadata").get("id");
-            fillRelationshipPropertiesPerLabel(nodeId, relationshipPropertiesPerLabel); 
+            final Set<String> relationshipPropertiesForNode = createRelationshipPropertiesForNode(nodeId);
+            relationshipPropertiesPerLabel.addAll(relationshipPropertiesForNode);
         }
         
         propertiesPerLabel.addAll(relationshipPropertiesPerLabel);
 
-        // Do not add a table if label has no nodes (empty tables are considered non-existent)
-        if (!nodesPerLabel.isEmpty()) {
+        if (nodesPerLabel.isEmpty()) { 
+            return null; // Do not add a table if label has no nodes (empty tables are considered non-existent)
+        } else {
             final String[] columnNames = propertiesPerLabel.toArray(new String[propertiesPerLabel.size()]);
             final ColumnTypeResolver columnTypeResolver = new ColumnTypeResolver();
-            final SimpleTableDef tableDef = new SimpleTableDef(label, columnNames,
+            return new SimpleTableDef(label, columnNames,
                     columnTypeResolver.getColumnTypes(nodesPerLabel.get(0), columnNames));
-            tableDefs.add(tableDef);
         } 
     }
 
-    private void fillRelationshipPropertiesPerLabel(final Integer nodeId, final Set<String> relationshipPropertiesPerLabel)
-            throws JSONException {
+    private Set<String> createRelationshipPropertiesForNode(final Integer nodeId) throws JSONException {
         final List<JSONObject> relationshipsPerNode = getOutgoingRelationshipsPerNode(nodeId);
+        final Set<String> relationshipProperties = new LinkedHashSet<>();
 
         for (final JSONObject relationship : relationshipsPerNode) {
             // Add the relationship as a column in the table
             final String relationshipName = relationship.getString("type");
             final String relationshipNameProperty = RELATIONSHIP_PREFIX + relationshipName;
+            relationshipProperties.add(relationshipNameProperty);
             
-            if (!relationshipPropertiesPerLabel.contains(relationshipNameProperty)) {
-                relationshipPropertiesPerLabel.add(relationshipNameProperty);
-            }
-
             // Add all the relationship properties as table columns
             final List<String> propertiesPerRelationship = getAllPropertiesPerRelationship(relationship);
-            relationshipPropertiesPerLabel.addAll(propertiesPerRelationship);
+            relationshipProperties.addAll(propertiesPerRelationship);
         }
+        
+        return relationshipProperties;
     }
 
     private List<String> getPropertiesFromLabelNodes(final List<JSONObject> nodesPerLabel) {
@@ -235,14 +239,17 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
     }
 
     private List<String> getAllPropertiesPerRelationship(JSONObject relationship) {
-        List<String> propertyNames = new ArrayList<String>();
+        final List<String> propertyNames = new ArrayList<>();
         try {
-            String relationshipName = RELATIONSHIP_PREFIX + relationship.getJSONObject("metadata").getString("type");
-            JSONObject relationshipPropertiesJSONObject = relationship.getJSONObject("data");
+            final String relationshipName =
+                    RELATIONSHIP_PREFIX + relationship.getJSONObject("metadata").getString("type");
+            final JSONObject relationshipPropertiesJSONObject = relationship.getJSONObject("data");
+            
             if (relationshipPropertiesJSONObject.length() > 0) {
-                JSONArray relationshipPropertiesNamesJSONArray = relationshipPropertiesJSONObject.names();
+                final JSONArray relationshipPropertiesNamesJSONArray = relationshipPropertiesJSONObject.names();
+                
                 for (int i = 0; i < relationshipPropertiesNamesJSONArray.length(); i++) {
-                    String propertyName = relationshipName + RELATIONSHIP_COLUMN_SEPARATOR
+                    final String propertyName = relationshipName + RELATIONSHIP_COLUMN_SEPARATOR
                             + relationshipPropertiesNamesJSONArray.getString(i);
                     if (!propertyNames.contains(propertyName)) {
                         propertyNames.add(propertyName);
@@ -250,30 +257,30 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
                 }
             }
             return propertyNames;
-        } catch (JSONException e) {
-            logger.error("Error occured in parsing JSON while getting relationship properties: ", e);
+        } catch (final JSONException e) {
+            logger.error("Error occurred in parsing JSON while getting relationship properties: ", e);
             throw new IllegalStateException(e);
         }
     }
 
     private List<JSONObject> getOutgoingRelationshipsPerNode(final Integer nodeId) {
-        List<JSONObject> outgoingRelationshipsPerNode = new ArrayList<>();
-
-        String outgoingRelationshipsPerNodeJsonString = _requestWrapper.executeRestRequest(new HttpGet(_serviceRoot
-                + "/node/" + nodeId + "/relationships/out"));
-
-        JSONArray outgoingRelationshipsPerNodeJsonArray;
+        final List<JSONObject> outgoingRelationshipsPerNode = new ArrayList<>();
+        final String outgoingRelationshipsPerNodeJsonString = _requestWrapper.executeRestRequest(
+                new HttpGet(_serviceRoot + "/node/" + nodeId + "/relationships/out"));
+        final JSONArray outgoingRelationshipsPerNodeJsonArray;
+        
         try {
             outgoingRelationshipsPerNodeJsonArray = new JSONArray(outgoingRelationshipsPerNodeJsonString);
             for (int i = 0; i < outgoingRelationshipsPerNodeJsonArray.length(); i++) {
-                JSONObject relationship = outgoingRelationshipsPerNodeJsonArray.getJSONObject(i);
+                final JSONObject relationship = outgoingRelationshipsPerNodeJsonArray.getJSONObject(i);
                 if (!outgoingRelationshipsPerNode.contains(relationship)) {
                     outgoingRelationshipsPerNode.add(relationship);
                 }
             }
             return outgoingRelationshipsPerNode;
-        } catch (JSONException e) {
-            logger.error("Error occured in parsing JSON while detecting outgoing relationships for node: " + nodeId, e);
+        } catch (final JSONException e) {
+            logger.error("Error occurred in parsing JSON while detecting outgoing relationships for node: " + nodeId,
+                    e);
             throw new IllegalStateException(e);
         }
     }
@@ -293,7 +300,7 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
             }
             return allNodesPerLabel;
         } catch (JSONException e) {
-            logger.error("Error occured in parsing JSON while detecting the nodes for a label: " + label, e);
+            logger.error("Error occurred in parsing JSON while detecting the nodes for a label: " + label, e);
             throw new IllegalStateException(e);
         }
     }
@@ -318,7 +325,7 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
             }
             return properties;
         } catch (JSONException e) {
-            logger.error("Error occured in parsing JSON while detecting the properties of a node: " + node, e);
+            logger.error("Error occurred in parsing JSON while detecting the properties of a node: " + node, e);
             throw new IllegalStateException(e);
         }
     }
@@ -334,7 +341,7 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
                 final List<SelectItem> selectItems = columns.stream().map(SelectItem::new).collect(Collectors.toList());
                 dataSet = new Neo4jDataSet(selectItems, resultJSONObject);
             } catch (JSONException e) {
-                logger.error("Error occured in parsing JSON while materializing the schema: ", e);
+                logger.error("Error occurred in parsing JSON while materializing the schema: ", e);
                 throw new IllegalStateException(e);
             }
 
@@ -366,7 +373,7 @@ public class Neo4jDataContext extends QueryPostprocessDataContext implements Dat
             Number value = (Number) valueJSONArray.get(0);
             return value;
         } catch (JSONException e) {
-            logger.error("Error occured in parsing JSON response: ", e);
+            logger.error("Error occurred in parsing JSON response: ", e);
             // Do not throw an exception here. Returning null here will make
             // MetaModel attempt to count records manually and therefore recover
             // from the error.

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/AbstractColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/AbstractColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/AbstractColumnTypeHandler.java
deleted file mode 100644
index 1198fe0..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/AbstractColumnTypeHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONObject;
-
-public abstract class AbstractColumnTypeHandler implements ColumnTypeHandler {
-    protected ColumnTypeHandler _successor;
-
-    @Override
-    public void setSuccessor(final ColumnTypeHandler successor) {
-        _successor = successor;
-    }
-
-    public abstract ColumnType getTypeFromValue(final JSONObject data, final String key);
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ArrayColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ArrayColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ArrayColumnTypeHandler.java
deleted file mode 100644
index 3d491f4..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ArrayColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class ArrayColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getJSONArray(key);
-            return ColumnType.ARRAY;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/BooleanColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/BooleanColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/BooleanColumnTypeHandler.java
deleted file mode 100644
index 5aa4194..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/BooleanColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class BooleanColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getBoolean(key);
-            return ColumnType.BOOLEAN;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeHandler.java
deleted file mode 100644
index f673f4d..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeHandler.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONObject;
-
-public interface ColumnTypeHandler {
-    /**
-     * Sets the following node in the chain. 
-     * @param successor
-     */
-    void setSuccessor(final ColumnTypeHandler successor);
-
-    /**
-     * Returns a column type based on the given value.  
-     * @param data
-     * @param key
-     * @return ColumnType
-     */
-    ColumnType getTypeFromValue(final JSONObject data, final String key);
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolver.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolver.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolver.java
index 75677a2..f5a817b 100644
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolver.java
+++ b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolver.java
@@ -24,10 +24,15 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.metamodel.schema.ColumnType;
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ColumnTypeResolver {
+    private static final Logger logger = LoggerFactory.getLogger(ColumnTypeResolver.class);
+    
     public ColumnType[] getColumnTypes(final JSONObject jsonObject, final String[] columnNamesArray) {
         final List<String> columnNames = new ArrayList<>(Arrays.asList(columnNamesArray)); 
         final List<ColumnType> columnTypes = new ArrayList<>();
@@ -49,7 +54,7 @@ public class ColumnTypeResolver {
 
         if (jsonObject.has(dataKey)) {
             final JSONObject data = jsonObject.getJSONObject(dataKey);
-            final Iterator keysIterator = data.keys();
+            final Iterator<?> keysIterator = data.keys();
 
             while (keysIterator.hasNext()) {
                 final String key = (String) keysIterator.next();
@@ -96,22 +101,26 @@ public class ColumnTypeResolver {
     }
 
     private ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        final BooleanColumnTypeHandler booleanHandler = new BooleanColumnTypeHandler();
-        final IntegerColumnTypeHandler integerHandler = new IntegerColumnTypeHandler();
-        final LongColumnTypeHandler longHandler = new LongColumnTypeHandler();
-        final DoubleColumnTypeHandler doubleHandler = new DoubleColumnTypeHandler();
-        final ArrayColumnTypeHandler arrayHandler = new ArrayColumnTypeHandler();
-        final MapColumnTypeHandler mapHandler = new MapColumnTypeHandler();
-        final StringColumnTypeHandler stringHandler = new StringColumnTypeHandler();
-
-        // chain of responsibility
-        booleanHandler.setSuccessor(integerHandler);
-        integerHandler.setSuccessor(longHandler);
-        longHandler.setSuccessor(doubleHandler);
-        doubleHandler.setSuccessor(arrayHandler);
-        arrayHandler.setSuccessor(mapHandler);
-        mapHandler.setSuccessor(stringHandler);
+        try {
+            final Class<? extends Object> keyClass = data.get(key).getClass();
+            
+            if (keyClass.equals(Boolean.class)) {
+                return ColumnType.BOOLEAN;
+            } else if (keyClass.equals(Integer.class)) {
+                return ColumnType.INTEGER;
+            } else if (keyClass.equals(Long.class)) {
+                return ColumnType.BIGINT;
+            } else if (keyClass.equals(Double.class)) {
+                return ColumnType.DOUBLE;
+            } else if (keyClass.equals(JSONArray.class)) {
+                return ColumnType.ARRAY;
+            } else if (keyClass.equals(JSONObject.class)) {
+                return ColumnType.MAP;
+            }
+        } catch (final JSONException e) {
+            logger.error("JSON object does not contain required key '{}'. {}", key, e.getMessage());
+        }
 
-        return booleanHandler.getTypeFromValue(data, key);
+        return ColumnType.STRING;
     }
 }

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/DoubleColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/DoubleColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/DoubleColumnTypeHandler.java
deleted file mode 100644
index 35e9ef8..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/DoubleColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class DoubleColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getDouble(key);
-            return ColumnType.DOUBLE;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/IntegerColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/IntegerColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/IntegerColumnTypeHandler.java
deleted file mode 100644
index 9a48742..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/IntegerColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class IntegerColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getInt(key);
-            return ColumnType.INTEGER;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/LongColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/LongColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/LongColumnTypeHandler.java
deleted file mode 100644
index 939e355..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/LongColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class LongColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getLong(key);
-            return ColumnType.BIGINT;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/MapColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/MapColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/MapColumnTypeHandler.java
deleted file mode 100644
index 8151490..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/MapColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class MapColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getJSONObject(key);
-            return ColumnType.MAP;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/StringColumnTypeHandler.java
----------------------------------------------------------------------
diff --git a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/StringColumnTypeHandler.java b/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/StringColumnTypeHandler.java
deleted file mode 100644
index 06afe36..0000000
--- a/neo4j/src/main/java/org/apache/metamodel/neo4j/utils/StringColumnTypeHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * 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.neo4j.utils;
-
-import org.apache.metamodel.schema.ColumnType;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-public class StringColumnTypeHandler extends AbstractColumnTypeHandler {
-    @Override
-    public ColumnType getTypeFromValue(final JSONObject data, final String key) {
-        try {
-            data.getString(key);
-            return ColumnType.STRING;
-        } catch (final JSONException e) {
-            if (_successor !=  null) {
-                return _successor.getTypeFromValue(data, key);
-            } else {
-                return ColumnType.STRING;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/metamodel/blob/e0a821c3/neo4j/src/test/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolverTest.java
----------------------------------------------------------------------
diff --git a/neo4j/src/test/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolverTest.java b/neo4j/src/test/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolverTest.java
new file mode 100644
index 0000000..8e56b66
--- /dev/null
+++ b/neo4j/src/test/java/org/apache/metamodel/neo4j/utils/ColumnTypeResolverTest.java
@@ -0,0 +1,82 @@
+/**
+ * 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.neo4j.utils;
+
+import static junit.framework.TestCase.assertEquals;
+
+import org.apache.metamodel.schema.ColumnType;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Test;
+
+public class ColumnTypeResolverTest {
+    private static final String COLUMN_ID = "id";
+    private static final String COLUMN_ID_NEO4J = "_id";
+    private static final String COLUMN_METADATA  = "metadata";
+    private static final String COLUMN_DATA  = "data";
+    private static final String COLUMN_BOOLEAN = "boolean";
+    private static final String COLUMN_INTEGER = "integer";
+    private static final String COLUMN_LONG = "long";
+    private static final String COLUMN_DOUBLE = "double";
+    private static final String COLUMN_ARRAY = "array";
+    private static final String COLUMN_MAP = "map";
+    private static final String COLUMN_STRING = "string";
+    
+    @Test
+    public void testGetColumnTypes() throws Exception {
+        final ColumnTypeResolver resolver = new ColumnTypeResolver();
+        final JSONObject jsonObject = createJSONObject();
+        final String[] columnNames =
+                new String[] { COLUMN_ID_NEO4J, COLUMN_BOOLEAN, COLUMN_INTEGER, COLUMN_LONG, COLUMN_DOUBLE,
+                        COLUMN_ARRAY, COLUMN_MAP, COLUMN_STRING };
+        final ColumnType[] columnTypes = resolver.getColumnTypes(jsonObject, columnNames);
+        assertEquals(columnTypes.length, columnNames.length); 
+        assertEquals(columnTypes[0], ColumnType.BIGINT); // ID
+        assertEquals(columnTypes[1], ColumnType.BOOLEAN);
+        assertEquals(columnTypes[2], ColumnType.STRING);
+        assertEquals(columnTypes[3], ColumnType.ARRAY);
+        assertEquals(columnTypes[4], ColumnType.DOUBLE);
+        assertEquals(columnTypes[5], ColumnType.INTEGER);
+        assertEquals(columnTypes[6], ColumnType.MAP);
+        assertEquals(columnTypes[7], ColumnType.BIGINT);
+    }
+    
+    private JSONObject createJSONObject() throws JSONException {
+        final JSONObject json = new JSONObject();
+        final JSONObject metadata = new JSONObject();
+        metadata.put(COLUMN_ID, 42L);
+        json.put(COLUMN_METADATA, metadata);
+        final JSONObject data = new JSONObject();
+        data.put(COLUMN_BOOLEAN, true);
+        data.put(COLUMN_STRING, "forty-two");
+        final JSONArray array = new JSONArray();
+        array.put(1).put(2).put(3);
+        data.put(COLUMN_ARRAY, array);
+        data.put(COLUMN_DOUBLE, 3.141592);
+        data.put(COLUMN_INTEGER, 42);
+        final JSONObject map = new JSONObject();
+        map.put("1", "one").put("2", "two").put("3", "three");
+        data.put(COLUMN_MAP, map);
+        data.put(COLUMN_LONG, 12345678910L);
+        json.put(COLUMN_DATA, data);
+        
+        return json;
+    }
+}