Browse Source

implement logic to determine if relationship is one-to-one

git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/branches/mutateops@1009 f203690c-595d-4dc9-a70b-905162fa7fd2
tags/jackcess-2.1.5
James Ahlborn 7 years ago
parent
commit
cea1bf2b38

+ 3
- 29
src/main/java/com/healthmarketscience/jackcess/CursorBuilder.java View 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;
}


+ 29
- 8
src/main/java/com/healthmarketscience/jackcess/impl/RelationshipCreator.java View 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)

+ 30
- 0
src/main/java/com/healthmarketscience/jackcess/impl/TableImpl.java View 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;
}

Loading…
Cancel
Save