Changeset: 8353929359d6 for monetdb-java
URL: http://dev.monetdb.org/hg/monetdb-java?cmd=changeset;node=8353929359d6
Added Files:
        src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableCursor.java
Removed Files:
        src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableIterator.java
Modified Files:
        src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java
        src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTable.java
        src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTableColumn.java
        src/main/java/nl/cwi/monetdb/embedded/tables/RowIterator.java
        src/main/java/nl/cwi/monetdb/embedded/tables/RowRemover.java
        src/main/java/nl/cwi/monetdb/jdbc/MonetConnection.java
Branch: embedded
Log Message:

Starting to test Java to BAT conversion. Let the debugging games begin!


diffs (truncated from 407 to 300 lines):

diff --git 
a/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java 
b/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java
--- a/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java
+++ b/src/main/java/nl/cwi/monetdb/embedded/mapping/MonetDBToJavaMapping.java
@@ -25,6 +25,7 @@ import java.util.UUID;
  */
 public enum MonetDBToJavaMapping {
 
+    /* PLEASE Don't change these enum values order!! */
     Boolean(Boolean.class), Char(String.class), Varchar(String.class), 
Clob(String.class), Oid(Long.class),
     Tinyint(Byte.class), Smallint(Short.class), Int(Integer.class), 
Wrd(Long.class), Bigint(Long.class),
     Hugeint(BigInteger.class), Decimal(BigDecimal.class), Real(Float.class), 
Double(Double.class),
diff --git 
a/src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableIterator.java 
b/src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableCursor.java
rename from 
src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableIterator.java
rename to src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableCursor.java
--- a/src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableIterator.java
+++ b/src/main/java/nl/cwi/monetdb/embedded/tables/IMonetDBTableCursor.java
@@ -5,7 +5,7 @@ package nl.cwi.monetdb.embedded.tables;
  *
  * @author <a href="mailto:[email protected]";>Pedro 
Ferreira</a>
  */
-public interface IMonetDBTableIterator extends IMonetDBTableBaseIterator {
+public interface IMonetDBTableCursor extends IMonetDBTableBaseIterator {
 
     /**
      * The business logic for the iterator.
diff --git a/src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTable.java 
b/src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTable.java
--- a/src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTable.java
+++ b/src/main/java/nl/cwi/monetdb/embedded/tables/MonetDBTable.java
@@ -4,6 +4,7 @@ import nl.cwi.monetdb.embedded.env.Monet
 import nl.cwi.monetdb.embedded.mapping.AbstractColumn;
 import nl.cwi.monetdb.embedded.mapping.AbstractResultTable;
 import nl.cwi.monetdb.embedded.env.MonetDBEmbeddedConnection;
+import nl.cwi.monetdb.embedded.mapping.MonetDBRow;
 import nl.cwi.monetdb.embedded.resultset.QueryResultSet;
 import nl.cwi.monetdb.embedded.resultset.QueryResultSetColumn;
 
@@ -35,6 +36,11 @@ public class MonetDBTable extends Abstra
      */
     private long connectionPointer;
 
+    private final int[] columnsJavaIndexes;
+    private final int[] columnsMonetDBIndexes;
+    private final String[] columnsNames;
+    private final Class[] columnsClasses;
+
     public MonetDBTable(MonetDBEmbeddedConnection connection, long 
connectionPointer, String schemaName,
                         String tableName, MonetDBTableColumn<?>[] columns) {
         super(connection);
@@ -42,6 +48,18 @@ public class MonetDBTable extends Abstra
         this.schemaName = schemaName;
         this.tableName = tableName;
         this.columns = columns;
+        this.columnsJavaIndexes = new int[columns.length];
+        this.columnsMonetDBIndexes = new int[columns.length];
+        this.columnsNames = new String[columns.length];
+        this.columnsClasses = new Class[columns.length];
+        int i = 0;
+        for(MonetDBTableColumn col : this.columns) {
+            this.columnsJavaIndexes[i] = col.getInternalMonetDBTypeIndex();
+            this.columnsMonetDBIndexes[i] = col.getMapping().ordinal();
+            this.columnsNames[i] = col.getColumnName();
+            this.columnsClasses[i] = col.getMapping().getJavaClass();
+            i++;
+        }
     }
 
     @Override
@@ -114,32 +132,69 @@ public class MonetDBTable extends Abstra
     }
 
     /**
-     * Iterate over the table using a {@link 
nl.cwi.monetdb.embedded.tables.IMonetDBTableIterator} instance.
+     * Private method to check the limits of iteration.
      *
-     * @param iterator The iterator with the business logic
+     * @param iterator The iterator to check
+     * @return An integer array with the limits fixed
+     */
+    private int[] checkIterator(IMonetDBTableBaseIterator iterator) {
+        int[] res = {iterator.getFirstRowToIterate(), 
iterator.getLastRowToIterate()};
+        if(res[0] == res[1]) {
+            throw new ArrayIndexOutOfBoundsException("Iterating over 0 rows?");
+        }
+        if(res[1] < res[0]) {
+            int aux = res[0];
+            res[0] = res[1];
+            res[0] = aux;
+        }
+        if (res[0] < 0) {
+            res[0] = 0;
+        }
+        int numberOfRows = this.getNumberOfRows();
+        if (res[1] > numberOfRows) {
+            res[1] = numberOfRows;
+        }
+        return res;
+    }
+
+    /**
+     * Iterate over the table using a {@link IMonetDBTableCursor} instance.
+     *
+     * @param cursor The iterator with the business logic
      * @return The number of rows iterated
      * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    public int iterateTable(IMonetDBTableIterator iterator) throws 
MonetDBEmbeddedException {
-        int res = 0;
-        RowIterator ri = this.getRowIteratorInternal(this.connectionPointer, 
this.schemaName, this.tableName,
-                iterator.getFirstRowToIterate(), 
iterator.getLastRowToIterate());
+    public int iterateTable(IMonetDBTableCursor cursor) throws 
MonetDBEmbeddedException {
+        int[] limits = this.checkIterator(cursor);
+        int res = 0, total = limits[1] - limits[0];
+        String query = new StringBuffer("SELECT * FROM 
").append(this.schemaName).append(".").append(this.tableName)
+                .append(" LIMIT ").append(total).append(" OFFSET 
").append(limits[0]).append(";").toString();
+
+        QueryResultSet eqr = this.getConnection().sendQuery(query);
+        MonetDBRow[] array = eqr.fetchAllRowValues().getAllRows();
+        eqr.close();
+        Object[][] data = new 
Object[eqr.getNumberOfRows()][this.getNumberOfColumns()];
+        for(int i = 0 ; i < eqr.getNumberOfRows() ; i++) {
+            data[i] = array[i].getAllColumns();
+        }
+
+        RowIterator ri = new RowIterator(this, data, limits[0], limits[1]);
         while(ri.tryContinueIteration()) {
-            iterator.processNextRow(ri);
+            cursor.processNextRow(ri);
             res++;
         }
         return res;
     }
 
     /**
-     * Iterate over the table using a {@link 
nl.cwi.monetdb.embedded.tables.IMonetDBTableIterator}
+     * Iterate over the table using a {@link IMonetDBTableCursor}
      * instance asynchronously.
      *
      * @param iterator The iterator with the business logic
      * @return The number of rows iterated
      * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    /*public CompletableFuture<Integer> iterateTable(IMonetDBTableIterator 
iterator) throws MonetDBEmbeddedException {
+    /*public CompletableFuture<Integer> iterateTable(IMonetDBTableCursor 
iterator) throws MonetDBEmbeddedException {
         return CompletableFuture.supplyAsync(() -> 
this.iterateTable(iterator));
     }*/
 
@@ -151,14 +206,15 @@ public class MonetDBTable extends Abstra
      * @return The number of rows updated
      * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    public int updateRows(IMonetDBTableUpdater updater) throws 
MonetDBEmbeddedException {
+    /*public int updateRows(IMonetDBTableUpdater updater) throws 
MonetDBEmbeddedException {
+        int[] limits = this.checkIterator(updater);
         RowUpdater ru = this.getRowUpdaterInternal(this.connectionPointer, 
this.schemaName, this.tableName,
-                updater.getFirstRowToIterate(), updater.getLastRowToIterate());
+                limits[0], limits[1]);
         while(ru.tryContinueIteration()) {
             updater.processNextRow(ru);
         }
         return ru.submitUpdates();
-    }
+    }*/
 
     /**
      * Perform an update iteration over the table using a {@link 
nl.cwi.monetdb.embedded.tables.IMonetDBTableUpdater}
@@ -180,14 +236,15 @@ public class MonetDBTable extends Abstra
      * @return The number of rows removed
      * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    public int removeRows(IMonetDBTableRemover remover) throws 
MonetDBEmbeddedException {
+    /*public int removeRows(IMonetDBTableRemover remover) throws 
MonetDBEmbeddedException {
+        int[] limits = this.checkIterator(remover);
         RowRemover rr = this.getRowRemoverInternal(this.connectionPointer, 
this.schemaName, this.tableName,
-                remover.getFirstRowToIterate(), remover.getLastRowToIterate());
+                limits[0], limits[1]);
         while(rr.tryContinueIteration()) {
             remover.processNextRow(rr);
         }
         return rr.submitDeletes();
-    }
+    }*/
 
     /**
      * Perform a removal iteration over the table using a {@link 
nl.cwi.monetdb.embedded.tables.IMonetDBTableRemover}
@@ -207,9 +264,9 @@ public class MonetDBTable extends Abstra
      * @return The number of rows removed
      * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    public int truncateTable() throws MonetDBEmbeddedException {
+    /*public int truncateTable() throws MonetDBEmbeddedException {
         return this.truncateTableInternal(this.connectionPointer, 
this.schemaName, this.tableName);
-    }
+    }*/
 
     /**
      * Deletes all rows in the table asynchronously.
@@ -222,21 +279,30 @@ public class MonetDBTable extends Abstra
     }*/
 
     /**
-     * Appends new rows to the table.
+     * Appends new rows to the table. As MonetDB's storage is column-wise, the 
method
+     * {@link 
nl.cwi.monetdb.embedded.tables.MonetDBTable#appendColumns(Object[][]) 
appendColumns} is preferable
+     * over this one.
      *
      * @param rows An array of rows to append
      * @return The number of rows appended
      * @throws MonetDBEmbeddedException If an error in the database occurred
      */
     public int appendRows(Object[][] rows) throws MonetDBEmbeddedException {
-        int i = 0;
-        for (Object[] row : rows) {
-            if (row.length != this.getNumberOfColumns()) {
+        int numberOfRows = rows.length, numberOfColumns = 
this.getNumberOfColumns();
+        if(numberOfRows == 0) {
+            throw new ArrayStoreException("Appending 0 rows?");
+        }
+        Object[][] transposed = new Object[numberOfColumns][numberOfRows];
+
+        for (int i = 0; i < numberOfRows; i++) {
+            if(rows[i].length != numberOfColumns) {
                 throw new ArrayStoreException("The values array at row " + i + 
" differs from the number of columns!");
             }
-            i++;
+            for (int j = 0; j < numberOfColumns; j++) {
+                transposed[j][i] = rows[i][j];
+            }
         }
-        return this.appendRowsInternal(this.connectionPointer, 
this.schemaName, this.tableName, rows);
+        return this.appendColumns(transposed);
     }
 
     /**
@@ -251,32 +317,52 @@ public class MonetDBTable extends Abstra
     }*/
 
     /**
-     * Internal implementation to get a table iterator.
+     * Appends new rows to the table column-wise. As MonetDB's storage is 
column-wise, this method is preferable over
+     * {@link 
nl.cwi.monetdb.embedded.tables.MonetDBTable#appendRows(Object[][]) appendRows} 
method.
+     *
+     * @param columns An array of columns to append
+     * @return The number of rows appended
+     * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    private native RowIterator getRowIteratorInternal(long connectionPointer, 
String schemaName, String tableName,
-                                                     int firstRowToIterate, 
int lastRowToIterate) throws MonetDBEmbeddedException;
+    public int appendColumns(Object[][] columns) throws 
MonetDBEmbeddedException {
+        int numberOfRows = columns[0].length, numberOfColumns = 
this.getNumberOfColumns();
+        if(numberOfRows == 0) {
+            throw new ArrayStoreException("Appending 0 rows?");
+        }
+        if (columns.length != numberOfColumns) {
+            throw new ArrayStoreException("The number of columns differs from 
the table's number of columns!");
+        }
+        for (int i = 0; i < numberOfRows; i++) {
+            if(columns[i].length != numberOfRows) {
+                throw new ArrayStoreException("The number of rows in each 
column is not consistent!");
+            }
+        }
+        return this.appendColumnsInternal(this.connectionPointer, 
this.schemaName, this.tableName, this.columnsJavaIndexes,
+                this.columnsMonetDBIndexes,  this.columnsNames, 
this.columnsClasses, columns);
+    }
 
     /**
-     * Internal implementation to get a table updater iterator.
+     * Appends new rows to the table column-wise and asynchronously.
+     *
+     * @param columns An array of columns to append
+     * @return The number of rows appended
+     * @throws MonetDBEmbeddedException If an error in the database occurred
      */
-    private native RowUpdater getRowUpdaterInternal(long connectionPointer, 
String schemaName, String tableName,
-                                                      int firstRowToIterate, 
int lastRowToIterate) throws MonetDBEmbeddedException;
-
-    /**
-     * Internal implementation to get a table remover iterator.
-     */
-    private native RowRemover getRowRemoverInternal(long connectionPointer, 
String schemaName, String tableName,
-                                                    int firstRowToIterate, int 
lastRowToIterate) throws MonetDBEmbeddedException;
+    /*public CompletableFuture<Integer> appendColumnsAsync(Object[][] columns) 
throws MonetDBEmbeddedException {
+        return CompletableFuture.supplyAsync(() -> 
this.appendColumns(schemaName, tableName));
+    }*/
 
     /**
      * Internal implementation of table truncation.
      */
-    private native int truncateTableInternal(long connectionPointer, String 
schemaName, String tableName)
-            throws MonetDBEmbeddedException;
+    /*private native int truncateTableInternal(long connectionPointer, String 
schemaName, String tableName)
+            throws MonetDBEmbeddedException;*/
 
     /**
-     * Internal implementation of rows insertion.
+     * Internal implementation of columns insertion.
      */
-    private native int appendRowsInternal(long connectionPointer, String 
schemaName, String tableName, Object[][] rows)
+    private native int appendColumnsInternal(long connectionPointer, String 
schemaName, String tableName,
+                                             int[] monetDBindexes, int[] 
javaindexes, String[] columnsNames,
+                                             Class[] classes, Object[][] 
columns)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to