]> source.dussan.org Git - jackcess.git/commitdiff
implement check for determining backing index data
authorJames Ahlborn <jtahlborn@yahoo.com>
Sat, 18 Jun 2016 14:36:55 +0000 (14:36 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Sat, 18 Jun 2016 14:36:55 +0000 (14:36 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/mutateops@997 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java
src/main/java/com/healthmarketscience/jackcess/impl/TableMutator.java

index 97e073c19327342c5bb9a37e7bdf65f387aae72b..925d465a1335ed555a4df796098cf9ae235622b4 100644 (file)
@@ -496,6 +496,10 @@ public class TableImpl implements Table
     return _logicalIndexCount;
   }
 
+  int getIndexCount() {
+    return _indexCount;
+  }
+
   List<ColumnImpl> getAutoNumberColumns() {
     return _autoNumColumns;
   }
index b9e508f42cb878de3b308c6965f7ca2a74a3f726..db672b932fc7f41815f02c9d41c90fe7993339e3 100644 (file)
@@ -134,15 +134,15 @@ public class TableMutator extends DBMutator
     _index.setIndexNumber(indexNumber);
 
     // find backing index state
-
-    // FIXME, writeme!
-
+    findIndexDataState();
 
     getPageChannel().startExclusiveWrite();
     try {
 
-      // FIXME, maybe add index data
-      // _table.mutateAddIndexData(this);
+      if(_idxDataState.getIndexDataNumber() == _table.getIndexCount()) {
+        // we need a new backing index data
+        _table.mutateAddIndexData(this);
+      }
 
       return _table.mutateAddIndex(this);
 
@@ -217,4 +217,51 @@ public class TableMutator extends DBMutator
     }
     return idxNames;
   }
+
+  private void findIndexDataState() {
+
+    _idxDataState = new IndexDataState();
+    _idxDataState.addIndex(_index);
+    
+    // search for an existing index which matches the given index (in terms of
+    // the backing data)
+    for(IndexData idxData : _table.getIndexDatas()) {
+      if(sameIndexData(_index, idxData)) {
+        _idxDataState.setIndexDataNumber(idxData.getIndexDataNumber());
+        return;
+      }
+    }
+
+    // no matches found, need new index data state
+    _idxDataState.setIndexDataNumber(_table.getIndexCount());
+  }
+
+  private static boolean sameIndexData(IndexBuilder idx1, IndexData idx2) {
+    // index data can be combined if flags match and columns (and col flags)
+    // match
+    if(idx1.getFlags() != idx2.getIndexFlags()) {
+      return false;
+    }
+
+    if(idx1.getColumns().size() != idx2.getColumns().size()) {
+      return false;
+    }
+    
+    for(int i = 0; i < idx1.getColumns().size(); ++i) {
+      IndexBuilder.Column col1 = idx1.getColumns().get(i);
+      IndexData.ColumnDescriptor col2 = idx2.getColumns().get(i);
+
+      if(!sameIndexData(col1, col2)) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  private static boolean sameIndexData(
+      IndexBuilder.Column col1, IndexData.ColumnDescriptor col2) {
+    return (col1.getName().equals(col2.getName()) && 
+            (col1.getFlags() == col2.getFlags()));
+  }
 }