From 30f7a56d37f5ebfe8a3d901ebca23811f054cd42 Mon Sep 17 00:00:00 2001 From: argius Date: Tue, 21 May 2013 21:17:49 +0900 Subject: [PATCH] fixed bug #26712 and SQL generators were refactored. --- .../argius/stew/ui/window/DatabaseInfoTree.java | 350 ++++++++++----------- 1 file changed, 175 insertions(+), 175 deletions(-) diff --git a/src/net/argius/stew/ui/window/DatabaseInfoTree.java b/src/net/argius/stew/ui/window/DatabaseInfoTree.java index 0131fd2..18b683a 100644 --- a/src/net/argius/stew/ui/window/DatabaseInfoTree.java +++ b/src/net/argius/stew/ui/window/DatabaseInfoTree.java @@ -88,13 +88,35 @@ final class DatabaseInfoTree extends JTree implements AnyActionListener, TextSea refresh((InfoNode)path.getLastPathComponent()); } } else if (ev.isAnyOf(generateWherePhrase)) { - generateWherePhrase(); + List columnNodes = new ArrayList(); + for (TreeNode node : getSelectionNodes()) { + if (node instanceof ColumnNode) { + columnNodes.add((ColumnNode)node); + } + } + final String phrase = generateEquivalentJoinClause(columnNodes); + if (phrase.length() > 0) { + insertTextIntoTextArea(phrase); + } } else if (ev.isAnyOf(generateSelectPhrase)) { - generateSelectPhrase(); - } else if (ev.isAnyOf(generateUpdateStatement)) { - generateUpdateStatement(); - } else if (ev.isAnyOf(generateInsertStatement)) { - generateInsertStatement(); + final String phrase = generateSelectPhrase(getSelectionNodes()); + if (phrase.length() > 0) { + insertTextIntoTextArea(phrase + " WHERE "); + } + } else if (ev.isAnyOf(generateUpdateStatement, generateInsertStatement)) { + final boolean isInsert = ev.isAnyOf(generateInsertStatement); + try { + final String phrase = generateUpdateOrInsertPhrase(getSelectionNodes(), isInsert); + if (phrase.length() > 0) { + if (isInsert) { + insertTextIntoTextArea(phrase); + } else { + insertTextIntoTextArea(phrase + " WHERE "); + } + } + } catch (IllegalArgumentException ex) { + showInformationMessageDialog(this, ex.getMessage(), ""); + } } else if (ev.isAnyOf(jumpToColumnByName)) { jumpToColumnByName(); } else if (ev.isAnyOf(toggleShowColumnNumber)) { @@ -106,7 +128,24 @@ final class DatabaseInfoTree extends JTree implements AnyActionListener, TextSea log.atExit("anyActionPerformed"); } - private void insertTextToTextArea(String s) { + @Override + public TreePath[] getSelectionPaths() { + TreePath[] a = super.getSelectionPaths(); + if (a == null) { + return new TreePath[0]; + } + return a; + } + + List getSelectionNodes() { + List a = new ArrayList(); + for (TreePath path : getSelectionPaths()) { + a.add((TreeNode)path.getLastPathComponent()); + } + return a; + } + + private void insertTextIntoTextArea(String s) { AnyActionEvent ev = new AnyActionEvent(this, ConsoleTextArea.ActionKey.insertText, s); anyActionListener.anyActionPerformed(ev); } @@ -153,107 +192,6 @@ final class DatabaseInfoTree extends JTree implements AnyActionListener, TextSea ClipboardHelper.setStrings(names); } - private void generateWherePhrase() { - List columns = collectColumnNode(getSelectionPaths()); - if (!columns.isEmpty()) { - insertTextToTextArea(generateEquivalentJoinClause(columns)); - } - } - - private void generateSelectPhrase() { - TreePath[] paths = getSelectionPaths(); - List columns = collectColumnNode(paths); - final String columnString; - final List tableNames; - if (columns.isEmpty()) { - List tableNodes = collectTableNode(paths); - if (tableNodes.isEmpty()) { - return; - } - tableNames = new ArrayList(); - for (final TableNode tableNode : tableNodes) { - tableNames.add(tableNode.getNodeFullName()); - } - columnString = "*"; - } else { - List columnNames = new ArrayList(); - tableNames = collectTableName(columns); - final boolean one = tableNames.size() == 1; - for (ColumnNode node : columns) { - columnNames.add(one ? node.getName() : node.getNodeFullName()); - } - columnString = join(", ", columnNames); - } - final String tableString = join(",", tableNames); - insertTextToTextArea(String.format("SELECT %s FROM %s WHERE ", columnString, tableString)); - } - - private void generateUpdateStatement() { - TreePath[] paths = getSelectionPaths(); - List columns = collectColumnNode(paths); - if (columns.isEmpty()) { - return; - } - List tableNamesOfColumns = collectTableName(columns); - if (collectTableNode(paths).size() > 1) { - showInformationMessageDialog(this, res.get("e.enables-select-just-1-table"), ""); - return; - } - List columnExpressions = new ArrayList(); - for (ColumnNode columnNode : columns) { - columnExpressions.add(columnNode.getName() + "=?"); - } - insertTextToTextArea(String.format("UPDATE %s SET %s WHERE ", - tableNamesOfColumns.get(0), - join(",", columnExpressions))); - } - - private void generateInsertStatement() { - TreePath[] paths = getSelectionPaths(); - List columns = collectColumnNode(paths); - final String tableName; - final int tableCount; - if (columns.isEmpty()) { - List tables = collectTableNode(paths); - if (tables.isEmpty()) { - return; - } - TableNode tableNode = tables.get(0); - if (tableNode.getChildCount() == 0) { - showInformationMessageDialog(this, - res.get("i.can-only-use-after-tablenode-expanded"), - ""); - return; - } - @SuppressWarnings("unchecked") - List list = Collections.list(tableNode.children()); - columns.addAll(list); - tableName = tableNode.getNodeFullName(); - tableCount = tables.size(); - } else { - List tableNames = collectTableName(columns); - tableCount = tableNames.size(); - if (tableCount == 0) { - return; - } - tableName = tableNames.get(0); - } - if (tableCount != 1) { - showInformationMessageDialog(this, res.get("e.enables-select-just-1-table"), ""); - return; - } - List columnNames = new ArrayList(); - for (ColumnNode node : columns) { - columnNames.add(node.getName()); - } - final int columnCount = columnNames.size(); - insertTextToTextArea(String.format("INSERT INTO %s (%s) VALUES (%s);%s", - tableName, - join(",", columnNames), - join(",", nCopies(columnCount, "?")), - join(",", nCopies(columnCount, "")))); - } - private void jumpToColumnByName() { TreePath[] paths = getSelectionPaths(); if (paths == null || paths.length == 0) { @@ -270,80 +208,149 @@ final class DatabaseInfoTree extends JTree implements AnyActionListener, TextSea } } - private static List collectColumnNode(TreePath[] paths) { - List a = new ArrayList(); - if (paths != null) { - for (TreePath path : paths) { - InfoNode node = (InfoNode)path.getLastPathComponent(); - if (node instanceof ColumnNode) { - ColumnNode columnNode = (ColumnNode)node; - a.add(columnNode); - } - } - } - return a; - } - - private static List collectTableNode(TreePath[] paths) { - List a = new ArrayList(); - if (paths != null) { - for (TreePath path : paths) { - InfoNode node = (InfoNode)path.getLastPathComponent(); - if (node instanceof TableNode) { - TableNode columnNode = (TableNode)node; - a.add(columnNode); - } - } - } - return a; - } - - private static List collectTableName(List columnNodes) { - Set tableNames = new LinkedHashSet(); - for (final ColumnNode node : columnNodes) { - tableNames.add(node.getTableNode().getNodeFullName()); - } - return new ArrayList(tableNames); - } - static String generateEquivalentJoinClause(List nodes) { if (nodes.isEmpty()) { return ""; } - ListMap tm = new ListMap(); - ListMap cm = new ListMap(); + Set tableNames = new LinkedHashSet(); + ListMap columnMap = new ListMap(); for (ColumnNode node : nodes) { - final String tableName = node.getTableNode().getName(); + final String tableName = node.getTableNode().getNodeFullName(); final String columnName = node.getName(); - tm.add(tableName, columnName); - cm.add(columnName, String.format("%s.%s", tableName, columnName)); + tableNames.add(tableName); + columnMap.add(columnName, String.format("%s.%s", tableName, columnName)); } + assert tableNames.size() >= 1; List expressions = new ArrayList(); - if (tm.size() == 1) { + if (tableNames.size() == 1) { for (ColumnNode node : nodes) { expressions.add(String.format("%s=?", node.getName())); } - } else { - final String tableName = nodes.get(0).getTableNode().getName(); - for (String c : tm.get(tableName)) { - expressions.add(String.format("%s.%s=?", tableName, c)); + } else { // size >= 2 + List expressions2 = new ArrayList(); + for (Entry> entry : columnMap.entrySet()) { + List a = entry.getValue(); + final int n = a.size(); + assert n >= 1; + expressions2.add(String.format("%s=?", a.get(0))); + if (n >= 2) { + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + expressions.add(String.format("%s=%s", a.get(i), a.get(j))); + } + } + } + } + expressions.addAll(expressions2); + } + return String.format("%s;", join(" AND ", expressions)); + } + + static String generateSelectPhrase(List nodes) { + Set tableNames = new LinkedHashSet(); + ListMap columnMap = new ListMap(); + for (TreeNode node : nodes) { + if (node instanceof TableNode) { + final String tableFullName = ((TableNode)node).getNodeFullName(); + tableNames.add(tableFullName); + columnMap.add(tableFullName); + } else if (node instanceof ColumnNode) { + ColumnNode cn = (ColumnNode)node; + final String tableFullName = cn.getTableNode().getNodeFullName(); + tableNames.add(tableFullName); + columnMap.add(tableFullName, cn.getNodeFullName()); + } + } + if (tableNames.isEmpty()) { + return ""; + } + List columnNames = new ArrayList(); + if (tableNames.size() == 1) { + List a = new ArrayList(); + for (TreeNode node : nodes) { + if (node instanceof ColumnNode) { + ColumnNode cn = (ColumnNode)node; + a.add(cn.getName()); + } } - for (Entry> entry : cm.entrySet()) { - if (!entry.getKey().equals(tableName) && entry.getValue().size() == 1) { - expressions.add(String.format("%s=?", entry.getValue().get(0))); + if (a.isEmpty()) { + columnNames.add("*"); + } else { + columnNames.addAll(a); + } + } else { // size >= 2 + for (Entry> entry : columnMap.entrySet()) { + final List columnsInTable = entry.getValue(); + if (columnsInTable.isEmpty()) { + columnNames.add(entry.getKey() + ".*"); + } else { + columnNames.addAll(columnsInTable); } } - for (Entry> entry : cm.entrySet()) { - Object[] a = entry.getValue().toArray(); - final int n = a.length; - for (int i = 0; i < n; i++) { - for (int j = i + 1; j < n; j++) { - expressions.add(String.format("%s=%s", a[i], a[j])); + } + return String.format("SELECT %s FROM %s", join(", ", columnNames), join(", ", tableNames)); + } + + static String generateUpdateOrInsertPhrase(List nodes, boolean isInsert) { + Set tableNames = new LinkedHashSet(); + ListMap columnMap = new ListMap(); + for (TreeNode node : nodes) { + if (node instanceof TableNode) { + final String tableFullName = ((TableNode)node).getNodeFullName(); + tableNames.add(tableFullName); + columnMap.add(tableFullName); + } else if (node instanceof ColumnNode) { + ColumnNode cn = (ColumnNode)node; + final String tableFullName = cn.getTableNode().getNodeFullName(); + tableNames.add(tableFullName); + columnMap.add(tableFullName, cn.getName()); + } + } + if (tableNames.isEmpty()) { + return ""; + } + if (tableNames.size() >= 2) { + throw new IllegalArgumentException(res.get("e.enables-select-just-1-table")); + } + final String tableName = join("", tableNames); + List columnsInTable = columnMap.get(tableName); + if (columnsInTable.isEmpty()) { + if (isInsert) { + List tableNodes = new ArrayList(); + for (TreeNode node : nodes) { + if (node instanceof TableNode) { + tableNodes.add((TableNode)node); + break; } } + TableNode tableNode = tableNodes.get(0); + if (tableNode.getChildCount() == 0) { + throw new IllegalArgumentException(res.get("i.can-only-use-after-tablenode-expanded")); + } + for (int i = 0, n = tableNode.getChildCount(); i < n; i++) { + ColumnNode child = (ColumnNode)tableNode.getChildAt(i); + columnsInTable.add(child.getName()); + } + } else { + return ""; } } - return join(" AND ", expressions) + ';'; + final String phrase; + if (isInsert) { + final int columnCount = columnsInTable.size(); + phrase = String.format("INSERT INTO %s (%s) VALUES (%s);%s", + tableName, + join(",", columnsInTable), + join(",", nCopies(columnCount, "?")), + join(",", nCopies(columnCount, ""))); + } else { + List columnExpressions = new ArrayList(); + for (final String columnName : columnsInTable) { + columnExpressions.add(columnName + "=?"); + } + phrase = String.format("UPDATE %s SET %s", tableName, join(", ", columnExpressions)); + } + return phrase; } // text-search @@ -602,15 +609,6 @@ final class DatabaseInfoTree extends JTree implements AnyActionListener, TextSea } } - @Override - public TreePath[] getSelectionPaths() { - TreePath[] a = super.getSelectionPaths(); - if (a == null) { - return new TreePath[0]; - } - return a; - } - // subclasses private static final class ListMap extends LinkedHashMap> { @@ -619,11 +617,13 @@ final class DatabaseInfoTree extends JTree implements AnyActionListener, TextSea // empty } - void add(String key, String value) { + void add(String key, String... values) { if (get(key) == null) { put(key, new ArrayList()); } - get(key).add(value); + for (String value : values) { + get(key).add(value); + } } } -- 2.11.0