package com.eas.client.metadata;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
*
* @author mg
*/
public class DbTableKeys {
protected Map<String, PrimaryKeySpec> pks = new HashMap<>();
protected Map<String, ForeignKeySpec> fks = new HashMap<>();
protected String tableName;
private DbTableKeys(DbTableKeys aSource) {
this();
if (aSource != null) {
String otherTableName = aSource.getTableName();
if (otherTableName != null) {
tableName = new String(otherTableName.toCharArray());
}
fks.clear();
Map<String, ForeignKeySpec> lfks = aSource.getFks();
Set<Entry<String, ForeignKeySpec>> lfkSet = lfks.entrySet();
if (lfkSet != null) {
Iterator<Entry<String, ForeignKeySpec>> lfkIt = lfkSet.iterator();
while (lfkIt.hasNext()) {
Entry<String, ForeignKeySpec> lfkEntry = lfkIt.next();
String lfkFieldName = lfkEntry.getKey();
ForeignKeySpec lfkSpec = lfkEntry.getValue();
fks.put(new String(lfkFieldName.toCharArray()), (ForeignKeySpec) lfkSpec.copy());
}
}
pks.clear();
Map<String, PrimaryKeySpec> lpks = aSource.getPks();
Set<Entry<String, PrimaryKeySpec>> lpkSet = lpks.entrySet();
if (lpkSet != null) {
Iterator<Entry<String, PrimaryKeySpec>> lpkIt = lpkSet.iterator();
while (lpkIt.hasNext()) {
Entry<String, PrimaryKeySpec> lpkEntry = lpkIt.next();
String lpkFieldName = lpkEntry.getKey();
PrimaryKeySpec lpkSpec = lpkEntry.getValue();
pks.put(new String(lpkFieldName.toCharArray()), lpkSpec.copy());
}
}
}
}
public boolean isPrimaryKey(String fieldName) {
return (pks != null && pks.containsKey(fieldName));
}
public boolean isForeignKey(String fieldName) {
return (fks != null && fks.containsKey(fieldName));
}
public DbTableKeys() {
super();
}
/**
* Constructor with table name
* @param aTableName Table name without any schema name.
*/
public DbTableKeys(String aTableName) {
super();
tableName = aTableName;
}
/**
* Returns table name without any schema name.
* @return Table name without any schema name.
*/
public String getTableName() {
return tableName;
}
public void addForeignKey(String aFkSchema, String aFkTable, String aFkField, String aFkName, ForeignKeySpec.ForeignKeyRule afkUpdateRule, ForeignKeySpec.ForeignKeyRule afkDeleteRule, boolean afkDeferrable, String aPkSchema, String aPkTable, String aPkField, String aPkName) {
fks.put(aFkField, new ForeignKeySpec(aFkSchema, aFkTable, aFkField, aFkName, afkUpdateRule, afkDeleteRule, afkDeferrable, aPkSchema, aPkTable, aPkField, aPkName));
}
public void addPrimaryKey(String aPkSchema, String aPkTable, String aPkField, String aPkName) {
pks.put(aPkField, new PrimaryKeySpec(aPkSchema, aPkTable, aPkField, aPkName));
}
public void clear() {
fks.clear();
pks.clear();
}
public boolean isEmpty() {
return (pks == null || pks.isEmpty()) && (fks == null || fks.isEmpty());
}
public Map<String, ForeignKeySpec> getFks() {
return fks;
}
public Map<String, PrimaryKeySpec> getPks() {
return pks;
}
public DbTableKeys copy() {
DbTableKeys dbTblFks = new DbTableKeys(this);
return dbTblFks;
}
public static boolean isKeysCompatible(DbTableKeys table1Keys, String field1Name, DbTableKeys table2Keys, String field2Name) {
if (table1Keys != null && field1Name != null
&& table2Keys != null && field2Name != null) {
PrimaryKeySpec[] lKeys = new PrimaryKeySpec[2];
int lKeysCount = 0;
Map<String, PrimaryKeySpec> lPks = table1Keys.getPks();
Map<String, ForeignKeySpec> lFks = table1Keys.getFks();
if (lPks.containsKey(field1Name)) {
PrimaryKeySpec lfoundPk = lPks.get(field1Name);
lKeys[lKeysCount] = new PrimaryKeySpec(lfoundPk.getSchema(), lfoundPk.getTable(), lfoundPk.getField(), lfoundPk.getCName());
lKeysCount++;
}
if (lFks.containsKey(field1Name)) {
ForeignKeySpec lfoundFk = lFks.get(field1Name);
lKeys[lKeysCount] = new PrimaryKeySpec(lfoundFk.getReferee().getSchema(), lfoundFk.getReferee().getTable(), lfoundFk.getReferee().getField(), lfoundFk.getReferee().getCName());
lKeysCount++;
}
PrimaryKeySpec[] rKeys = new PrimaryKeySpec[2];
int rKeysCount = 0;
Map<String, ForeignKeySpec> rFks = table2Keys.getFks();
Map<String, PrimaryKeySpec> rPks = table2Keys.getPks();
if (rPks.containsKey(field2Name)) {
PrimaryKeySpec lfoundPk = rPks.get(field2Name);
rKeys[rKeysCount] = new PrimaryKeySpec(lfoundPk.getSchema(), lfoundPk.getTable(), lfoundPk.getField(), lfoundPk.getCName());
rKeysCount++;
}
if (rFks.containsKey(field2Name)) {
ForeignKeySpec lfoundFk = rFks.get(field2Name);
rKeys[rKeysCount] = new PrimaryKeySpec(lfoundFk.getReferee().getSchema(), lfoundFk.getReferee().getTable(), lfoundFk.getReferee().getField(), lfoundFk.getReferee().getCName());
rKeysCount++;
}
for (int i = 0; i < lKeysCount; i++) {
for (int j = 0; j < rKeysCount; j++) {
String lSchema = lKeys[i].getSchema();
if (lSchema == null) {
lSchema = "";
}
lSchema = lSchema.toUpperCase();
String lTable = lKeys[i].getTable();
if (lTable == null) {
lTable = "";
}
lTable = lTable.toUpperCase();
String lField = lKeys[i].getField();
if (lField == null) {
lField = "";
}
lField = lField.toUpperCase();
String rSchema = rKeys[j].getSchema();
if (rSchema == null) {
rSchema = "";
}
rSchema = rSchema.toUpperCase();
String rTable = rKeys[j].getTable();
if (rTable == null) {
rTable = "";
}
rTable = rTable.toUpperCase();
String rField = rKeys[j].getField();
if (rField == null) {
rField = "";
}
rField = rField.toUpperCase();
if (lSchema.equals(rSchema)
&& lTable.equals(rTable)
&& lField.equals(rField)) {
return true;
}
}
}
}
return false;
}
}