Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-32 4f5523b11 -> 0ca0beb41


# IGNITE-32 WIP: SQL dialects + minor UI.


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

Branch: refs/heads/ignite-32
Commit: 0ca0beb41de04580088e4f91c0b51a626cd34c01
Parents: 4f5523b
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Mon Jan 19 14:46:44 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Mon Jan 19 14:46:44 2015 +0700

----------------------------------------------------------------------
 .../grid/cache/store/auto/AutoCacheStore.java   | 156 +++++++------------
 .../grid/cache/store/auto/PojoCacheStore.java   |   3 +-
 .../cache/store/auto/dialect/H2Dialect.java     |   7 +-
 .../cache/store/auto/dialect/JdbcDialect.java   |  33 +++-
 .../cache/store/auto/dialect/MySQLDialect.java  |  57 +++++++
 .../apache/ignite/schema/ui/SchemaLoadApp.java  |  10 +-
 .../store/auto/AutoCacheStoreSelfTest.java      |   3 -
 7 files changed, 156 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
index 6e5af2b..b76a9a5 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
@@ -87,6 +87,7 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
         /** Type metadata. */
         private final GridCacheQueryTypeMetadata typeMetadata;
 
+        /** Unique value fields. */
         private final Collection<GridCacheQueryTypeDescriptor> uniqValFields;
 
         /**
@@ -231,7 +232,7 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
     protected Map<Object, QueryCache> entryQtyCache;
 
     /** Database dialect. */
-    protected JdbcDialect dialect = new JdbcDialect();
+    protected JdbcDialect dialect;
 
     /** Max workers thread count. These threads are responsible for execute 
query. */
     protected int maxPoolSz = Runtime.getRuntime().availableProcessors();
@@ -240,6 +241,44 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
     protected int batchSz = DFLT_BATCH_SIZE;
 
     /**
+     * Perform dialect resolution.
+     *
+     * @return The resolved dialect.
+     * @throws IgniteCheckedException Indicates problems accessing the 
metadata.
+     */
+    protected JdbcDialect resolveDialect() throws IgniteCheckedException {
+        Connection conn = null;
+
+        String dbProductName = null;
+
+        try {
+            conn = openConnection(false);
+
+            dbProductName = conn.getMetaData().getDatabaseProductName();
+        }
+        catch (SQLException e) {
+            throw new IgniteCheckedException("Failed access to metadata for 
detect database dialect.", e);
+        }
+        finally {
+            closeConnection(conn);
+        }
+
+        if ("H2".equals(dbProductName) )
+            return new H2Dialect();
+
+        if ("MySQL".equals(dbProductName) )
+            return new MySQLDialect();
+
+//        if (dbProductName.startsWith("Microsoft SQL Server"))
+//            return new SQLServerDialect();
+//
+//        if ("Oracle".equals(dbProductName) )
+//            return new OracleDialect();
+
+        return new JdbcDialect();
+    }
+
+    /**
      * Initializes store.
      *
      * @throws IgniteCheckedException If failed to initialize.
@@ -253,6 +292,9 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
                 if (dataSrc == null && F.isEmpty(connUrl))
                     throw new IgniteCheckedException("Failed to initialize 
cache store (connection is not provided).");
 
+                if (dialect == null)
+                    dialect = resolveDialect();
+
                 try {
                     if (typeMetadata == null) {
                         if (typeMetadataPaths == null)
@@ -391,6 +433,19 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
     }
 
     /**
+     * Extract database column names from {@link GridCacheQueryTypeDescriptor}.
+     * @param dsc collection of {@link GridCacheQueryTypeDescriptor}.
+     */
+    protected static Collection<String> 
databaseColumns(Collection<GridCacheQueryTypeDescriptor> dsc) {
+        return F.transform(dsc, new C1<GridCacheQueryTypeDescriptor, String>() 
{
+            /** {@inheritDoc} */
+            @Override public String apply(GridCacheQueryTypeDescriptor desc) {
+                return desc.getDbName();
+            }
+        });
+    }
+
+    /**
      * Get field value from object.
      *
      * @param typeName Type name.
@@ -398,7 +453,8 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
      * @param obj Cache object.
      * @return Field value from object.
      */
-    @Nullable protected abstract Object extractField(String typeName, String 
fieldName, Object obj) throws IgniteCheckedException;
+    @Nullable protected abstract Object extractField(String typeName, String 
fieldName, Object obj)
+        throws IgniteCheckedException;
 
     /**
      * Construct object from query result.
@@ -413,102 +469,6 @@ public abstract class AutoCacheStore<K, V> implements 
GridCacheStore<K, V> {
         throws IgniteCheckedException;
 
     /**
-     * Concatenates elements using provided separator.
-     *
-     * @param elems Concatenated elements.
-     * @param f closure used for transform element.
-     * @param start Start string.
-     * @param sep Separator.
-     * @param end End string.
-     * @return Concatenated string.
-     */
-    private static <T> String mkString(Iterable<T> elems, C1<T, String> f, 
String start, String sep, String end) {
-        SB sb = new SB(start);
-
-        boolean first = true;
-
-        for (T elem : elems) {
-            if (!first)
-                sb.a(sep);
-
-            sb.a(f.apply(elem));
-
-            first = false;
-        }
-
-        return sb.a(end).toString();
-    }
-
-    /**
-     * Concatenates elements using provided separator.
-     *
-     * @param strs Concatenated string.
-     * @param start Start string.
-     * @param sep Delimiter.
-     * @param end End string.
-     * @return Concatenated string.
-     */
-    protected static String mkString(Iterable<String> strs, String start, 
String sep, String end) {
-        return mkString(strs, new C1<String, String>() {
-            @Override public String apply(String s) {
-                return s;
-            }
-        }, start, sep, end);
-    }
-
-    /**
-     * Concatenates strings using provided separator.
-     *
-     * @param strs Concatenated string.
-     * @param sep Separator.
-     * @return Concatenated string.
-     */
-    protected static String mkString(Iterable<String> strs, String sep) {
-        return mkString(strs, new C1<String, String>() {
-            @Override public String apply(String s) {
-                return s;
-            }
-        }, "", sep, "");
-    }
-
-    /**
-     * Concatenates elements using provided delimiter.
-     *
-     * @param str Repeated string.
-     * @param cnt Repeat count.
-     * @param start Start string.
-     * @param sep Separator.
-     * @param end End string.
-     */
-    protected static String repeat(String str, int cnt, String start, String 
sep, String end) {
-        SB sb = new SB(str.length() * cnt + sep.length() * (cnt - 1) + 
start.length() + end.length());
-
-        sb.a(start);
-
-        for (int i = 0; i < cnt; i++) {
-            if (i > 0)
-                sb.a(sep);
-
-            sb.a(str);
-        }
-
-        return sb.a(end).toString();
-    }
-
-    /**
-     * Extract database column names from {@link GridCacheQueryTypeDescriptor}.
-     * @param dsc collection of {@link GridCacheQueryTypeDescriptor}.
-     */
-    protected static Collection<String> 
databaseColumns(Collection<GridCacheQueryTypeDescriptor> dsc) {
-        return F.transform(dsc, new C1<GridCacheQueryTypeDescriptor, String>() 
{
-            /** {@inheritDoc} */
-            @Override public String apply(GridCacheQueryTypeDescriptor desc) {
-                return desc.getDbName();
-            }
-        });
-    }
-
-    /**
      * Extract type key from object.
      *
      * @param key Key object.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/PojoCacheStore.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/PojoCacheStore.java
 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/PojoCacheStore.java
index d3892c3..a504238 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/PojoCacheStore.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/PojoCacheStore.java
@@ -129,7 +129,8 @@ public class PojoCacheStore extends AutoCacheStore<Object, 
Object> {
         }
     }
 
-    Map<String, PojoMethodsCache> mtdsCache;
+    /** Methods cache. */
+    protected Map<String, PojoMethodsCache> mtdsCache;
 
     /** {@inheritDoc} */
     @Override protected void buildTypeCache() throws IgniteCheckedException {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
index c9c3710..5893e49 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
@@ -20,10 +20,15 @@ package org.gridgain.grid.cache.store.auto.dialect;
 import java.util.*;
 
 /**
- *
+ * A dialect compatible with the H2 database.
  */
 public class H2Dialect extends JdbcDialect {
     /** {@inheritDoc} */
+    @Override public boolean hasMerge() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
     @Override public String mergeQuery(String schema, String tblName, 
Collection<String> keyCols, Collection<String> uniqCols) {
         return String.format("MERGE INTO %s (%s) KEY (%s) VALUES(%s)", 
tblName, mkString(uniqCols, ","),
             mkString(keyCols, ","), repeat("?", uniqCols.size(), "",", ",""));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/JdbcDialect.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/JdbcDialect.java
 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/JdbcDialect.java
index 3f65971..915d2f1 100644
--- 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/JdbcDialect.java
+++ 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/JdbcDialect.java
@@ -23,7 +23,7 @@ import org.gridgain.grid.util.typedef.internal.*;
 import java.util.*;
 
 /**
- *
+ * Represents a dialect of SQL implemented by a particular RDBMS.
  */
 public class JdbcDialect {
     /** Default max query parameters count. */
@@ -115,7 +115,13 @@ public class JdbcDialect {
         return sb.a(end).toString();
     }
 
-    protected static String where(Collection<String> keyCols, int keyCnt) {
+    /**
+     * Construct where part of query.
+     *
+     * @param keyCols Database key columns.
+     * @param keyCnt Key count.
+     */
+    private static String where(Collection<String> keyCols, int keyCnt) {
         SB sb = new SB();
 
         if (keyCols.size() == 1) {
@@ -144,7 +150,7 @@ public class JdbcDialect {
      *
      * @param schema Database schema name.
      * @param tblName Database table name.
-     * @param uniqCols Database unique columns.
+     * @param uniqCols Database unique value columns.
      * @return Load cache query.
      */
     public String loadCacheQuery(String schema, String tblName, 
Iterable<String> uniqCols) {
@@ -170,6 +176,14 @@ public class JdbcDialect {
         return  String.format("SELECT %s FROM %s.%s WHERE %s", 
mkString(valCols, ","), schema, tblName, params);
     }
 
+    /**
+     * Construct insert query.
+     *
+     * @param schema Database schema name.
+     * @param tblName Database table name.
+     * @param keyCols Database key columns.
+     * @param valCols Database value columns.
+     */
     public String insertQuery(String schema, String tblName, 
Collection<String> keyCols, Collection<String> valCols) {
         Collection<String> cols = F.concat(false, keyCols, valCols);
 
@@ -177,7 +191,15 @@ public class JdbcDialect {
             repeat("?", cols.size(), "", ",", ""));
     }
 
-    public String updateQuery(String schema, String tblName, 
Collection<String> keyCols, final Iterable<String> valCols) {
+    /**
+     * Construct update query.
+     *
+     * @param schema Database schema name.
+     * @param tblName Database table name.
+     * @param keyCols Database key columns.
+     * @param valCols Database value columns.
+     */
+    public String updateQuery(String schema, String tblName, 
Collection<String> keyCols, Iterable<String> valCols) {
         String params = mkString(valCols, new C1<String, String>() {
             @Override public String apply(String s) {
                 return s + "=?";
@@ -196,10 +218,11 @@ public class JdbcDialect {
 
     /**
      * Construct merge query.
+     *
      * @param schema Database schema name.
      * @param tblName Database table name.
      * @param keyCols Database key columns.
-     * @param uniqCols Database unique columns.
+     * @param uniqCols Database unique value columns.
      * @return Put query.
      */
     public String mergeQuery(String schema, String tblName, Collection<String> 
keyCols, Collection<String> uniqCols) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
new file mode 100644
index 0000000..115574e
--- /dev/null
+++ 
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+/* @java.file.header */
+
+/*  _________        _____ __________________        _____
+ *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
+ *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
+ *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
+ *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
+ */
+
+package org.gridgain.grid.cache.store.auto.dialect;
+
+import org.gridgain.grid.util.typedef.*;
+
+import java.util.*;
+
+/**
+ * A dialect compatible with the MySQL database.
+ */
+public class MySQLDialect extends JdbcDialect {
+    /** {@inheritDoc} */
+    @Override public boolean hasMerge() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String mergeQuery(String schema, String tblName, 
Collection<String> keyCols,
+        Collection<String> uniqCols) {
+
+        Collection<String> cols = F.concat(false, keyCols, uniqCols);
+
+        String updPart = mkString(uniqCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("%s = VALUES(%s)", col, col);
+            }
+        }, "", ", ", "");
+
+        return String.format("INSERT INTO %s.%s (%s) VALUES (%s) ON DUPLICATE 
KEY UPDATE %s", schema, tblName,
+            mkString(cols, ", "), repeat("?", cols.size(), "", ",", ""), 
updPart);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
----------------------------------------------------------------------
diff --git 
a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
 
b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
index 997afea..2b011ab 100644
--- 
a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
+++ 
b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
@@ -765,15 +765,15 @@ public class SchemaLoadApp extends Application {
         genPnl.add(splitPane(tree, borderPane(null, tbl, null, null, vBox(10, 
upBtn, downBtn)), 0.6), 3);
 
         final GridPaneEx keyValPnl = paneEx(0, 0, 0, 0);
-        keyValPnl.addColumn();
         keyValPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS);
         keyValPnl.addColumn();
         keyValPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS);
         keyValPnl.addColumn();
 
-        keyClsTf = keyValPnl.addLabeled("Key class:", textField("Key class 
name"));
+        genPnl.add(new Label("Key class:"));
+        keyClsTf = keyValPnl.add(textField("Key class name"));
 
-        valClsTf = keyValPnl.addLabeled("Value class:", textField("Value class 
name"));
+        valClsTf = keyValPnl.addLabeled("  Value class:", textField("Value 
class name"));
 
         keyValPnl.add(button("Apply", "Change key and value class names", new 
EventHandler<ActionEvent>() {
             @Override public void handle(ActionEvent evt) {
@@ -823,7 +823,7 @@ public class SchemaLoadApp extends Application {
 
         keyValPnl.setDisable(true);
 
-        genPnl.add(keyValPnl, 3);
+        genPnl.add(keyValPnl, 2);
 
         pkgTf = genPnl.addLabeled("Package:", textField("Package that will be 
used for POJOs generation"), 2);
 
@@ -938,7 +938,7 @@ public class SchemaLoadApp extends Application {
                     }
                 }),
             revertBtn,
-            button("Revert All", "Revert changes to Ignite names for all 
tables", new EventHandler<ActionEvent>() {
+            button("Revert All", "Revert changes to Ignite names for all 
selected tables", new EventHandler<ActionEvent>() {
                 /** {@inheritDoc} */
                 @Override public void handle(ActionEvent evt) {
                     Collection<PojoDescriptor> selItems = selectedItems();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/0ca0beb4/modules/schema-load/src/test/java/org/gridgain/grid/cache/store/auto/AutoCacheStoreSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/schema-load/src/test/java/org/gridgain/grid/cache/store/auto/AutoCacheStoreSelfTest.java
 
b/modules/schema-load/src/test/java/org/gridgain/grid/cache/store/auto/AutoCacheStoreSelfTest.java
index 0fd4e7e..0689ce3 100644
--- 
a/modules/schema-load/src/test/java/org/gridgain/grid/cache/store/auto/AutoCacheStoreSelfTest.java
+++ 
b/modules/schema-load/src/test/java/org/gridgain/grid/cache/store/auto/AutoCacheStoreSelfTest.java
@@ -17,7 +17,6 @@
 
 package org.gridgain.grid.cache.store.auto;
 
-import org.gridgain.grid.cache.store.auto.dialect.*;
 import org.gridgain.grid.util.typedef.*;
 
 /**
@@ -36,8 +35,6 @@ public class AutoCacheStoreSelfTest extends 
AbstractAutoCacheStoreSelfTest {
     @Override protected PojoCacheStore store() {
         PojoCacheStore store = new PojoCacheStore();
 
-        store.setDialect(new H2Dialect());
-
         store.setConnUrl("jdbc:h2:mem:test");
         store.setUser("sa");
         store.setPassword("");

Reply via email to