Skip to content

Commit

Permalink
minor, refactor on JoinTree
Browse files Browse the repository at this point in the history
  • Loading branch information
lidongsjtu authored and Hongbin Ma committed Dec 20, 2017
1 parent 26e191a commit 9f603d3
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ public static void appendJoinStatement(IJoinedFlatTableDesc flatDesc, StringBuil
if (i > 0) {
sql.append(" AND ");
}
sql.append(fk[i].getIdentity() + " = " + pk[i].getIdentity());
sql.append(fk[i].getExpressionInSourceDB() + " = " + pk[i].getExpressionInSourceDB());
}
sql.append(sep);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -404,11 +404,12 @@ private void initTableAlias(Map<String, TableDesc> tables) {
alias = alias.toUpperCase();
join.setAlias(alias);

TableRef ref = new TableRef(this, alias, tableDesc, true);
boolean isLookup = join.getKind() == TableKind.LOOKUP;
TableRef ref = new TableRef(this, alias, tableDesc, isLookup);

join.setTableRef(ref);
addAlias(ref);
(join.getKind() == TableKind.LOOKUP ? lookupTableRefs : factTableRefs).add(ref);
(isLookup ? lookupTableRefs : factTableRefs).add(ref);
}

tableNameMap.putAll(aliasMap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,34 +187,6 @@ public boolean equals(Object obj) {
return true;
}

// equals() without alias
public boolean matches(JoinDesc other) {
if (other == null)
return false;

if (!this.type.equalsIgnoreCase(other.getType()))
return false;

// note pk/fk are sorted, sortByFK()
if (!this.columnDescEquals(foreignKeyColumns, other.foreignKeyColumns))
return false;
if (!this.columnDescEquals(primaryKeyColumns, other.primaryKeyColumns))
return false;

return true;
}

private boolean columnDescEquals(TblColRef[] a, TblColRef[] b) {
if (a.length != b.length)
return false;

for (int i = 0; i < a.length; i++) {
if (a[i].getColumnDesc().equals(b[i].getColumnDesc()) == false)
return false;
}
return true;
}

@Override
public String toString() {
return "JoinDesc [type=" + type + ", primary_key=" + Arrays.toString(primaryKey) + ", foreign_key=" + Arrays.toString(foreignKey) + "]";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@

public class JoinsTree implements Serializable {
private static final long serialVersionUID = 1L;
private static final IJoinDescMatcher DEFAULT_JOINDESC_MATCHER = new DefaultJoinDescMatcher();

final Map<String, Chain> tableChains = new LinkedHashMap<>();
private IJoinDescMatcher joinDescMatcher = DEFAULT_JOINDESC_MATCHER;

public JoinsTree(TableRef rootTable, List<JoinDesc> joins) {
for (JoinDesc join : joins) {
Expand Down Expand Up @@ -108,7 +110,8 @@ private boolean matchChain(Chain chain, Chain anotherChain, Map<String, String>
matches = anotherChain.join == null
&& chain.table.getTableDesc().getIdentity().equals(anotherChain.table.getTableDesc().getIdentity());
} else {
matches = chain.join.matches(anotherChain.join) && matchChain(chain.fkSide, anotherChain.fkSide, matchUp);
matches = joinDescMatcher.matches(chain.join, anotherChain.join)
&& matchChain(chain.fkSide, anotherChain.fkSide, matchUp);
}

if (matches) {
Expand Down Expand Up @@ -140,6 +143,10 @@ public Map<String, Chain> getTableChains() {
return tableChains;
}

public void setJoinDescMatcher(IJoinDescMatcher joinDescMatcher) {
this.joinDescMatcher = joinDescMatcher;
}

public static class Chain implements Serializable {
private static final long serialVersionUID = 1L;

Expand Down Expand Up @@ -170,4 +177,45 @@ public Chain getFkSide() {
}
}

public static interface IJoinDescMatcher {
boolean matches(JoinDesc join1, JoinDesc join2);
}

public static class DefaultJoinDescMatcher implements IJoinDescMatcher {
@Override
public boolean matches(JoinDesc join1, JoinDesc join2) {
if (join1 == null) {
return join2 == null;
} else if (join2 == null) {
return false;
} else {

if (!join1.getType().equalsIgnoreCase(join2.getType()))
return false;

// note pk/fk are sorted, sortByFK()
if (!this.columnDescEquals(join1.getForeignKeyColumns(), join2.getForeignKeyColumns()))
return false;
if (!this.columnDescEquals(join1.getPrimaryKeyColumns(), join2.getPrimaryKeyColumns()))
return false;

return true;
}
}

private boolean columnDescEquals(TblColRef[] a, TblColRef[] b) {
if (a.length != b.length)
return false;

for (int i = 0; i < a.length; i++) {
if (columnDescEquals(a[i].getColumnDesc(), b[i].getColumnDesc()) == false)
return false;
}
return true;
}

protected boolean columnDescEquals(ColumnDesc a, ColumnDesc b) {
return a == null ? b == null : a.equals(b);
}
}
}

0 comments on commit 9f603d3

Please sign in to comment.