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("");