# IGNITE-330 Added code generation for query fields. Remember choice -> Apply to all.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/fac29f0e Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/fac29f0e Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/fac29f0e Branch: refs/heads/ignite-45-ipc-debug Commit: fac29f0e6e28c5b6f0d6c15643963a4165907a54 Parents: 90b6303 Author: AKuznetsov <akuznet...@gridgain.com> Authored: Tue Mar 24 17:07:56 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Tue Mar 24 17:07:56 2015 +0700 ---------------------------------------------------------------------- .../ignite/schema/generator/CodeGenerator.java | 125 +++++++++++++++++-- .../ignite/schema/generator/XmlGenerator.java | 12 +- .../apache/ignite/schema/model/IndexItem.java | 16 +-- .../ignite/schema/model/PojoDescriptor.java | 16 +-- .../ignite/schema/ui/ConfirmCallable.java | 2 +- .../org/apache/ignite/schema/ui/MessageBox.java | 21 ++-- 6 files changed, 148 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fac29f0e/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 07ab422..861c6fd 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 @@ -109,13 +109,19 @@ public class CodeGenerator { } /** + * @param type Full type name. + * @return Field java type name. + */ + private static String javaTypeName(String type) { + return type.startsWith("java.lang.") ? type.substring(10) : type; + } + + /** * @param field POJO field descriptor. * @return Field java type name. */ private static String javaTypeName(PojoField field) { - String javaTypeName = field.javaTypeName(); - - return javaTypeName.startsWith("java.lang.") ? javaTypeName.substring(10) : javaTypeName; + return javaTypeName(field.javaTypeName()); } /** @@ -478,6 +484,32 @@ public class CodeGenerator { } /** + * Add query fields. + * + * @param src Source code lines. + * @param fields List of fields to add. + * @param varName Variable name to generate. + * @param mtdName Method name to generate. + * @param comment Commentary text. + * @param first {@code true} if varable should be declared. + */ + private static void addQueryFields(Collection<String> src, Collection<PojoField> fields, String varName, + String mtdName, String comment, boolean first) { + if (!fields.isEmpty()) { + add2(src, comment); + add2(src, (first ? "Map<String, Class<?>> " : "") + varName + " = new LinkedHashMap<>();"); + add0(src, ""); + + for (PojoField field : fields) + add2(src, varName + ".put(\"" + field.javaName() + "\", " + javaTypeName(field) + ".class);"); + + add0(src, ""); + add2(src, "type." + mtdName + "(" + varName + ");"); + add0(src, ""); + } + } + + /** * Generate java snippet for cache configuration with JDBC store and types metadata. * * @param pojos POJO descriptors. @@ -506,14 +538,15 @@ public class CodeGenerator { Collection<String> src = new ArrayList<>(256); header(src, pkg, "org.apache.ignite.cache.*;org.apache.ignite.cache.store.*;" + - "org.apache.ignite.configuration.*;;javax.cache.configuration.*;java.sql.*;java.util.*", + "org.apache.ignite.configuration.*;org.apache.ignite.lang.*;;" + + "javax.cache.configuration.*;java.sql.*;java.util.*", "CacheConfig", "CacheConfig"); add1(src, "/**"); - add1(src, "/* Configure cache."); - add1(src, "/*"); - add1(src, "/* @param name Cache name."); - add1(src, "/* @param storeFactory Cache store factory."); + add1(src, "* Configure cache."); + add1(src, "*"); + add1(src, "* @param name Cache name."); + add1(src, "* @param storeFactory Cache store factory."); add1(src, "*/"); add1(src, " public static CacheConfiguration cache(String name, Factory<CacheStore> storeFactory) {"); add2(src, "if (storeFactory == null)"); @@ -537,32 +570,100 @@ public class CodeGenerator { add2(src, "// " + tbl + "."); add2(src, (first ? "CacheTypeMetadata " : "") + "type = new CacheTypeMetadata();"); + add0(src, ""); + add2(src, "meta.add(type);"); + add0(src, ""); + + // Database info. add2(src, "type.setDatabaseSchema(\"" + pojo.schema() + "\");"); add2(src, "type.setDatabaseTable(\"" + tbl + "\");"); + + // Java info. add2(src, "type.setKeyType(" + pojo.keyClassName() + ".class.getName());"); add2(src, "type.setValueType(" + pojo.valueClassName() + ".class.getName());"); add0(src, ""); - add2(src, "meta.add(type);"); - add0(src, ""); - + // Key fields. add2(src, "// Key fields for " + tbl + "."); add2(src, (first ? "Collection<CacheTypeFieldMetadata> " : "") + "keys = new ArrayList<>();"); addFields(src, "keys", pojo.keyFields()); add2(src, "type.setKeyFields(keys);"); add0(src, ""); + // Value fields. add2(src, "// Value fields for " + tbl + "."); add2(src, (first ? "Collection<CacheTypeFieldMetadata> " : "") + "vals = new ArrayList<>();"); addFields(src, "vals", pojo.valueFields(includeKeys)); add2(src, "type.setValueFields(vals);"); add0(src, ""); + // Query fields. + addQueryFields(src, pojo.fields(), "qryFlds", "setQueryFields", "// Query fields for " + tbl + ".", first); + + // Ascending fields. + addQueryFields(src, pojo.ascendingFields(), "ascFlds", "setAscendingFields", + "// Ascending fields for " + tbl + ".", first); + + // Descending fields. + addQueryFields(src, pojo.descendingFields(), "descFlds", "setDescendingFields", + "// Descending fields for " + tbl + ".", first); + + // Groups. + Map<String, Map<String, IndexItem>> groups = pojo.groups(); + + if (!groups.isEmpty()) { + add2(src, "// Groups for " + tbl + "."); + add2(src, (first ? "Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> " : "") + + " grps = new LinkedHashMap<>();"); + add0(src, ""); + + for (Map.Entry<String, Map<String, IndexItem>> group : groups.entrySet()) { + add2(src, (first ? "LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> " : "") + + "grpItems = new LinkedHashMap<>();"); + add0(src, ""); + + for (Map.Entry<String, IndexItem> grpItem : group.getValue().entrySet()) { + IndexItem idxCol = grpItem.getValue(); + + add2(src, "grpItems.put(\"" + grpItem.getKey() + "\", " + + "new IgniteBiTuple<>(" + javaTypeName(idxCol.type()) + ".class, " + + idxCol.descending() + "));"); + } + + add0(src, ""); + add2(src, "grps.put(\"" + group.getKey() + "\", grpItems);"); + } + + add2(src, "ccfg.setTypeMetadata(meta);"); + add0(src, ""); + } + first = false; } - add2(src, "ccfg.setTypeMetadata(meta);"); + add2(src, "type.setGroups(grps);"); add0(src, ""); + + // Generate Indexed types. + StringBuilder indexedTypes = new StringBuilder(pojos.size() * 15); + + first = true; + + for (PojoDescriptor pojo : pojos) { + if (!first) + indexedTypes.append(", "); + + indexedTypes + .append(pojo.keyClassName()).append(".class, ") + .append(pojo.valueClassName()).append(".class"); + + first = false; + } + + add2(src, "// Indexed types."); + add2(src, "ccfg.setIndexedTypes(" + indexedTypes + ");"); + add0(src, ""); + add2(src, "return ccfg;"); add1(src, "}"); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fac29f0e/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/XmlGenerator.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/XmlGenerator.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/XmlGenerator.java index 85b9275..6ab04dd 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/XmlGenerator.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/generator/XmlGenerator.java @@ -205,17 +205,17 @@ public class XmlGenerator { Element val1 = addElement(doc, entry1, "map"); - Map<String, IndexItem> fields = group.getValue(); + Map<String, IndexItem> grpItems = group.getValue(); - for (Map.Entry<String, IndexItem> field : fields.entrySet()) { - Element entry2 = addElement(doc, val1, "entry", "key", field.getKey()); + for (Map.Entry<String, IndexItem> grpItem : grpItems.entrySet()) { + Element entry2 = addElement(doc, val1, "entry", "key", grpItem.getKey()); Element val2 = addBean(doc, entry2, IgniteBiTuple.class); - IndexItem idx = field.getValue(); + IndexItem idxCol = grpItem.getValue(); - addElement(doc, val2, "constructor-arg", null, null, "value", idx.name()); - addElement(doc, val2, "constructor-arg", null, null, "value", String.valueOf(idx.descending())); + addElement(doc, val2, "constructor-arg", null, null, "value", idxCol.type()); + addElement(doc, val2, "constructor-arg", null, null, "value", String.valueOf(idxCol.descending())); } } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fac29f0e/modules/schema-import/src/main/java/org/apache/ignite/schema/model/IndexItem.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/model/IndexItem.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/model/IndexItem.java index 1a0868d..4e00260 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/model/IndexItem.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/model/IndexItem.java @@ -21,8 +21,8 @@ package org.apache.ignite.schema.model; * Index item descriptor. */ public class IndexItem { - /** Column name. */ - private final String name; + /** Column type. */ + private final String type; /** Sort direction. */ private final Boolean desc; @@ -30,19 +30,19 @@ public class IndexItem { /** * Constructor. * - * @param name Column name. + * @param type Column type. * @param desc Sort direction. */ - public IndexItem(String name, Boolean desc) { - this.name = name; + public IndexItem(String type, Boolean desc) { + this.type = type; this.desc = desc; } /** - * @return Column name. + * @return Column type. */ - public String name() { - return name; + public String type() { + return type; } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fac29f0e/modules/schema-import/src/main/java/org/apache/ignite/schema/model/PojoDescriptor.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/model/PojoDescriptor.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/model/PojoDescriptor.java index 3807f4f..4ef8b00 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/model/PojoDescriptor.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/model/PojoDescriptor.java @@ -311,18 +311,20 @@ public class PojoDescriptor { Map<String, Map<String, IndexItem>> groups = new LinkedHashMap<>(idxs.size()); for (Map.Entry<String, Map<String, Boolean>> idx : idxs.entrySet()) { - String idxName = idx.getKey(); - Map<String, Boolean> idxCols = idx.getValue(); - Map<String, IndexItem> grp = new LinkedHashMap<>(); + if (idxCols.size() > 1) { + String idxName = idx.getKey(); + + Map<String, IndexItem> grp = new LinkedHashMap<>(); - groups.put(idxName, grp); + groups.put(idxName, grp); - for (Map.Entry<String, Boolean> idxCol : idxCols.entrySet()) { - PojoField fld = fieldsMap.get(idxCol.getKey()); + for (Map.Entry<String, Boolean> idxCol : idxCols.entrySet()) { + PojoField fld = fieldsMap.get(idxCol.getKey()); - grp.put(fld.javaName(), new IndexItem(fld.javaTypeName(), idxCol.getValue())); + grp.put(fld.javaName(), new IndexItem(fld.javaTypeName(), idxCol.getValue())); + } } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fac29f0e/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java index 3990496..8321d96 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java @@ -51,7 +51,7 @@ public class ConfirmCallable implements Callable<MessageBox.Result> { /** {@inheritDoc} */ @Override public MessageBox.Result call() throws Exception { - choice = MessageBox.confirmRememberChoiceDialog(owner, String.format(template, msg)); + choice = MessageBox.applyToAllChoiceDialog(owner, String.format(template, msg)); return choice; } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/fac29f0e/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/MessageBox.java ---------------------------------------------------------------------- diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/MessageBox.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/MessageBox.java index 378606c..7daf69f 100644 --- a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/MessageBox.java +++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/MessageBox.java @@ -72,9 +72,9 @@ public class MessageBox extends ModalDialog { * @param owner Owner window. * @param type Message box type. * @param msg Message to show. - * @param rememberChoice If {@code true} then add "Remember choice" check box. + * @param applyToAll {@code true} if "Apply to all" check box should be displayed. */ - private MessageBox(Stage owner, MessageType type, String msg, final boolean rememberChoice) { + private MessageBox(Stage owner, MessageType type, String msg, final boolean applyToAll) { super(owner, 480, 180); String title; @@ -136,11 +136,11 @@ public class MessageBox extends ModalDialog { } }); - final CheckBox rememberChoiceCh = checkBox("Remember choice", "", false); + final CheckBox applyToAllCh = checkBox("Apply to all", "", false); - if (rememberChoice) { + if (applyToAll) { contentPnl.skip(1); - contentPnl.add(rememberChoiceCh); + contentPnl.add(applyToAllCh); } HBox btns = hBox(10, true); @@ -152,14 +152,14 @@ public class MessageBox extends ModalDialog { btns.getChildren().addAll( button("Yes", "Approve the request", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { - res = rememberChoice && rememberChoiceCh.isSelected() ? Result.YES_TO_ALL : Result.YES; + res = applyToAll && applyToAllCh.isSelected() ? Result.YES_TO_ALL : Result.YES; close(); } }), button("No", "Reject the request", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { - res = rememberChoice && rememberChoiceCh.isSelected() ? Result.NO_TO_ALL : Result.NO; + res = applyToAll && applyToAllCh.isSelected() ? Result.NO_TO_ALL : Result.NO; close(); } @@ -191,10 +191,11 @@ public class MessageBox extends ModalDialog { * @param owner Owner window. * @param type Message box type. * @param msg Message to show. + * @param applyToAll {@code true} if "Apply to all" check box should be displayed. * @return Option selected by the user. */ - private static Result showDialog(Stage owner, MessageType type, String msg, boolean rememberChoice) { - MessageBox dlg = new MessageBox(owner, type, msg, rememberChoice); + private static Result showDialog(Stage owner, MessageType type, String msg, boolean applyToAll) { + MessageBox dlg = new MessageBox(owner, type, msg, applyToAll); dlg.showModal(); @@ -219,7 +220,7 @@ public class MessageBox extends ModalDialog { * @param msg Message to show. * @return User confirmation result. */ - public static Result confirmRememberChoiceDialog(Stage owner, String msg) { + public static Result applyToAllChoiceDialog(Stage owner, String msg) { return showDialog(owner, MessageType.CANCELLABLE_CONFIRM, msg, true); }