# IGNITE-411 Fixed Oracle dialect.

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

Branch: refs/heads/ignite-185
Commit: aba2b55b0f8f076b097babdff137d0d55ab5e8d5
Parents: ae413fb
Author: AKuznetsov <akuznet...@gridgain.com>
Authored: Thu Mar 5 17:35:44 2015 +0700
Committer: AKuznetsov <akuznet...@gridgain.com>
Committed: Thu Mar 5 17:35:44 2015 +0700

----------------------------------------------------------------------
 .../parser/dialect/OracleMetadataDialect.java   | 66 +++++++++++++-------
 .../org/apache/ignite/schema/ui/MessageBox.java |  7 +++
 2 files changed, 52 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/aba2b55b/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
----------------------------------------------------------------------
diff --git 
a/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
 
b/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
index 307d608..6b16042 100644
--- 
a/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
+++ 
b/modules/schema-load/src/main/java/org/apache/ignite/schema/parser/dialect/OracleMetadataDialect.java
@@ -42,10 +42,11 @@ public class OracleMetadataDialect extends 
DatabaseMetadataDialect {
         " WHERE a.owner = ? and a.table_name = ? AND a.constraint_type = 'P'";
 
     /** SQL to get indexes metadata. */
-    private static final String SQL_INDEXES = "select index_name, column_name, 
descend" +
-        " FROM all_ind_columns" +
-        " WHERE index_owner = ? and table_name = ?" +
-        " ORDER BY index_name, column_position";
+    private static final String SQL_INDEXES = "select i.index_name, 
u.column_expression, i.column_name, i.descend" +
+        " FROM all_ind_columns i" +
+        " LEFT JOIN user_ind_expressions u on u.index_name = i.index_name and 
i.table_name = u.table_name" +
+        " WHERE i.index_owner = ? and i.table_name = ?" +
+        " ORDER BY i.index_name, i.column_position";
 
     /** Owner index. */
     private static final int OWNER_IDX = 1;
@@ -71,11 +72,14 @@ public class OracleMetadataDialect extends 
DatabaseMetadataDialect {
     /** Index name index. */
     private static final int IDX_NAME_IDX = 1;
 
+    /** Index name index. */
+    private static final int IDX_EXPR_IDX = 2;
+
     /** Index column name index. */
-    private static final int IDX_COL_NAME_IDX = 2;
+    private static final int IDX_COL_NAME_IDX = 3;
 
     /** Index column sort order index. */
-    private static final int IDX_COL_DESCEND_IDX = 3;
+    private static final int IDX_COL_DESCEND_IDX = 4;
 
     /**
      * @param rs Result set with column type metadata from Oracle database.
@@ -155,10 +159,20 @@ public class OracleMetadataDialect extends 
DatabaseMetadataDialect {
         return OTHER;
     }
 
+    /**
+     * Retrieve primary key columns.
+     *
+     * @param stmt Prepared SQL statement to execute.
+     * @param owner DB owner.
+     * @param tbl Table name.
+     * @return Primary key columns.
+     * @throws SQLException If failed to retrieve primary key columns.
+     */
     private Set<String> primaryKeys(PreparedStatement stmt, String owner, 
String tbl) throws SQLException {
         Set<String> pkCols = new HashSet<>();
 
-        stmt.setString(1, tbl);
+        stmt.setString(1, owner);
+        stmt.setString(2, tbl);
 
         try (ResultSet pkRs = stmt.executeQuery()) {
             while(pkRs.next())
@@ -168,6 +182,15 @@ public class OracleMetadataDialect extends 
DatabaseMetadataDialect {
         return pkCols;
     }
 
+    /**
+     * Retrieve index columns.
+     *
+     * @param stmt Prepared SQL statement to execute.
+     * @param owner DB owner.
+     * @param tbl Table name.
+     * @return Index columns.
+     * @throws SQLException If failed to retrieve indexe columns.
+     */
     private Map<String, Map<String, Boolean>> indexes(PreparedStatement stmt, 
String owner, String tbl)
         throws SQLException {
         Map<String, Map<String, Boolean>> idxs = new LinkedHashMap<>();
@@ -187,7 +210,11 @@ public class OracleMetadataDialect extends 
DatabaseMetadataDialect {
                     idxs.put(idxName, idx);
                 }
 
-                idx.put(idxsRs.getString(IDX_COL_NAME_IDX), 
"DESC".equals(idxsRs.getString(IDX_COL_DESCEND_IDX)));
+                String expr = idxsRs.getString(IDX_EXPR_IDX);
+
+                String col = expr == null ? idxsRs.getString(IDX_COL_NAME_IDX) 
: expr.replaceAll("\"", "");
+
+                idx.put(col, 
"DESC".equals(idxsRs.getString(IDX_COL_DESCEND_IDX)));
             }
         }
 
@@ -217,28 +244,25 @@ public class OracleMetadataDialect extends 
DatabaseMetadataDialect {
                 String prevSchema = "";
                 String prevTbl = "";
 
+                boolean first = true;
+
                 while (colsRs.next()) {
                     String owner = colsRs.getString(OWNER_IDX);
                     String tbl = colsRs.getString(TBL_NAME_IDX);
 
-                    if (!prevSchema.equals(owner) || !prevTbl.equals(tbl)) {
-                        pkCols = primaryKeys(pkStmt, owner, tbl);
+                    boolean changed = !owner.equals(prevSchema) || 
!tbl.equals(prevTbl);
 
-                        idxs = indexes(idxStmt, owner, tbl);
-                    }
+                    if (changed) {
+                        if (first)
+                            first = false;
+                        else
+                            tbls.add(table(prevSchema, prevTbl, cols, idxs));
 
-                    if (prevSchema.isEmpty()) {
                         prevSchema = owner;
                         prevTbl = tbl;
-                    }
-
-                    if (!owner.equals(prevSchema) || !tbl.equals(prevTbl)) {
-                        tbls.add(new DbTable(prevSchema, prevTbl, cols, null, 
null, null)); // TODO !!!
-
-                        prevSchema = owner;
-                        prevTbl = tbl;
-
                         cols = new ArrayList<>();
+                        pkCols = primaryKeys(pkStmt, owner, tbl);
+                        idxs = indexes(idxStmt, owner, tbl);
                     }
 
                     String colName = colsRs.getString(COL_NAME_IDX);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/aba2b55b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
----------------------------------------------------------------------
diff --git 
a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java 
b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
index 07cbf05..cf6a705 100644
--- 
a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
+++ 
b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
@@ -23,12 +23,17 @@ import javafx.scene.control.*;
 import javafx.scene.layout.*;
 import javafx.stage.*;
 
+import java.util.logging.*;
+
 import static org.apache.ignite.schema.ui.Controls.*;
 
 /**
  * Message box functionality.
  */
 public class MessageBox extends ModalDialog {
+    /** Logger. */
+    private static final Logger log = 
Logger.getLogger(MessageBox.class.getName());
+
     /** Message box type. */
     private enum MessageType {
         /** Information. */
@@ -232,6 +237,8 @@ public class MessageBox extends ModalDialog {
      * @param e Optional exception to show.
      */
     public static void errorDialog(Stage owner, String msg, Throwable e) {
+        log.log(Level.SEVERE, msg, e);
+
         String exMsg = e != null ? (e.getMessage() != null ? e.getMessage() : 
e.getClass().getName()) : null;
 
         showDialog(owner, MessageType.ERROR, exMsg != null ? msg + "\n" + 
exMsg : msg, false);

Reply via email to