]> source.dussan.org Git - jackcess.git/commitdiff
implement logic to determine if relationship is one-to-one
authorJames Ahlborn <jtahlborn@yahoo.com>
Fri, 19 Aug 2016 03:08:18 +0000 (03:08 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Fri, 19 Aug 2016 03:08:18 +0000 (03:08 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/mutateops@1009 f203690c-595d-4dc9-a70b-905162fa7fd2

src/main/java/com/healthmarketscience/jackcess/CursorBuilder.java
src/main/java/com/healthmarketscience/jackcess/impl/RelationshipCreator.java
src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java

index f545366291d674ce949b7b1036dac3e5949027a6..688eb9e38adb297f8ed16cb544dc079013746562 100644 (file)
@@ -19,8 +19,6 @@ package com.healthmarketscience.jackcess;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -147,37 +145,13 @@ public class CursorBuilder {
    * Searches for an index with the given column names.
    */
   private CursorBuilder setIndexByColumns(List<String> searchColumns) {
-    boolean found = false;
-    for(IndexImpl index : _table.getIndexes()) {
-      
-      Collection<? extends Index.Column> indexColumns = index.getColumns();
-      if(indexColumns.size() != searchColumns.size()) {
-        continue;
-      }
-      Iterator<String> sIter = searchColumns.iterator();
-      Iterator<? extends Index.Column> iIter = indexColumns.iterator();
-      boolean matches = true;
-      while(sIter.hasNext()) {
-        String sColName = sIter.next();
-        String iColName = iIter.next().getName();
-        if((sColName != iColName) &&
-           ((sColName == null) || !sColName.equalsIgnoreCase(iColName))) {
-          matches = false;
-          break;
-        }
-      }
-
-      if(matches) {
-        _index = index;
-        found = true;
-        break;
-      }
-    }
-    if(!found) {
+    IndexImpl index = _table.findIndexForColumns(searchColumns, false);
+    if(index == null) {
       throw new IllegalArgumentException("Index with columns " +
                                          searchColumns +
                                          " does not exist in table " + _table);
     }
+    _index = index;
     return this;
   }
 
index b2ef89eaab231205affb03ef33d61414e88c472a..78ddcdaf174bb2e2ec0297b27f7401e486f7b213 100644 (file)
@@ -18,10 +18,11 @@ package com.healthmarketscience.jackcess.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.IndexBuilder;
 import com.healthmarketscience.jackcess.RelationshipBuilder;
 
@@ -81,9 +82,11 @@ public class RelationshipCreator extends DBMutator
     
     validate();
 
-    // FIXME determine if rel is one to one (integ enforced and both unique)
     _flags = _relationship.getFlags();
-    
+    // need to determine the one-to-one flag on our own
+    if(isOneToOne()) {
+      _flags |= RelationshipImpl.ONE_TO_ONE_FLAG;
+    }
 
     getPageChannel().startExclusiveWrite();
     try {
@@ -222,17 +225,35 @@ public class RelationshipCreator extends DBMutator
     return cols;
   }
 
+  private static Collection<String> getColumnNames(
+      List<ColumnImpl> cols, Collection<String> colNames) {
+    for(ColumnImpl col : cols) {
+      colNames.add(col.getName());
+    }
+    return colNames;
+  }
+
+  private boolean isOneToOne() {
+    // a relationship is one to one if the two sides of the relationship have
+    // unique indexes on the relevant columns
+    IndexImpl idx = _primaryTable.findIndexForColumns(
+        getColumnNames(_primaryCols, new HashSet<String>()), true);
+    if(idx == null) {
+      return false;
+    }
+    idx = _secondaryTable.findIndexForColumns(
+        getColumnNames(_secondaryCols, new HashSet<String>()), true);
+    return (idx != null);
+  }
+
   private static String getTableErrorContext(
       TableImpl table, List<ColumnImpl> cols,
-      String tableName, List<String> colNames) {
+      String tableName, Collection<String> colNames) {
     if(table != null) {
       tableName = table.getName();
     }
     if(cols != null) {
-      colNames = new ArrayList<String>();
-      for(ColumnImpl col : cols) {
-        colNames.add(col.getName());
-      }
+      colNames = getColumnNames(cols, new ArrayList<String>());
     }
 
     return CustomToStringStyle.valueBuilder(tableName)
index a4dfd6d6f9c6b7ff24ebe8b99b35a4edb8087cb0..83f96f6ab28ad439012eeb3035c1c0ec96cb9cd3 100644 (file)
@@ -41,6 +41,7 @@ import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.ColumnBuilder;
 import com.healthmarketscience.jackcess.ConstraintViolationException;
 import com.healthmarketscience.jackcess.CursorBuilder;
+import com.healthmarketscience.jackcess.Index;
 import com.healthmarketscience.jackcess.IndexBuilder;
 import com.healthmarketscience.jackcess.JackcessException;
 import com.healthmarketscience.jackcess.PropertyMap;
@@ -500,6 +501,35 @@ public class TableImpl implements Table
     return _indexCount;
   }
 
+  public IndexImpl findIndexForColumns(Collection<String> searchColumns, 
+                                       boolean uniqueOnly) {
+    for(IndexImpl index : _indexes) {
+      
+      Collection<? extends Index.Column> indexColumns = index.getColumns();
+      if(indexColumns.size() != searchColumns.size()) {
+        continue;
+      }
+      Iterator<String> sIter = searchColumns.iterator();
+      Iterator<? extends Index.Column> iIter = indexColumns.iterator();
+      boolean matches = true;
+      while(sIter.hasNext()) {
+        String sColName = sIter.next();
+        String iColName = iIter.next().getName();
+        if((sColName != iColName) &&
+           ((sColName == null) || !sColName.equalsIgnoreCase(iColName))) {
+          matches = false;
+          break;
+        }
+      }
+
+      if(matches && (!uniqueOnly || index.isUnique())) {
+        return index;
+      }
+    }
+
+    return null;
+  }
+  
   List<ColumnImpl> getAutoNumberColumns() {
     return _autoNumColumns;
   }