]> source.dussan.org Git - jackcess.git/commitdiff
add a few util methods related to indexes and joins
authorJames Ahlborn <jtahlborn@yahoo.com>
Fri, 17 Jun 2011 03:06:16 +0000 (03:06 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Fri, 17 Jun 2011 03:06:16 +0000 (03:06 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@566 f203690c-595d-4dc9-a70b-905162fa7fd2

src/java/com/healthmarketscience/jackcess/Joiner.java
src/java/com/healthmarketscience/jackcess/Table.java
test/src/java/com/healthmarketscience/jackcess/IndexTest.java
test/src/java/com/healthmarketscience/jackcess/JoinerTest.java

index afe445d657c836b5cdd7fd3136df61a57be992d0..89da959836825ff7d34aaed39c91e9598d697c9f 100644 (file)
@@ -46,10 +46,25 @@ public class Joiner
     _toCursor = toCursor;
   }
 
+  /**
+   * Creates a new Joiner based on the foreign-key relationship between the
+   * given "from"" table and the given "to"" table.
+   *
+   * @param fromTable the "from" side of the relationship
+   * @param toTable the "to" side of the relationship
+   * @throws IllegalArgumentException if there is no relationship between the
+   *         given tables
+   */
+  public static Joiner create(Table fromTable, Table toTable)
+    throws IOException
+  {
+    return create(fromTable.getForeignKeyIndex(toTable));
+  }
+  
   /**
    * Creates a new Joiner based on the given index which backs a foreign-key
    * relationship.  The table of the given index will be the "from" table and
-   * the table on the other end of the relationsip is the "to" table.
+   * the table on the other end of the relationship will be the "to" table.
    *
    * @param fromIndex the index backing one side of a foreign-key relationship
    */
@@ -63,6 +78,16 @@ public class Joiner
     toCursor.setColumnMatcher(CaseInsensitiveColumnMatcher.INSTANCE);
     return new Joiner(fromIndex, toCursor);
   }
+
+  /**
+   * Creates a new Joiner that is the reverse of this Joiner (the "from" and
+   * "to" tables are swapped).
+   */ 
+  public Joiner createReverse()
+    throws IOException
+  {
+    return create(getToTable(), getFromTable());
+  }
   
   public Table getFromTable()
   {
index 1d1c7a3128f5fe064a21197cf9a262a62a35644e..34b3c275ce5a1f7069d58089c3789e8ef97cf9c9 100644 (file)
@@ -367,6 +367,7 @@ public class Table
 
   /**
    * @return the index with the given name
+   * @throws IllegalArgumentException if there is no index with the given name
    */
   public Index getIndex(String name) {
     for(Index index : _indexes) {
@@ -377,7 +378,40 @@ public class Table
     throw new IllegalArgumentException("Index with name " + name +
                                        " does not exist on this table");
   }
-    
+
+  /**
+   * @return the primary key index for this table
+   * @throws IllegalArgumentException if there is no primary key index on this
+   *         table
+   */
+  public Index getPrimaryKeyIndex() {
+    for(Index index : _indexes) {
+      if(index.isPrimaryKey()) {
+        return index;
+      }
+    }
+    throw new IllegalArgumentException("Table " + getName() +
+                                       " does not have a primary key index");
+  }
+  
+  /**
+   * @return the foreign key index joining this table to the given other table
+   * @throws IllegalArgumentException if there is no relationship between this
+   *         table and the given table
+   */
+  public Index getForeignKeyIndex(Table otherTable) {
+    for(Index index : _indexes) {
+      if(index.isForeignKey() && (index.getReference() != null) &&
+         (index.getReference().getOtherTablePageNumber() ==
+          otherTable.getTableDefPageNumber())) {
+        return index;
+      }
+    }
+    throw new IllegalArgumentException(
+        "Table " + getName() + " does not have a foreign key reference to " +
+        otherTable.getName());
+  }
+  
   /**
    * @return All of the IndexData on this table (unmodifiable List)
    */
index 21e4fd985583f3f4316cdc33c3787870fed50e41..8f078f65cacab1900042f022a1d6e28edbe417ed 100644 (file)
@@ -88,14 +88,20 @@ public class IndexTest extends TestCase {
     for (final TestDB testDB : SUPPORTED_DBS_TEST_FOR_READ) {
       Table table = open(testDB).getTable("Table1");
       Map<String, Boolean> foundPKs = new HashMap<String, Boolean>();
+      Index pkIndex = null;
       for(Index index : table.getIndexes()) {
         foundPKs.put(index.getColumns().iterator().next().getName(),
                      index.isPrimaryKey());
+        if(index.isPrimaryKey()) {
+          pkIndex= index;
+        
+        }
       }
       Map<String, Boolean> expectedPKs = new HashMap<String, Boolean>();
       expectedPKs.put("A", Boolean.TRUE);
       expectedPKs.put("B", Boolean.FALSE);
       assertEquals(expectedPKs, foundPKs);
+      assertSame(pkIndex, table.getPrimaryKeyIndex());
     }
   }
   
index 1f2961ceff49c08bdc0bf475472026fc3c73246a..87f70fd8c656d6086b74128783af9531cfd907fa 100644 (file)
@@ -83,7 +83,8 @@ public class JoinerTest extends TestCase {
   {
     final Set<String> colNames = new HashSet<String>(
         Arrays.asList("id", "data"));
-    
+
+    Joiner revJoin = join.createReverse();
     for(Map<String,Object> row : join.getFromTable()) {
       Integer id = (Integer)row.get("id");
 
@@ -98,6 +99,8 @@ public class JoinerTest extends TestCase {
 
       if(!expectedRows.isEmpty()) {
         assertEquals(expectedRows.get(0), join.findFirstRow(row));
+
+        assertEquals(row, revJoin.findFirstRow(expectedRows.get(0)));
       } else {
         assertNull(join.findFirstRow(row));
       }