You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gora.apache.org by dj...@apache.org on 2018/10/08 09:02:44 UTC

[09/11] gora git commit: Improve Ignite Datastore to better suit Gora's coding standards

Improve Ignite Datastore to better suit Gora's coding standards

Formatting and documentation were improved in multiple classes. Also
dependencies' versions were parameterized within parent pom.xml files
and other minor improvements were implemented throughout the project.

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

Branch: refs/heads/master
Commit: 740ab8145ac6c004d2b10ea46ea0f5c2a0a9f71f
Parents: 87eddc2
Author: Carlos M <ca...@gmail.com>
Authored: Thu Jul 26 23:57:32 2018 -0500
Committer: Carlos M <ca...@gmail.com>
Committed: Thu Jul 26 23:57:32 2018 -0500

----------------------------------------------------------------------
 .gitignore                                      |   1 +
 gora-ignite/pom.xml                             |   4 +-
 gora-ignite/src/examples/java/.gitignore        |  15 --
 .../org/apache/gora/ignite/package-info.java    |   4 +-
 .../apache/gora/ignite/query/IgniteQuery.java   |   2 +-
 .../apache/gora/ignite/query/IgniteResult.java  |  10 +-
 .../apache/gora/ignite/query/package-info.java  |   2 +-
 .../org/apache/gora/ignite/store/Column.java    |   2 +-
 .../apache/gora/ignite/store/IgniteMapping.java |   2 +-
 .../gora/ignite/store/IgniteMappingBuilder.java |   5 +-
 .../gora/ignite/store/IgniteParameters.java     |  23 +--
 .../apache/gora/ignite/store/IgniteStore.java   |  59 +++---
 .../apache/gora/ignite/store/package-info.java  |   2 +-
 .../ignite/utils/IgniteBackendConstants.java    |  36 ++++
 .../gora/ignite/utils/IgniteSQLBuilder.java     | 193 +++++++++++++++----
 .../apache/gora/ignite/utils/package-info.java  |   2 +-
 .../config/java.util.logging.properties         |  74 +++++++
 pom.xml                                         |   2 +
 18 files changed, 316 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 2aa54cc..d4f78bc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,4 @@ ivy/ivy*.jar
 **/gora-solr-5/src/test/conf/solr/collection1/data/
 **/_rest_managed.json
 **/gora-solr/src/test/conf/solr-managed-schema/collection1/data/
+**/nbactions.xml

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/pom.xml
----------------------------------------------------------------------
diff --git a/gora-ignite/pom.xml b/gora-ignite/pom.xml
index fa31195..430b8ed 100644
--- a/gora-ignite/pom.xml
+++ b/gora-ignite/pom.xml
@@ -50,7 +50,6 @@
   </ciManagement>
 
   <properties>
-    <ignite.version>2.4.0</ignite.version>
     <osgi.import>*</osgi.import>
     <osgi.export>org.apache.gora.ignite*;version="${project.version}";-noimport:=true</osgi.export>
   </properties>
@@ -174,9 +173,8 @@
     <dependency>
       <groupId>org.apache.ignite</groupId>
       <artifactId>ignite-indexing</artifactId>
-      <version>2.4.0</version>
+      <version>${ignite.version}</version>
     </dependency>
-
   </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/examples/java/.gitignore
----------------------------------------------------------------------
diff --git a/gora-ignite/src/examples/java/.gitignore b/gora-ignite/src/examples/java/.gitignore
deleted file mode 100644
index 09697dc..0000000
--- a/gora-ignite/src/examples/java/.gitignore
+++ /dev/null
@@ -1,15 +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.
-

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/package-info.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/package-info.java b/gora-ignite/src/main/java/org/apache/gora/ignite/package-info.java
index a7fa7ab..4036748 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/package-info.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/package-info.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -17,4 +17,4 @@
 /**
  * This package contains Ignite datastore related all classes.
  */
-package org.apache.gora.ignite;
\ No newline at end of file
+package org.apache.gora.ignite;

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteQuery.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteQuery.java b/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteQuery.java
index b33e682..7ad9c61 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteQuery.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteQuery.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteResult.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteResult.java b/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteResult.java
index 09f717e..e5c0d46 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteResult.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/query/IgniteResult.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -33,7 +33,6 @@ import org.apache.gora.store.DataStore;
 public class IgniteResult<K, T extends PersistentBase> extends ResultBase<K, T> {
 
   private ResultSet resultSet;
-  private Statement st;
   private int size;
 
   public IgniteResult(DataStore<K, T> dataStore, Query<K, T> query) {
@@ -79,13 +78,6 @@ public class IgniteResult<K, T extends PersistentBase> extends ResultBase<K, T>
         throw new IOException(ex);
       }
     }
-    if (st != null) {
-      try {
-        st.close();
-      } catch (SQLException ex) {
-        throw new IOException(ex);
-      }
-    }
   }
 
   public void setResultSet(ResultSet resultSet) throws SQLException {

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/query/package-info.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/query/package-info.java b/gora-ignite/src/main/java/org/apache/gora/ignite/query/package-info.java
index 5e463ff..fa52d9c 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/query/package-info.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/query/package-info.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/store/Column.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/store/Column.java b/gora-ignite/src/main/java/org/apache/gora/ignite/store/Column.java
index d06591e..ee7d6d6 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/store/Column.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/store/Column.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMapping.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMapping.java b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMapping.java
index c0e7a98..f0189ec 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMapping.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMapping.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMappingBuilder.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMappingBuilder.java b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMappingBuilder.java
index 3d245ea..4d397c5 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMappingBuilder.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteMappingBuilder.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -70,6 +70,7 @@ public class IgniteMappingBuilder<K, T extends PersistentBase> {
         LOG.error("Mapping file '{}' could not be found!", mappingFile);
         throw new IOException("Mapping file '" + mappingFile + "' could not be found!");
       }
+      @SuppressWarnings("unchecked")
       List<Element> classes = document.getRootElement().getChildren("class");
       for (Element classElement : classes) {
         if (classElement.getAttributeValue("keyClass").equals(
@@ -79,6 +80,7 @@ public class IgniteMappingBuilder<K, T extends PersistentBase> {
           final String tableNameFromMapping = classElement.getAttributeValue("table");
           String tableName = dataStore.getSchemaName(tableNameFromMapping, dataStore.getPersistentClass());
           igniteMapping.setTableName(tableName);
+          @SuppressWarnings("unchecked")
           List<Element> prColumns = classElement.getChildren("primarykey");
           List<Column> prFields = new ArrayList<>();
           for (Element aPrimaryKey : prColumns) {
@@ -87,6 +89,7 @@ public class IgniteMappingBuilder<K, T extends PersistentBase> {
             prFields.add(new Column(name, Column.FieldType.valueOf(type)));
           }
           igniteMapping.setPrimaryKey(prFields);
+          @SuppressWarnings("unchecked")
           List<Element> fields = classElement.getChildren("field");
           Map<String, Column> mp = new HashMap<>();
           for (Element field : fields) {

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteParameters.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteParameters.java b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteParameters.java
index 15b5bae..f667b40 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteParameters.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteParameters.java
@@ -1,11 +1,12 @@
 /*
- * Copyright 2018 The Apache Software Foundation.
+ * 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
  *
- * Licensed 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
+ *     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,
@@ -16,6 +17,7 @@
 package org.apache.gora.ignite.store;
 
 import java.util.Properties;
+import org.apache.gora.ignite.utils.IgniteBackendConstants;
 import org.apache.hadoop.conf.Configuration;
 
 /**
@@ -61,8 +63,7 @@ public class IgniteParameters {
   private String additionalConfigurations;
 
   /**
-   *
-   * @param host
+   * @param host Hostname/IP of the Ignite Server
    * @param port Optional port for Ignite Server
    * @param user Optional username for Ignite
    * @param password Optional password for Ignite
@@ -126,10 +127,10 @@ public class IgniteParameters {
     this.schema = schema;
   }
 
-  public static IgniteParameters load(Properties properties, Configuration conf) {
+  public static IgniteParameters load(Properties properties) {
     return new IgniteParameters(
-        properties.getProperty(PROP_HOST, "localhost"),
-        properties.getProperty(PROP_PORT, "10800"),
+        properties.getProperty(PROP_HOST, IgniteBackendConstants.DEFAULT_IGNITE_HOST),
+        properties.getProperty(PROP_PORT, IgniteBackendConstants.DEFAULT_IGNITE_PORT),
         properties.getProperty(PROP_SCHEMA, null),
         properties.getProperty(PROP_USER, null),
         properties.getProperty(PROP_PASSWORD, null),

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteStore.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteStore.java b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteStore.java
index d9f3527..a17b3a0 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteStore.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/store/IgniteStore.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -39,6 +39,7 @@ import org.apache.avro.specific.SpecificDatumWriter;
 import org.apache.avro.util.Utf8;
 import org.apache.gora.ignite.query.IgniteQuery;
 import org.apache.gora.ignite.query.IgniteResult;
+import org.apache.gora.ignite.utils.IgniteBackendConstants;
 import org.apache.gora.ignite.utils.IgniteSQLBuilder;
 import org.apache.gora.persistency.Persistent;
 import org.apache.gora.persistency.impl.PersistentBase;
@@ -61,33 +62,24 @@ import org.slf4j.LoggerFactory;
  */
 public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T> {
 
-  public static final Logger LOG = LoggerFactory.getLogger(IgniteStore.class);
+  private static final Logger LOG = LoggerFactory.getLogger(IgniteStore.class);
   private static final String PARSE_MAPPING_FILE_KEY = "gora.ignite.mapping.file";
   private static final String DEFAULT_MAPPING_FILE = "gora-ignite-mapping.xml";
   private IgniteParameters igniteParameters;
   private IgniteMapping igniteMapping;
   private Connection connection;
-
-  /*
-   * Create a threadlocal map for the datum readers and writers, because they
-   * are not thread safe, at least not before Avro 1.4.0 (See AVRO-650). When
-   * they are thread safe, it is possible to maintain a single reader and writer
-   * pair for every schema, instead of one for every thread.
-   */
-  public static final ConcurrentHashMap<Schema, SpecificDatumReader<?>> readerMap = new ConcurrentHashMap<>();
-
-  public static final ConcurrentHashMap<Schema, SpecificDatumWriter<?>> writerMap = new ConcurrentHashMap<>();
+  private static final ConcurrentHashMap<Schema, SpecificDatumReader<?>> readerMap = new ConcurrentHashMap<>();
+  private static final ConcurrentHashMap<Schema, SpecificDatumWriter<?>> writerMap = new ConcurrentHashMap<>();
 
   @Override
   public void initialize(Class<K> keyClass, Class<T> persistentClass, Properties properties) throws GoraException {
-
     try {
       super.initialize(keyClass, persistentClass, properties);
-      IgniteMappingBuilder builder = new IgniteMappingBuilder(this);
+      IgniteMappingBuilder<K, T> builder = new IgniteMappingBuilder<K, T>(this);
       builder.readMappingFile(getConf().get(PARSE_MAPPING_FILE_KEY, DEFAULT_MAPPING_FILE));
       igniteMapping = builder.getIgniteMapping();
-      igniteParameters = IgniteParameters.load(properties, conf);
-      connection = acquiereConnection();
+      igniteParameters = IgniteParameters.load(properties);
+      connection = acquireConnection();
       LOG.info("Ignite store was successfully initialized");
     } catch (ClassNotFoundException | SQLException ex) {
       LOG.error("Error while initializing Ignite store", ex);
@@ -95,7 +87,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
     }
   }
 
-  private Connection acquiereConnection() throws ClassNotFoundException, SQLException {
+  private Connection acquireConnection() throws ClassNotFoundException, SQLException {
     Class.forName("org.apache.ignite.IgniteJdbcThinDriver");
     StringBuilder urlBuilder = new StringBuilder();
     urlBuilder.append("jdbc:ignite:thin://");
@@ -115,8 +107,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
     if (igniteParameters.getAdditionalConfigurations() != null) {
       urlBuilder.append(igniteParameters.getAdditionalConfigurations());
     }
-    Connection conn = DriverManager.getConnection(urlBuilder.toString());
-    return conn;
+    return DriverManager.getConnection(urlBuilder.toString());
   }
 
   @Override
@@ -167,25 +158,19 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
 
   @Override
   public boolean schemaExists() throws GoraException {
-    boolean exists = false;
     try (Statement stmt = connection.createStatement()) {
       String tableExistsSQL = IgniteSQLBuilder.tableExists(igniteMapping.getTableName());
       ResultSet executeQuery = stmt.executeQuery(tableExistsSQL);
       executeQuery.close();
-      exists = true;
+      return true;
     } catch (SQLException ex) {
-      /**
-       * a 42000 error code is thrown by Ignite when a non-existent table
-       * queried. More details:
-       * https://apacheignite-sql.readme.io/docs/jdbc-error-codes
-       */
-      if (ex.getSQLState() != null && ex.getSQLState().equals("42000")) {
-        exists = false;
+      if (ex.getSQLState() != null
+          && ex.getSQLState().equals(IgniteBackendConstants.DEFAULT_IGNITE_TABLE_NOT_EXISTS_CODE)) {
+        return false;
       } else {
         throw new GoraException(ex);
       }
     }
-    return exists;
   }
 
   @Override
@@ -240,6 +225,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
     return persistent;
   }
 
+  @SuppressWarnings("unchecked")
   private Object deserializeFieldValue(Schema.Field field, Schema fieldSchema,
       Object igniteValue, T persistent) throws IOException {
     Object fieldValue = null;
@@ -298,7 +284,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
           Object v = obj.get(field.pos());
           if (get != null && v != null) {
             Schema fieldSchema = field.schema();
-            Object serializedObj = serializeFieldValue(get, fieldSchema, v);
+            Object serializedObj = serializeFieldValue(fieldSchema, v);
             data.put(get, serializedObj);
           }
         }
@@ -350,7 +336,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
     } else {
       deleteQuery = IgniteSQLBuilder.deleteQuery(igniteMapping);
     }
-    String selectQueryWhere = IgniteSQLBuilder.selectQueryWhere(igniteMapping, query.getStartKey(), query.getEndKey(), query.getLimit());
+    String selectQueryWhere = IgniteSQLBuilder.queryWhere(igniteMapping, query.getStartKey(), query.getEndKey(), query.getLimit());
     try (PreparedStatement stmt = connection.prepareStatement(deleteQuery + selectQueryWhere)) {
       IgniteSQLBuilder.fillSelectQuery(stmt, query.getStartKey(), query.getEndKey());
       stmt.executeUpdate();
@@ -369,9 +355,8 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
       dbFields.add(igniteMapping.getFields().get(af).getName());
     }
     String selectQuery = IgniteSQLBuilder.selectQuery(igniteMapping, dbFields);
-    String selectQueryWhere = IgniteSQLBuilder.selectQueryWhere(igniteMapping, query.getStartKey(), query.getEndKey(), query.getLimit());
-    try {
-      PreparedStatement stmt = connection.prepareStatement(selectQuery + selectQueryWhere);
+    String selectQueryWhere = IgniteSQLBuilder.queryWhere(igniteMapping, query.getStartKey(), query.getEndKey(), query.getLimit());
+    try (PreparedStatement stmt = connection.prepareStatement(selectQuery + selectQueryWhere)) {
       RowSetFactory factory = RowSetProvider.newFactory();
       CachedRowSet rowset = factory.createCachedRowSet();
       IgniteSQLBuilder.fillSelectQuery(stmt, query.getStartKey(), query.getEndKey());
@@ -385,6 +370,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
     }
   }
 
+  @SuppressWarnings("unchecked")
   public K extractKey(ResultSet r) throws SQLException {
     assert igniteMapping.getPrimaryKey().size() == 1;
     return (K) r.getObject(igniteMapping.getPrimaryKey().get(0).getName());
@@ -422,7 +408,8 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
     }
   }
 
-  private Object serializeFieldValue(Column get, Schema fieldSchema, Object fieldValue) {
+  @SuppressWarnings("unchecked")
+  private Object serializeFieldValue(Schema fieldSchema, Object fieldValue) {
     Object output = fieldValue;
     switch (fieldSchema.getType()) {
       case ARRAY:
@@ -442,7 +429,7 @@ public class IgniteStore<K, T extends PersistentBase> extends DataStoreBase<K, T
         if (fieldSchema.getTypes().size() == 2 && isNullable(fieldSchema)) {
           int schemaPos = getUnionSchema(fieldValue, fieldSchema);
           Schema unionSchema = fieldSchema.getTypes().get(schemaPos);
-          output = serializeFieldValue(get, unionSchema, fieldValue);
+          output = serializeFieldValue(unionSchema, fieldValue);
         } else {
           data = null;
           try {

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/store/package-info.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/store/package-info.java b/gora-ignite/src/main/java/org/apache/gora/ignite/store/package-info.java
index 62cba67..49959c8 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/store/package-info.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/store/package-info.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteBackendConstants.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteBackendConstants.java b/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteBackendConstants.java
new file mode 100644
index 0000000..7459c67
--- /dev/null
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteBackendConstants.java
@@ -0,0 +1,36 @@
+/*
+ * 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.gora.ignite.utils;
+
+/**
+ *
+ * Constants file for Ignite.
+ */
+public class IgniteBackendConstants {
+
+  /*
+  * Default configurations for Ignite
+  */
+  public static final String DEFAULT_IGNITE_HOST = "localhost";
+  public static final String DEFAULT_IGNITE_PORT = "10800";
+  
+  /*
+   * A '42000' error code is thrown by Ignite when a non-existent table is queried.
+   * More details: https://apacheignite-sql.readme.io/docs/jdbc-error-codes
+   */
+  public static final String DEFAULT_IGNITE_TABLE_NOT_EXISTS_CODE = "42000";
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteSQLBuilder.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteSQLBuilder.java b/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteSQLBuilder.java
index 4c1e314..3639b90 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteSQLBuilder.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/utils/IgniteSQLBuilder.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.
@@ -25,7 +25,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Set;
 import org.apache.gora.ignite.store.Column;
 import org.apache.gora.ignite.store.IgniteMapping;
 
@@ -40,10 +39,23 @@ public class IgniteSQLBuilder {
     return messageFormat.format(args);
   }
 
+  /**
+   * Returns a SQL query for determine whether a table exists or not.
+   *
+   * @param tableName The name of the table to be check.
+   * @return SQL query
+   */
   public static String tableExists(String tableName) {
     return format("SELECT * FROM {0} LIMIT 0", tableName);
   }
 
+  /**
+   * Returns a SQL create table statement for initializing a datastore based
+   * upon a Ignite Mapping definition.
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @return SQL create query (DDL).
+   */
   public static String createTable(IgniteMapping mapping) {
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("CREATE TABLE ");
@@ -67,10 +79,25 @@ public class IgniteSQLBuilder {
     return sqlBuilder.toString();
   }
 
+  /**
+   * Returns a SQL drop table statement for deleting a datastore instance within
+   * ignite.
+   *
+   * @param tableName The name of the table to be dropped.
+   * @return SQL drop query (DDL).
+   */
   public static String dropTable(String tableName) {
     return format("DROP TABLE IF EXISTS {0} ;", tableName);
   }
 
+  /**
+   * Returns a bare SQL insert statement for adding a new record on a Ignite
+   * data store.
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @param data A map containing the Column-Value pairs of the new record.
+   * @return SQL insert statement
+   */
   public static String baseInsertStatement(IgniteMapping mapping, Map<Column, Object> data) {
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("MERGE INTO ");
@@ -92,14 +119,31 @@ public class IgniteSQLBuilder {
     return sqlBuilder.toString();
   }
 
-  public static void fillInsertStatement(PreparedStatement st, Map<Column, Object> data) throws SQLException {
-    List<Entry<Column, Object>> list = new ArrayList<>(data.entrySet());
+  /**
+   * Fills a SQL PreparedStatement of a insert operation with the actual data to
+   * be inserted.
+   *
+   * @param statement The insertion PreparedStatement to be filled.
+   * @param insertData A map containing the Column-Value pairs of the new
+   * record.
+   * @throws SQLException When invalid values are provided as parameters for the
+   * insert statement.
+   */
+  public static void fillInsertStatement(PreparedStatement statement, Map<Column, Object> insertData) throws SQLException {
+    List<Entry<Column, Object>> list = new ArrayList<>(insertData.entrySet());
     for (int i = 0; i < list.size(); i++) {
       int j = i + 1;
-      st.setObject(j, list.get(i).getValue());
+      statement.setObject(j, list.get(i).getValue());
     }
   }
 
+  /**
+   * Returns a bare SQL statement for deleting a record from the Ignite data
+   * store.
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @return SQL delete statement
+   */
   public static String delete(IgniteMapping mapping) {
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("DELETE FROM ");
@@ -113,20 +157,38 @@ public class IgniteSQLBuilder {
     return sqlBuilder.toString();
   }
 
-  public static void fillDeleteStatement(PreparedStatement st, IgniteMapping mapping, Object... data) throws SQLException {
-    assert mapping.getPrimaryKey().size() == data.length;
+  /**
+   * Fills a SQL PreparedStatement of a delete operation with the actual key of
+   * the record to be deleted
+   *
+   * @param statement The deletion PreparedStatement to be filled.
+   * @param mapping The ignite mapping definition of the data store
+   * @param deleteData An Object array containing the primary key values of the
+   * record to be deleted
+   * @throws SQLException When invalid keys' values are provided as parameters
+   */
+  public static void fillDeleteStatement(PreparedStatement statement, IgniteMapping mapping, Object... deleteData) throws SQLException {
+    assert mapping.getPrimaryKey().size() == deleteData.length;
     for (int i = 0; i < mapping.getPrimaryKey().size(); i++) {
       int j = i + 1;
-      st.setObject(j, data[i]);
+      statement.setObject(j, deleteData[i]);
     }
   }
 
-  public static String selectGet(IgniteMapping mapping, List<String> fields) {
+  /**
+   * Returns a bare SQL statement for retrieving a record from the ignite data
+   * store
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @param columns A list of columns to be retrieved within the select query
+   * @return SQL select statement
+   */
+  public static String selectGet(IgniteMapping mapping, List<String> columns) {
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("SELECT ");
-    for (int i = 0; i < fields.size(); i++) {
-      sqlBuilder.append(fields.get(i));
-      sqlBuilder.append(i == fields.size() - 1 ? "" : " , ");
+    for (int i = 0; i < columns.size(); i++) {
+      sqlBuilder.append(columns.get(i));
+      sqlBuilder.append(i == columns.size() - 1 ? "" : " , ");
     }
     sqlBuilder.append(" FROM ");
     sqlBuilder.append(mapping.getTableName());
@@ -139,20 +201,39 @@ public class IgniteSQLBuilder {
     return sqlBuilder.toString();
   }
 
-  public static void fillSelectStatement(PreparedStatement st, IgniteMapping mapping, Object... data) throws SQLException {
-    assert mapping.getPrimaryKey().size() == data.length;
+  /**
+   * Fills a SQL PreparedStatement of a select operation with the actual keys of
+   * the record to be retrieved
+   *
+   * @param statement The select PreparedStatement to be filled.
+   * @param mapping The ignite mapping definition of the data store
+   * @param selectData An Object array containing the primary key values of the
+   * record to be retrieved
+   * @throws SQLException When invalid keys' values are provided as parameters
+   */
+  public static void fillSelectStatement(PreparedStatement statement, IgniteMapping mapping, Object... selectData) throws SQLException {
+    assert mapping.getPrimaryKey().size() == selectData.length;
     for (int i = 0; i < mapping.getPrimaryKey().size(); i++) {
       int j = i + 1;
-      st.setObject(j, data[i]);
+      statement.setObject(j, selectData[i]);
     }
   }
 
-  public static String selectQuery(IgniteMapping mapping, List<String> ifields) {
+  /**
+   * Returns a base SQL statement for retrieving multiple records from the
+   * ignite data store
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @param selectFields A list of columns to be retrieved within the select
+   * query
+   * @return SQL select statement
+   */
+  public static String selectQuery(IgniteMapping mapping, List<String> selectFields) {
     List<String> fields = new ArrayList<>();
     for (Column c : mapping.getPrimaryKey()) {
       fields.add(c.getName());
     }
-    fields.addAll(ifields);
+    fields.addAll(selectFields);
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("SELECT ");
     for (int i = 0; i < fields.size(); i++) {
@@ -164,6 +245,13 @@ public class IgniteSQLBuilder {
     return sqlBuilder.toString();
   }
 
+  /**
+   * Returns a base SQL statement for deleting multiple records from the ignite
+   * data store
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @return SQL delete statement
+   */
   public static String deleteQuery(IgniteMapping mapping) {
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("DELETE FROM ");
@@ -171,64 +259,91 @@ public class IgniteSQLBuilder {
     return sqlBuilder.toString();
   }
 
-  public static String deleteQueryFields(IgniteMapping mapping, List<String> lsFields) {
+  /**
+   * Returns a base SQL statement for deleting fields from records of the ignite
+   * data store
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @param deleteFields A list of columns to be deleted (set to null)
+   * @return SQL update statement
+   */
+  public static String deleteQueryFields(IgniteMapping mapping, List<String> deleteFields) {
     StringBuilder sqlBuilder = new StringBuilder();
     sqlBuilder.append("UPDATE ");
     sqlBuilder.append(mapping.getTableName());
-    if (!lsFields.isEmpty()) {
+    if (!deleteFields.isEmpty()) {
       sqlBuilder.append(" SET ");
     }
-    for (int i = 0; i < lsFields.size(); i++) {
-      sqlBuilder.append(lsFields.get(i));
+    for (int i = 0; i < deleteFields.size(); i++) {
+      sqlBuilder.append(deleteFields.get(i));
       sqlBuilder.append(" = null");
-      sqlBuilder.append(i == lsFields.size() - 1 ? "" : " , ");
+      sqlBuilder.append(i == deleteFields.size() - 1 ? "" : " , ");
     }
     return sqlBuilder.toString();
   }
 
-  public static String selectQueryWhere(IgniteMapping mapping, Object sk, Object ek, long limit) {
+  /**
+   * Returns a SQL's WHERE segment with proper conditions set for
+   * Querying/Deleting/Updating multiple records of a ignite data store
+   *
+   * @param mapping The ignite mapping definition of the data store
+   * @param startKey Start key of the WHERE condition
+   * @param endKey End key of the WHERE condition
+   * @param limit The maximum number of records to be consider
+   * @return SQL WHERE segment
+   */
+  public static String queryWhere(IgniteMapping mapping, Object startKey, Object endKey, long limit) {
     //composite keys pending
     assert mapping.getPrimaryKey().size() == 1;
     String keycolumn = mapping.getPrimaryKey().get(0).getName();
     StringBuilder sqlBuilder = new StringBuilder();
-    if (sk != null || ek != null) {
+    if (startKey != null || endKey != null) {
       sqlBuilder.append(" WHERE ");
-      if (sk != null && ek != null && sk.equals(ek)) {
+      if (startKey != null && endKey != null && startKey.equals(endKey)) {
         sqlBuilder.append(keycolumn);
         sqlBuilder.append("= ?");
       } else {
-        if (sk != null) {
+        if (startKey != null) {
           sqlBuilder.append(keycolumn);
           sqlBuilder.append(">= ?");
         }
-        if (sk != null && ek != null) {
+        if (startKey != null && endKey != null) {
           sqlBuilder.append(" AND ");
         }
-        if (ek != null) {
+        if (endKey != null) {
           sqlBuilder.append(keycolumn);
           sqlBuilder.append("<= ?");
         }
       }
     }
     if (limit > 0) {
-      sqlBuilder.append(" LIMIT " + limit);
+      sqlBuilder.append(" LIMIT ").append(limit);
     }
     return sqlBuilder.toString();
   }
 
-  public static void fillSelectQuery(PreparedStatement st, Object sk, Object ek) throws SQLException {
-    if (sk != null || ek != null) {
-      if (sk != null && ek != null && sk.equals(ek)) {
-        st.setObject(1, sk);
+  /**
+   * Fills a SQL PreparedStatement's WHERE segment of a select/delete/update
+   * operation with proper key values
+   *
+   * @param statement The select PreparedStatement to be filled.
+   * @param startKey Start key of the WHERE condition
+   * @param endKey End key of the WHERE condition
+   * @throws SQLException When invalid keys' values are provided as parameters
+   */
+  public static void fillSelectQuery(PreparedStatement statement, Object startKey, Object endKey) throws SQLException {
+    if (startKey != null || endKey != null) {
+      if (startKey != null && endKey != null && startKey.equals(endKey)) {
+        statement.setObject(1, startKey);
       } else {
-        if (sk != null && ek != null) {
-          st.setObject(1, sk);
-          st.setObject(2, ek);
+        if (startKey != null && endKey != null) {
+          statement.setObject(1, startKey);
+          statement.setObject(2, endKey);
         } else {
-          if (sk != null) {
-            st.setObject(1, sk);
+          if (startKey != null) {
+            statement.setObject(1, startKey);
           } else {
-            st.setObject(1, ek);
+            statement.setObject(1, endKey);
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/main/java/org/apache/gora/ignite/utils/package-info.java
----------------------------------------------------------------------
diff --git a/gora-ignite/src/main/java/org/apache/gora/ignite/utils/package-info.java b/gora-ignite/src/main/java/org/apache/gora/ignite/utils/package-info.java
index ce4cd7a..ddba6e6 100644
--- a/gora-ignite/src/main/java/org/apache/gora/ignite/utils/package-info.java
+++ b/gora-ignite/src/main/java/org/apache/gora/ignite/utils/package-info.java
@@ -1,4 +1,4 @@
-/**
+/*
  * 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.

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/gora-ignite/src/test/resources/META-INF/config/java.util.logging.properties
----------------------------------------------------------------------
diff --git a/gora-ignite/src/test/resources/META-INF/config/java.util.logging.properties b/gora-ignite/src/test/resources/META-INF/config/java.util.logging.properties
new file mode 100644
index 0000000..72e267f
--- /dev/null
+++ b/gora-ignite/src/test/resources/META-INF/config/java.util.logging.properties
@@ -0,0 +1,74 @@
+#
+# 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.
+#
+
+#########################################################################
+#       Default java.util.logging configuration for Ignite.
+#
+# To use another config file use `java.util.logging.config.file` system
+# property. For example `java -Djava.util.logging.config.file=myfile`
+#########################################################################
+
+#
+# Comma-separated list of logging "handlers". Note that some of them may be
+# reconfigured (or even removed) at runtime according to system properties.
+#
+# By default all messages will be passed to console and file.
+#
+handlers=java.util.logging.ConsoleHandler, org.apache.ignite.logger.java.JavaLoggerFileHandler
+
+#
+# Default global logging level.
+# This specifies which kinds of events are logged across all loggers.
+# For any given category this global level can be overriden by a category
+# specific level.
+# Note that handlers also have a separate level setting to limit messages
+# printed through it.
+#
+.level=OFF
+
+#
+# Uncomment to allow debug messages for entire Ignite package.
+#
+#org.apache.ignite.level=FINE
+
+#
+# Uncomment this line to enable cache query execution tracing.
+#
+#org.apache.ignite.cache.queries.level=FINE
+
+#
+# Uncomment to disable courtesy notices, such as SPI configuration
+# consistency warnings.
+#
+#org.apache.ignite.CourtesyConfigNotice.level=OFF
+
+#
+# Console handler logs all messages with importance level `INFO` and above
+# into standard error stream (`System.err`).
+#
+java.util.logging.ConsoleHandler.formatter=org.apache.ignite.logger.java.JavaLoggerFormatter
+java.util.logging.ConsoleHandler.level=INFO
+
+#
+# File handler logs all messages into files with pattern `ignite-%{id8}.%g.log`
+# under `$IGNITE_HOME/work/log/` directory. The placeholder `%{id8}` is a truncated node ID.
+#
+org.apache.ignite.logger.java.JavaLoggerFileHandler.formatter=org.apache.ignite.logger.java.JavaLoggerFormatter
+org.apache.ignite.logger.java.JavaLoggerFileHandler.pattern=ignite-%{id8}.%g.log
+org.apache.ignite.logger.java.JavaLoggerFileHandler.level=INFO
+org.apache.ignite.logger.java.JavaLoggerFileHandler.limit=10485760
+org.apache.ignite.logger.java.JavaLoggerFileHandler.count=10

http://git-wip-us.apache.org/repos/asf/gora/blob/740ab814/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 88b9b52..b4838f0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -780,6 +780,8 @@
     <!-- Cassandra Dependencies -->
     <cassandra-driver.version>3.3.0</cassandra-driver.version>
     <cassandra.version>3.11.0</cassandra.version>
+    <!-- Ignite Dependencies -->
+    <ignite.version>2.6.0</ignite.version>
     <!-- Solr Dependencies -->
     <lucene-solr.version>6.5.1</lucene-solr.version>
     <solr-solrj.version>6.5.1</solr-solrj.version>