You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/08/22 07:37:25 UTC

[29/32] ignite git commit: IGNITE-3702 Fixed missing query index type setter generation. Added tests. Minor code improvements.

IGNITE-3702 Fixed missing query index type setter generation. Added tests. Minor code improvements.


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

Branch: refs/heads/ignite-3220-1
Commit: 974467aa1e8a1cdfcd25bd2218d71e70c0dceddc
Parents: 7422195
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Mon Aug 22 10:14:27 2016 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Mon Aug 22 10:14:27 2016 +0700

----------------------------------------------------------------------
 .../parser/dialect/DatabaseMetadataDialect.java |  18 +
 .../parser/dialect/JdbcMetadataDialect.java     |   5 +-
 .../parser/dialect/OracleMetadataDialect.java   |   5 +-
 .../ignite/schema/generator/CodeGenerator.java  |   7 +-
 .../schema/parser/DatabaseMetadataParser.java   |   4 +-
 .../ignite/schema/ui/SchemaImportApp.java       |   3 +-
 .../schema/test/AbstractSchemaImportTest.java   |  27 +-
 .../test/generator/CodeGeneratorTest.java       |  28 +-
 .../schema/test/generator/XmlGeneratorTest.java |  22 +-
 .../ignite/schema/test/model/CacheConfig.txt    | 409 +++++++++++++++++++
 .../schema/test/model/ignite-type-metadata.xml  |  50 ++-
 .../test/parser/DbMetadataParserTest.java       |   6 +-
 12 files changed, 538 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/DatabaseMetadataDialect.java
----------------------------------------------------------------------
diff --git a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/DatabaseMetadataDialect.java b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/DatabaseMetadataDialect.java
index f34eee4..5ef088a 100644
--- a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/DatabaseMetadataDialect.java
+++ b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/DatabaseMetadataDialect.java
@@ -21,10 +21,12 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Set;
 
 import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.QueryIndexType;
 import org.apache.ignite.schema.parser.DbColumn;
 import org.apache.ignite.schema.parser.DbTable;
 
@@ -72,4 +74,20 @@ public abstract class DatabaseMetadataDialect {
     protected DbTable table(String schema, String tbl, Collection<DbColumn> cols, Collection<QueryIndex>idxs) {
         return new DbTable(schema, tbl, cols, idxs);
     }
+
+    /**
+     * Create index descriptor.
+     *
+     * @param idxName Index name.
+     * @return New initialized {@code QueryIndex} instance.
+     */
+    protected QueryIndex index(String idxName) {
+        QueryIndex idx = new QueryIndex();
+
+        idx.setName(idxName);
+        idx.setIndexType(QueryIndexType.SORTED);
+        idx.setFields(new LinkedHashMap<String, Boolean>());
+
+        return idx;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/JdbcMetadataDialect.java
----------------------------------------------------------------------
diff --git a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/JdbcMetadataDialect.java b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/JdbcMetadataDialect.java
index 0b54b25..235c84c 100644
--- a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/JdbcMetadataDialect.java
+++ b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/JdbcMetadataDialect.java
@@ -171,10 +171,7 @@ public class JdbcMetadataDialect extends DatabaseMetadataDialect {
                             QueryIndex idx = idxs.get(idxName);
 
                             if (idx == null) {
-                                idx = new QueryIndex();
-                                idx.setName(idxName);
-                                idx.setIndexType(QueryIndexType.SORTED);
-                                idx.setFields(new LinkedHashMap<String, Boolean>());
+                                idx = index(idxName);
 
                                 idxs.put(idxName, idx);
                             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
----------------------------------------------------------------------
diff --git a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
index ed5cdc5..3535655 100644
--- a/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
+++ b/modules/schema-import-db/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
@@ -272,10 +272,7 @@ public class OracleMetadataDialect extends DatabaseMetadataDialect {
                 QueryIndex idx = idxs.get(idxName);
 
                 if (idx == null) {
-                    idx = new QueryIndex();
-                    idx.setName(idxName);
-                    idx.setIndexType(QueryIndexType.SORTED);
-                    idx.setFields(new LinkedHashMap<String, Boolean>());
+                    idx = index(idxName);
 
                     idxs.put(idxName, idx);
                 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/CodeGenerator.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/CodeGenerator.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/CodeGenerator.java
index 01fcfa6..59dfdc4 100644
--- a/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/CodeGenerator.java
+++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/CodeGenerator.java
@@ -728,6 +728,9 @@ public class CodeGenerator {
                             add2(src, "idx.setName(\"" + idx.getName() + "\");");
                             add0(src, "");
 
+                            add2(src, "idx.setIndexType(QueryIndexType." + idx.getIndexType() + ");");
+                            add0(src, "");
+
                             add2(src, (firstIdx ? "LinkedHashMap<String, Boolean> " : "") +
                                 "idxFlds = new LinkedHashMap<>();");
                             add0(src, "");
@@ -781,7 +784,7 @@ public class CodeGenerator {
         add2(src, "ccfg.setWriteThrough(true);");
         add0(src, "");
 
-        add2(src, "// Configure JDBC types. ");
+        add2(src, "// Configure JDBC types.");
         add2(src, "Collection<JdbcType> jdbcTypes = new ArrayList<>();");
         add0(src, "");
 
@@ -794,7 +797,7 @@ public class CodeGenerator {
         add0(src, "");
 
 
-        add2(src, "// Configure query entities. ");
+        add2(src, "// Configure query entities.");
         add2(src, "Collection<QueryEntity> qryEntities = new ArrayList<>();");
         add0(src, "");
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java
index b86346f..6d87ed5 100644
--- a/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java
+++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/parser/DatabaseMetadataParser.java
@@ -99,8 +99,8 @@ public class DatabaseMetadataParser {
             if (!children.isEmpty()) {
                 parent.children(children);
 
-                res.add(parent);
-                res.addAll(children);
+                res.add(parent); // Add schema description.
+                res.addAll(children); // Add tables in schema.
             }
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
index a02d31e..6305341 100644
--- a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
+++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
@@ -798,8 +798,9 @@ public class SchemaImportApp extends Application {
 
             /**
              * Check that system has Nautilus.
+             *
              * @return {@code True} when Nautilus is installed or {@code false} otherwise.
-             * @throws IOException
+             * @throws IOException If failed to detect Nautilus.
              */
             private boolean canUseNautilus() throws IOException {
                 if (U.isUnix() || new File("/usr/bin/xdg-mime").canExecute() || new File("/usr/bin/nautilus").canExecute()) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/test/java/org/apache/ignite/schema/test/AbstractSchemaImportTest.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/AbstractSchemaImportTest.java b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/AbstractSchemaImportTest.java
index d4534be..8cb1196 100644
--- a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/AbstractSchemaImportTest.java
+++ b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/AbstractSchemaImportTest.java
@@ -35,8 +35,6 @@ import org.apache.ignite.schema.parser.DatabaseMetadataParser;
 import org.apache.ignite.schema.ui.ConfirmCallable;
 import org.apache.ignite.schema.ui.MessageBox;
 
-import static org.apache.ignite.schema.ui.MessageBox.Result.YES_TO_ALL;
-
 /**
  * Base functional for Ignite Schema Import utility tests.
  */
@@ -48,13 +46,16 @@ public abstract class AbstractSchemaImportTest extends TestCase {
     protected static final String OUT_DIR_PATH = System.getProperty("java.io.tmpdir") + "/ignite-schema-import/out";
 
     /** Auto confirmation of file conflicts. */
-    protected final ConfirmCallable askOverwrite = new ConfirmCallable(null, "") {
+    protected static final ConfirmCallable YES_TO_ALL = new ConfirmCallable(null, "") {
         @Override public MessageBox.Result confirm(String msg) {
-            return YES_TO_ALL;
+            return MessageBox.Result.YES_TO_ALL;
         }
     };
 
-    /** List of generated for test database POJO objects. */
+    /** List of ALL object parsed from test database. */
+    protected List<PojoDescriptor> all;
+
+    /** List of ONLY POJO descriptors. */
     protected List<PojoDescriptor> pojos;
 
     /** {@inheritDoc} */
@@ -99,6 +100,10 @@ public abstract class AbstractSchemaImportTest extends TestCase {
             " arrCol BINARY(10)," +
             " FIELD_WITH_ALIAS VARCHAR(10))");
 
+        stmt.executeUpdate("CREATE INDEX IF NOT EXISTS IDX_1 ON OBJECTS (INTCOL ASC, LONGCOL ASC)");
+
+        stmt.executeUpdate("CREATE INDEX IF NOT EXISTS IDX_2 ON OBJECTS (INTCOL ASC, LONGCOL DESC)");
+
         stmt.executeUpdate("CREATE SCHEMA IF NOT EXISTS TESTSCHEMA");
 
         stmt.executeUpdate("CREATE TABLE IF NOT EXISTS TESTSCHEMA.TST(pk INTEGER PRIMARY KEY, " +
@@ -118,13 +123,23 @@ public abstract class AbstractSchemaImportTest extends TestCase {
             " arrCol BINARY(10)," +
             " FIELD_WITH_ALIAS VARCHAR(10))");
 
+        stmt.executeUpdate("CREATE INDEX IF NOT EXISTS IDX_3 ON TESTSCHEMA.TST (INTCOL ASC, LONGCOL ASC)");
+
+        stmt.executeUpdate("CREATE INDEX IF NOT EXISTS IDX_4 ON TESTSCHEMA.TST (INTCOL ASC, LONGCOL DESC)");
+
         conn.commit();
 
         U.closeQuiet(stmt);
 
         List<String> schemas = new ArrayList<>();
 
-        pojos = DatabaseMetadataParser.parse(conn, schemas, false);
+        all = DatabaseMetadataParser.parse(conn, schemas, false);
+
+        pojos = new ArrayList<>();
+
+        for (PojoDescriptor pojo : all)
+            if (pojo.parent() != null)
+                pojos.add(pojo);
 
         U.closeQuiet(conn);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/CodeGeneratorTest.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/CodeGeneratorTest.java b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/CodeGeneratorTest.java
index 2fef9e1..0917139 100644
--- a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/CodeGeneratorTest.java
+++ b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/CodeGeneratorTest.java
@@ -29,26 +29,29 @@ public class CodeGeneratorTest extends AbstractSchemaImportTest {
     /** Marker string to skip date generation while comparing.*/
     private static final String GEN_PTRN = "Code generated by Apache Ignite Schema Import utility";
 
+    /** Test package. */
+    private static final String TEST_PACKAGE = "org.apache.ignite.schema.test.model";
+
+    /** Path to generated model. */
+    private static final String TEST_PATH = "org/apache/ignite/schema/test/model";
+
     /**
      * Test that POJOs generated correctly.
      */
     public void testPojoGeneration() throws Exception {
-        String pkg = "org.apache.ignite.schema.test.model";
-        String intPath = "org/apache/ignite/schema/test/model";
-
         Boolean containsSchema = false;
 
-        for (PojoDescriptor pojo : pojos) {
+        for (PojoDescriptor pojo : all) {
             if (pojo.valueClassName().isEmpty())
                 containsSchema = true;
             else {
-                CodeGenerator.pojos(pojo, OUT_DIR_PATH, pkg, true, true, askOverwrite);
+                CodeGenerator.pojos(pojo, OUT_DIR_PATH, TEST_PACKAGE, true, true, YES_TO_ALL);
 
                 assertTrue("Generated key class POJO content is differ from expected for type " + pojo.keyClassName(),
-                        compareFiles(pojo.keyClassName(), intPath, GEN_PTRN));
+                        compareFiles(pojo.keyClassName(), TEST_PATH, GEN_PTRN));
 
                 assertTrue("Generated value class POJO content is differ from expected for type " + pojo.valueClassName(),
-                        compareFiles(pojo.valueClassName(), intPath, GEN_PTRN));
+                        compareFiles(pojo.valueClassName(), TEST_PATH, GEN_PTRN));
             }
         }
 
@@ -56,6 +59,15 @@ public class CodeGeneratorTest extends AbstractSchemaImportTest {
     }
 
     /**
+     * Test that configuration generated correctly.
+     */
+    public void testConfigGeneration() throws Exception {
+        CodeGenerator.snippet(pojos, TEST_PACKAGE, true, true, OUT_DIR_PATH, YES_TO_ALL);
+
+        assertTrue("Generated configuration is differ from expected", compareFiles("CacheConfig", TEST_PATH, GEN_PTRN));
+    }
+
+    /**
      * @param typeName Type name.
      * @param intPath Internal path.
      * @return {@code true} if generated POJO as expected.
@@ -66,4 +78,4 @@ public class CodeGeneratorTest extends AbstractSchemaImportTest {
         return compareFilesInt(getClass().getResourceAsStream("/" + relPath + ".txt"),
                 new File(OUT_DIR_PATH + "/" + relPath + ".java"), excludePtrn);
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/XmlGeneratorTest.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/XmlGeneratorTest.java b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/XmlGeneratorTest.java
index 2ed36e9..8b12392 100644
--- a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/XmlGeneratorTest.java
+++ b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/generator/XmlGeneratorTest.java
@@ -18,33 +18,25 @@
 package org.apache.ignite.schema.test.generator;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
 import org.apache.ignite.schema.generator.XmlGenerator;
-import org.apache.ignite.schema.model.PojoDescriptor;
 import org.apache.ignite.schema.test.AbstractSchemaImportTest;
 
 /**
  * Tests for XML generator.
  */
 public class XmlGeneratorTest extends AbstractSchemaImportTest {
+    /** */
+    private static final String TEST_XML_FILE_NAME = "ignite-type-metadata.xml";
+
     /**
      * Test that XML generated correctly.
      */
     public void testXmlGeneration() throws Exception {
-        Collection<PojoDescriptor> all = new ArrayList<>();
-
-        for (PojoDescriptor pojo : pojos)
-            if (pojo.parent() != null)
-                all.add(pojo);
-
-        String fileName = "ignite-type-metadata.xml";
-
-        XmlGenerator.generate("org.apache.ignite.schema.test.model", all, true, true, new File(OUT_DIR_PATH, fileName),
-            askOverwrite);
+        XmlGenerator.generate("org.apache.ignite.schema.test.model", pojos, true, true,
+            new File(OUT_DIR_PATH, TEST_XML_FILE_NAME), YES_TO_ALL);
 
         assertTrue("Generated XML file content is differ from expected one",
-            compareFilesInt(getClass().getResourceAsStream("/org/apache/ignite/schema/test/model/" + fileName),
-                new File(OUT_DIR_PATH + "/" + fileName), "XML generated by Apache Ignite Schema Import utility"));
+            compareFilesInt(getClass().getResourceAsStream("/org/apache/ignite/schema/test/model/" + TEST_XML_FILE_NAME),
+                new File(OUT_DIR_PATH, TEST_XML_FILE_NAME), "XML generated by Apache Ignite Schema Import utility"));
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/CacheConfig.txt
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/CacheConfig.txt b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/CacheConfig.txt
new file mode 100644
index 0000000..9573eb7
--- /dev/null
+++ b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/CacheConfig.txt
@@ -0,0 +1,409 @@
+/*
+ * 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.ignite.schema.test.model;
+
+import java.sql.*;
+import java.util.*;
+
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.store.jdbc.*;
+import org.apache.ignite.configuration.*;
+
+/**
+ * CacheConfig definition.
+ *
+ * Code generated by Apache Ignite Schema Import utility: 08/18/2016.
+ */
+public class CacheConfig {
+    /**
+     * Create JDBC type for OBJECTS.
+     *
+     * @param cacheName Cache name.
+     * @return Configured JDBC type.
+     */
+    private static JdbcType jdbcTypeObjects(String cacheName) {
+        JdbcType jdbcType = new JdbcType();
+
+        jdbcType.setCacheName(cacheName);
+        jdbcType.setDatabaseSchema("PUBLIC");
+        jdbcType.setDatabaseTable("OBJECTS");
+        jdbcType.setKeyType("org.apache.ignite.schema.test.model.ObjectsKey");
+        jdbcType.setValueType("org.apache.ignite.schema.test.model.Objects");
+
+        // Key fields for OBJECTS.
+        Collection<JdbcTypeField> keys = new ArrayList<>();
+        keys.add(new JdbcTypeField(Types.INTEGER, "PK", int.class, "pk"));
+        jdbcType.setKeyFields(keys.toArray(new JdbcTypeField[keys.size()]));
+
+        // Value fields for OBJECTS.
+        Collection<JdbcTypeField> vals = new ArrayList<>();
+        vals.add(new JdbcTypeField(Types.INTEGER, "PK", int.class, "pk"));
+        vals.add(new JdbcTypeField(Types.BOOLEAN, "BOOLCOL", Boolean.class, "boolcol"));
+        vals.add(new JdbcTypeField(Types.TINYINT, "BYTECOL", Byte.class, "bytecol"));
+        vals.add(new JdbcTypeField(Types.SMALLINT, "SHORTCOL", Short.class, "shortcol"));
+        vals.add(new JdbcTypeField(Types.INTEGER, "INTCOL", Integer.class, "intcol"));
+        vals.add(new JdbcTypeField(Types.BIGINT, "LONGCOL", Long.class, "longcol"));
+        vals.add(new JdbcTypeField(Types.REAL, "FLOATCOL", Float.class, "floatcol"));
+        vals.add(new JdbcTypeField(Types.DOUBLE, "DOUBLECOL", Double.class, "doublecol"));
+        vals.add(new JdbcTypeField(Types.DOUBLE, "DOUBLECOL2", Double.class, "doublecol2"));
+        vals.add(new JdbcTypeField(Types.DECIMAL, "BIGDECIMALCOL", java.math.BigDecimal.class, "bigdecimalcol"));
+        vals.add(new JdbcTypeField(Types.VARCHAR, "STRCOL", String.class, "strcol"));
+        vals.add(new JdbcTypeField(Types.DATE, "DATECOL", java.sql.Date.class, "datecol"));
+        vals.add(new JdbcTypeField(Types.TIME, "TIMECOL", java.sql.Time.class, "timecol"));
+        vals.add(new JdbcTypeField(Types.TIMESTAMP, "TSCOL", java.sql.Timestamp.class, "tscol"));
+        vals.add(new JdbcTypeField(Types.VARBINARY, "ARRCOL", Object.class, "arrcol"));
+        vals.add(new JdbcTypeField(Types.VARCHAR, "FIELD_WITH_ALIAS", String.class, "fieldWithAlias"));
+        jdbcType.setValueFields(vals.toArray(new JdbcTypeField[vals.size()]));
+
+        return jdbcType;
+    }
+
+    /**
+     * Create SQL Query descriptor for OBJECTS.
+     *
+     * @return Configured query entity.
+     */
+    private static QueryEntity queryEntityObjects() {
+        QueryEntity qryEntity = new QueryEntity();
+
+        qryEntity.setKeyType("org.apache.ignite.schema.test.model.ObjectsKey");
+        qryEntity.setValueType("org.apache.ignite.schema.test.model.Objects");
+
+        // Query fields for OBJECTS.
+        LinkedHashMap<String, String> fields = new LinkedHashMap<>();
+
+        fields.put("pk", "java.lang.Integer");
+        fields.put("boolcol", "java.lang.Boolean");
+        fields.put("bytecol", "java.lang.Byte");
+        fields.put("shortcol", "java.lang.Short");
+        fields.put("intcol", "java.lang.Integer");
+        fields.put("longcol", "java.lang.Long");
+        fields.put("floatcol", "java.lang.Float");
+        fields.put("doublecol", "java.lang.Double");
+        fields.put("doublecol2", "java.lang.Double");
+        fields.put("bigdecimalcol", "java.math.BigDecimal");
+        fields.put("strcol", "java.lang.String");
+        fields.put("datecol", "java.sql.Date");
+        fields.put("timecol", "java.sql.Time");
+        fields.put("tscol", "java.sql.Timestamp");
+        fields.put("arrcol", "java.lang.Object");
+        fields.put("fieldWithAlias", "java.lang.String");
+
+        qryEntity.setFields(fields);
+
+        // Aliases for fields.
+        Map<String, String> aliases = new HashMap<>();
+
+        aliases.put("fieldWithAlias", "FIELD_WITH_ALIAS");
+
+        qryEntity.setAliases(aliases);
+
+        // Indexes for OBJECTS.
+        Collection<QueryIndex> idxs = new ArrayList<>();
+
+        idxs.add(new QueryIndex("pk", true, "PRIMARY_KEY_C"));
+
+        QueryIndex idx = new QueryIndex();
+
+        idx.setName("IDX_1");
+
+        idx.setIndexType(QueryIndexType.SORTED);
+
+        LinkedHashMap<String, Boolean> idxFlds = new LinkedHashMap<>();
+
+        idxFlds.put("intcol", true);
+        idxFlds.put("longcol", true);
+
+        idx.setFields(idxFlds);
+
+        idxs.add(idx);
+
+        idx = new QueryIndex();
+
+        idx.setName("IDX_2");
+
+        idx.setIndexType(QueryIndexType.SORTED);
+
+        idxFlds = new LinkedHashMap<>();
+
+        idxFlds.put("intcol", true);
+        idxFlds.put("longcol", false);
+
+        idx.setFields(idxFlds);
+
+        idxs.add(idx);
+
+        qryEntity.setIndexes(idxs);
+
+        return qryEntity;
+    }
+
+    /**
+     * Create JDBC type for PRIMITIVES.
+     *
+     * @param cacheName Cache name.
+     * @return Configured JDBC type.
+     */
+    private static JdbcType jdbcTypePrimitives(String cacheName) {
+        JdbcType jdbcType = new JdbcType();
+
+        jdbcType.setCacheName(cacheName);
+        jdbcType.setDatabaseSchema("PUBLIC");
+        jdbcType.setDatabaseTable("PRIMITIVES");
+        jdbcType.setKeyType("org.apache.ignite.schema.test.model.PrimitivesKey");
+        jdbcType.setValueType("org.apache.ignite.schema.test.model.Primitives");
+
+        // Key fields for PRIMITIVES.
+        Collection<JdbcTypeField> keys = new ArrayList<>();
+        keys.add(new JdbcTypeField(Types.INTEGER, "PK", int.class, "pk"));
+        jdbcType.setKeyFields(keys.toArray(new JdbcTypeField[keys.size()]));
+
+        // Value fields for PRIMITIVES.
+        Collection<JdbcTypeField> vals = new ArrayList<>();
+        vals.add(new JdbcTypeField(Types.INTEGER, "PK", int.class, "pk"));
+        vals.add(new JdbcTypeField(Types.BOOLEAN, "BOOLCOL", boolean.class, "boolcol"));
+        vals.add(new JdbcTypeField(Types.TINYINT, "BYTECOL", byte.class, "bytecol"));
+        vals.add(new JdbcTypeField(Types.SMALLINT, "SHORTCOL", short.class, "shortcol"));
+        vals.add(new JdbcTypeField(Types.INTEGER, "INTCOL", int.class, "intcol"));
+        vals.add(new JdbcTypeField(Types.BIGINT, "LONGCOL", long.class, "longcol"));
+        vals.add(new JdbcTypeField(Types.REAL, "FLOATCOL", float.class, "floatcol"));
+        vals.add(new JdbcTypeField(Types.DOUBLE, "DOUBLECOL", double.class, "doublecol"));
+        vals.add(new JdbcTypeField(Types.DOUBLE, "DOUBLECOL2", double.class, "doublecol2"));
+        vals.add(new JdbcTypeField(Types.DECIMAL, "BIGDECIMALCOL", java.math.BigDecimal.class, "bigdecimalcol"));
+        vals.add(new JdbcTypeField(Types.VARCHAR, "STRCOL", String.class, "strcol"));
+        vals.add(new JdbcTypeField(Types.DATE, "DATECOL", java.sql.Date.class, "datecol"));
+        vals.add(new JdbcTypeField(Types.TIME, "TIMECOL", java.sql.Time.class, "timecol"));
+        vals.add(new JdbcTypeField(Types.TIMESTAMP, "TSCOL", java.sql.Timestamp.class, "tscol"));
+        vals.add(new JdbcTypeField(Types.VARBINARY, "ARRCOL", Object.class, "arrcol"));
+        vals.add(new JdbcTypeField(Types.VARCHAR, "FIELD_WITH_ALIAS", String.class, "fieldWithAlias"));
+        jdbcType.setValueFields(vals.toArray(new JdbcTypeField[vals.size()]));
+
+        return jdbcType;
+    }
+
+    /**
+     * Create SQL Query descriptor for PRIMITIVES.
+     *
+     * @return Configured query entity.
+     */
+    private static QueryEntity queryEntityPrimitives() {
+        QueryEntity qryEntity = new QueryEntity();
+
+        qryEntity.setKeyType("org.apache.ignite.schema.test.model.PrimitivesKey");
+        qryEntity.setValueType("org.apache.ignite.schema.test.model.Primitives");
+
+        // Query fields for PRIMITIVES.
+        LinkedHashMap<String, String> fields = new LinkedHashMap<>();
+
+        fields.put("pk", "java.lang.Integer");
+        fields.put("boolcol", "java.lang.Boolean");
+        fields.put("bytecol", "java.lang.Byte");
+        fields.put("shortcol", "java.lang.Short");
+        fields.put("intcol", "java.lang.Integer");
+        fields.put("longcol", "java.lang.Long");
+        fields.put("floatcol", "java.lang.Float");
+        fields.put("doublecol", "java.lang.Double");
+        fields.put("doublecol2", "java.lang.Double");
+        fields.put("bigdecimalcol", "java.math.BigDecimal");
+        fields.put("strcol", "java.lang.String");
+        fields.put("datecol", "java.sql.Date");
+        fields.put("timecol", "java.sql.Time");
+        fields.put("tscol", "java.sql.Timestamp");
+        fields.put("arrcol", "java.lang.Object");
+        fields.put("fieldWithAlias", "java.lang.String");
+
+        qryEntity.setFields(fields);
+
+        // Aliases for fields.
+        Map<String, String> aliases = new HashMap<>();
+
+        aliases.put("fieldWithAlias", "FIELD_WITH_ALIAS");
+
+        qryEntity.setAliases(aliases);
+
+        // Indexes for PRIMITIVES.
+        Collection<QueryIndex> idxs = new ArrayList<>();
+
+        idxs.add(new QueryIndex("pk", true, "PRIMARY_KEY_D"));
+
+        qryEntity.setIndexes(idxs);
+
+        return qryEntity;
+    }
+
+    /**
+     * Create JDBC type for TST.
+     *
+     * @param cacheName Cache name.
+     * @return Configured JDBC type.
+     */
+    private static JdbcType jdbcTypeTst(String cacheName) {
+        JdbcType jdbcType = new JdbcType();
+
+        jdbcType.setCacheName(cacheName);
+        jdbcType.setDatabaseSchema("TESTSCHEMA");
+        jdbcType.setDatabaseTable("TST");
+        jdbcType.setKeyType("org.apache.ignite.schema.test.model.TstKey");
+        jdbcType.setValueType("org.apache.ignite.schema.test.model.Tst");
+
+        // Key fields for TST.
+        Collection<JdbcTypeField> keys = new ArrayList<>();
+        keys.add(new JdbcTypeField(Types.INTEGER, "PK", int.class, "pk"));
+        jdbcType.setKeyFields(keys.toArray(new JdbcTypeField[keys.size()]));
+
+        // Value fields for TST.
+        Collection<JdbcTypeField> vals = new ArrayList<>();
+        vals.add(new JdbcTypeField(Types.INTEGER, "PK", int.class, "pk"));
+        vals.add(new JdbcTypeField(Types.BOOLEAN, "BOOLCOL", boolean.class, "boolcol"));
+        vals.add(new JdbcTypeField(Types.TINYINT, "BYTECOL", byte.class, "bytecol"));
+        vals.add(new JdbcTypeField(Types.SMALLINT, "SHORTCOL", short.class, "shortcol"));
+        vals.add(new JdbcTypeField(Types.INTEGER, "INTCOL", int.class, "intcol"));
+        vals.add(new JdbcTypeField(Types.BIGINT, "LONGCOL", long.class, "longcol"));
+        vals.add(new JdbcTypeField(Types.REAL, "FLOATCOL", float.class, "floatcol"));
+        vals.add(new JdbcTypeField(Types.DOUBLE, "DOUBLECOL", double.class, "doublecol"));
+        vals.add(new JdbcTypeField(Types.DOUBLE, "DOUBLECOL2", double.class, "doublecol2"));
+        vals.add(new JdbcTypeField(Types.DECIMAL, "BIGDECIMALCOL", java.math.BigDecimal.class, "bigdecimalcol"));
+        vals.add(new JdbcTypeField(Types.VARCHAR, "STRCOL", String.class, "strcol"));
+        vals.add(new JdbcTypeField(Types.DATE, "DATECOL", java.sql.Date.class, "datecol"));
+        vals.add(new JdbcTypeField(Types.TIME, "TIMECOL", java.sql.Time.class, "timecol"));
+        vals.add(new JdbcTypeField(Types.TIMESTAMP, "TSCOL", java.sql.Timestamp.class, "tscol"));
+        vals.add(new JdbcTypeField(Types.VARBINARY, "ARRCOL", Object.class, "arrcol"));
+        vals.add(new JdbcTypeField(Types.VARCHAR, "FIELD_WITH_ALIAS", String.class, "fieldWithAlias"));
+        jdbcType.setValueFields(vals.toArray(new JdbcTypeField[vals.size()]));
+
+        return jdbcType;
+    }
+
+    /**
+     * Create SQL Query descriptor for TST.
+     *
+     * @return Configured query entity.
+     */
+    private static QueryEntity queryEntityTst() {
+        QueryEntity qryEntity = new QueryEntity();
+
+        qryEntity.setKeyType("org.apache.ignite.schema.test.model.TstKey");
+        qryEntity.setValueType("org.apache.ignite.schema.test.model.Tst");
+
+        // Query fields for TST.
+        LinkedHashMap<String, String> fields = new LinkedHashMap<>();
+
+        fields.put("pk", "java.lang.Integer");
+        fields.put("boolcol", "java.lang.Boolean");
+        fields.put("bytecol", "java.lang.Byte");
+        fields.put("shortcol", "java.lang.Short");
+        fields.put("intcol", "java.lang.Integer");
+        fields.put("longcol", "java.lang.Long");
+        fields.put("floatcol", "java.lang.Float");
+        fields.put("doublecol", "java.lang.Double");
+        fields.put("doublecol2", "java.lang.Double");
+        fields.put("bigdecimalcol", "java.math.BigDecimal");
+        fields.put("strcol", "java.lang.String");
+        fields.put("datecol", "java.sql.Date");
+        fields.put("timecol", "java.sql.Time");
+        fields.put("tscol", "java.sql.Timestamp");
+        fields.put("arrcol", "java.lang.Object");
+        fields.put("fieldWithAlias", "java.lang.String");
+
+        qryEntity.setFields(fields);
+
+        // Aliases for fields.
+        Map<String, String> aliases = new HashMap<>();
+
+        aliases.put("fieldWithAlias", "FIELD_WITH_ALIAS");
+
+        qryEntity.setAliases(aliases);
+
+        // Indexes for TST.
+        Collection<QueryIndex> idxs = new ArrayList<>();
+
+        idxs.add(new QueryIndex("pk", true, "PRIMARY_KEY_1"));
+
+        QueryIndex idx = new QueryIndex();
+
+        idx.setName("IDX_3");
+
+        idx.setIndexType(QueryIndexType.SORTED);
+
+        LinkedHashMap<String, Boolean> idxFlds = new LinkedHashMap<>();
+
+        idxFlds.put("intcol", true);
+        idxFlds.put("longcol", true);
+
+        idx.setFields(idxFlds);
+
+        idxs.add(idx);
+
+        idx = new QueryIndex();
+
+        idx.setName("IDX_4");
+
+        idx.setIndexType(QueryIndexType.SORTED);
+
+        idxFlds = new LinkedHashMap<>();
+
+        idxFlds.put("intcol", true);
+        idxFlds.put("longcol", false);
+
+        idx.setFields(idxFlds);
+
+        idxs.add(idx);
+
+        qryEntity.setIndexes(idxs);
+
+        return qryEntity;
+    }
+
+    /**
+     * Configure cache.
+     *
+     * @param cacheName Cache name.
+     * @param storeFactory Cache store factory.
+     * @return Cache configuration.
+     */
+    public static <K, V> CacheConfiguration<K, V> cache(String cacheName, CacheJdbcPojoStoreFactory<K, V> storeFactory) {
+        if (storeFactory == null)
+             throw new IllegalArgumentException("Cache store factory cannot be null.");
+
+        CacheConfiguration<K, V> ccfg = new CacheConfiguration<>(cacheName);
+
+        ccfg.setCacheStoreFactory(storeFactory);
+        ccfg.setReadThrough(true);
+        ccfg.setWriteThrough(true);
+
+        // Configure JDBC types.
+        Collection<JdbcType> jdbcTypes = new ArrayList<>();
+
+        jdbcTypes.add(jdbcTypeObjects(cacheName));
+        jdbcTypes.add(jdbcTypePrimitives(cacheName));
+        jdbcTypes.add(jdbcTypeTst(cacheName));
+
+        storeFactory.setTypes(jdbcTypes.toArray(new JdbcType[jdbcTypes.size()]));
+
+        // Configure query entities.
+        Collection<QueryEntity> qryEntities = new ArrayList<>();
+
+        qryEntities.add(queryEntityObjects());
+        qryEntities.add(queryEntityPrimitives());
+        qryEntities.add(queryEntityTst());
+
+        ccfg.setQueryEntities(qryEntities);
+
+        return ccfg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/ignite-type-metadata.xml
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/ignite-type-metadata.xml b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/ignite-type-metadata.xml
index 514445f..fc481f0 100644
--- a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/ignite-type-metadata.xml
+++ b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/model/ignite-type-metadata.xml
@@ -18,7 +18,7 @@
 -->
 
 <!--
-    XML generated by Apache Ignite Schema Import utility: 11/20/2015
+    XML generated by Apache Ignite Schema Import utility: 08/18/2016
 -->
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:util="http://www.springframework.org/schema/util"
@@ -524,6 +524,30 @@
                         </map>
                     </property>
                 </bean>
+                <bean class="org.apache.ignite.cache.QueryIndex">
+                    <property name="name" value="IDX_1"/>
+                    <property name="indexType">
+                        <util:constant static-field="org.apache.ignite.cache.QueryIndexType.SORTED"/>
+                    </property>
+                    <property name="fields">
+                        <map>
+                            <entry key="intcol" value="true"/>
+                            <entry key="longcol" value="true"/>
+                        </map>
+                    </property>
+                </bean>
+                <bean class="org.apache.ignite.cache.QueryIndex">
+                    <property name="name" value="IDX_2"/>
+                    <property name="indexType">
+                        <util:constant static-field="org.apache.ignite.cache.QueryIndexType.SORTED"/>
+                    </property>
+                    <property name="fields">
+                        <map>
+                            <entry key="intcol" value="true"/>
+                            <entry key="longcol" value="false"/>
+                        </map>
+                    </property>
+                </bean>
             </list>
         </property>
     </bean>
@@ -612,6 +636,30 @@
                         </map>
                     </property>
                 </bean>
+                <bean class="org.apache.ignite.cache.QueryIndex">
+                    <property name="name" value="IDX_3"/>
+                    <property name="indexType">
+                        <util:constant static-field="org.apache.ignite.cache.QueryIndexType.SORTED"/>
+                    </property>
+                    <property name="fields">
+                        <map>
+                            <entry key="intcol" value="true"/>
+                            <entry key="longcol" value="true"/>
+                        </map>
+                    </property>
+                </bean>
+                <bean class="org.apache.ignite.cache.QueryIndex">
+                    <property name="name" value="IDX_4"/>
+                    <property name="indexType">
+                        <util:constant static-field="org.apache.ignite.cache.QueryIndexType.SORTED"/>
+                    </property>
+                    <property name="fields">
+                        <map>
+                            <entry key="intcol" value="true"/>
+                            <entry key="longcol" value="false"/>
+                        </map>
+                    </property>
+                </bean>
             </list>
         </property>
     </bean>

http://git-wip-us.apache.org/repos/asf/ignite/blob/974467aa/modules/schema-import/src/test/java/org/apache/ignite/schema/test/parser/DbMetadataParserTest.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/parser/DbMetadataParserTest.java b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/parser/DbMetadataParserTest.java
index f918012..a550bfc 100644
--- a/modules/schema-import/src/test/java/org/apache/ignite/schema/test/parser/DbMetadataParserTest.java
+++ b/modules/schema-import/src/test/java/org/apache/ignite/schema/test/parser/DbMetadataParserTest.java
@@ -106,7 +106,7 @@ public class DbMetadataParserTest extends AbstractSchemaImportTest {
      *
      * @param type Type to check.
      */
-    public void checkSchemaHasFullDbName(PojoDescriptor type) {
+    private void checkSchemaHasFullDbName(PojoDescriptor type) {
         assertNotNull("The DB schema should have a non-null fullDbName", type.fullDbName());
     }
 
@@ -114,9 +114,9 @@ public class DbMetadataParserTest extends AbstractSchemaImportTest {
      * Test that metadata generated correctly.
      */
     public void testCheckMetadata() {
-        assertEquals("Metadata should contain 5 elements", 5, pojos.size());
+        assertEquals("Metadata should contain 5 elements", 5, all.size());
 
-        Iterator<PojoDescriptor> it = pojos.iterator();
+        Iterator<PojoDescriptor> it = all.iterator();
 
         PojoDescriptor schema = it.next();