public String getBackupTableAlias(){ return backupTable.getAlias(); } private void markInnerColumn(InnerDataTypeEnum dataType) {
public String getTableAlias() { return table != null ? table.getAlias() : "UNKNOWN_ALIAS"; }
public JoinDesc getJoinByPKSide(TableRef table) { Chain chain = tableChains.get(table.getAlias()); if (chain == null) return null; else return chain.join; }
public JoinsTree getSubgraphByAlias(Set<String> aliases) { Map<String, Chain> subgraph = Maps.newHashMap(); for (String alias : aliases) { Chain chain = tableChains.get(alias); if (chain == null) throw new IllegalArgumentException("Table with alias " + alias + " is not found"); while (chain.getFkSide() != null) { subgraph.put(chain.table.getAlias(), chain); chain = chain.getFkSide(); } subgraph.put(chain.table.getAlias(), chain); } return new JoinsTree(subgraph); }
private boolean matchInTree(Chain chain, JoinsTree another, Map<String, String> constraints, Map<String, String> matchUp) { String thisAlias = chain.table.getAlias(); if (matchUp.containsKey(thisAlias)) return true; String constraint = constraints.get(thisAlias); if (constraint != null) { return matchChain(chain, another.tableChains.get(constraint), matchUp); } for (Chain anotherChain : another.tableChains.values()) { if (matchChain(chain, anotherChain, matchUp)) { return true; } } return false; }
public JoinsTree(TableRef rootTable, List<JoinDesc> joins) { for (JoinDesc join : joins) { for (TblColRef col : join.getForeignKeyColumns()) Preconditions.checkState(col.isQualified()); for (TblColRef col : join.getPrimaryKeyColumns()) Preconditions.checkState(col.isQualified()); } tableChains.put(rootTable.getAlias(), new Chain(rootTable, null, null)); for (JoinDesc join : joins) { TableRef pkSide = join.getPKSide(); Chain fkSide = tableChains.get(join.getFKSide().getAlias()); tableChains.put(pkSide.getAlias(), new Chain(pkSide, join, fkSide)); } }
for (JoinTableDesc joinTable : joinTables) { JoinDesc join = joinTable.getJoin(); String fkSideName = join.getFKSide().getAlias(); if (fkMap.containsKey(fkSideName)) { fkMap.get(fkSideName).add(joinTable); JoinTableDesc head = joinTableBuff.poll(); orderedJoinTables[orderedIndex++] = head; String headAlias = head.getJoin().getPKSide().getAlias(); if (fkMap.containsKey(headAlias)) { joinTableBuff.addAll(fkMap.get(headAlias));
private boolean matchChain(Chain chain, Chain anotherChain, Map<String, String> matchUp) { String thisAlias = chain.table.getAlias(); String anotherAlias = anotherChain.table.getAlias(); String curMatch = matchUp.get(thisAlias); if (curMatch != null) return curMatch.equals(anotherAlias); if (curMatch == null && matchUp.values().contains(anotherAlias)) return false; boolean matches = false; if (chain.join == null) { matches = anotherChain.join == null && chain.table.getTableDesc().getIdentity().equals(anotherChain.table.getTableDesc().getIdentity()); } else { matches = joinDescMatcher.matches(chain.join, anotherChain.join) && matchChain(chain.fkSide, anotherChain.fkSide, matchUp); } if (matches) { matchUp.put(thisAlias, anotherAlias); } return matches; }
private void addAlias(TableRef ref) { String alias = ref.getAlias(); if (aliasMap.containsKey(alias)) throw new IllegalStateException("Alias '" + alias + "' ref to multiple tables: " + ref.getTableIdentity() + ", " + aliasMap.get(alias).getTableIdentity()); aliasMap.put(alias, ref); TableDesc table = ref.getTableDesc(); addTableName(table.getName(), ref); addTableName(table.getIdentity(), ref); }
TableRef rootTable = model.getRootFactTable(); sql.append(" FROM ").append(flatDesc.getDataModel().getRootFactTable().getTableIdentityQuoted("`")) .append(" as ").append(quoteIdentifier(rootTable.getAlias())).append(sep); .append(" as ").append(quoteIdentifier(dimTable.getAlias())).append(sep); sql.append("ON "); for (int i = 0; i < pk.length; i++) {
private static Map<String, String> matches(DataModelDesc model, OLAPContext ctx) { Map<String, String> result = Maps.newHashMap(); TableRef firstTable = ctx.firstTableScan.getTableRef(); Map<String, String> matchUp = null; if (ctx.joins.isEmpty() && model.isLookupTable(firstTable.getTableIdentity())) { // one lookup table String modelAlias = model.findFirstTable(firstTable.getTableIdentity()).getAlias(); matchUp = ImmutableMap.of(firstTable.getAlias(), modelAlias); } else if (ctx.joins.size() != ctx.allTableScans.size() - 1) { // has hanging tables ctx.realizationCheck.addModelIncapableReason(model, RealizationCheck.IncapableReason.create(RealizationCheck.IncapableType.MODEL_BAD_JOIN_SEQUENCE)); throw new IllegalStateException("Please adjust the sequence of join tables. " + toErrorMsg(ctx)); } else { // normal big joins if (ctx.joinsTree == null) { ctx.joinsTree = new JoinsTree(firstTable, ctx.joins); } matchUp = ctx.joinsTree.matches(model.getJoinsTree(), result); } if (matchUp == null) { ctx.realizationCheck.addModelIncapableReason(model, RealizationCheck.IncapableReason.create(RealizationCheck.IncapableType.MODEL_UNMATCHED_JOIN)); return null; } result.putAll(matchUp); ctx.realizationCheck.addCapableModel(model, result); return result; }
void init(DataModelDesc model) { table = table.toUpperCase(Locale.ROOT); if (columns != null) { StringUtil.toUpperCaseArray(columns, columns); } if (model != null) { table = model.findTable(table).getAlias(); if (columns != null) { for (int i = 0; i < columns.length; i++) { TblColRef column = model.findColumn(table, columns[i]); if (column.getColumnDesc().isComputedColumn() && !model.isFactTable(column.getTableRef())) { throw new RuntimeException("Computed Column on lookup table is not allowed"); } columns[i] = column.getName(); } } } }
@Override public String toString() { if (isInnerColumn() && parserDescription != null) return parserDescription; String alias = table == null ? "UNKNOWN_MODEL" : table.getAlias(); String tableName = column.getTable() == null ? "NULL" : column.getTable().getName(); String tableIdentity = column.getTable() == null ? "NULL" : column.getTable().getIdentity(); if (alias.equals(tableName)) { return tableIdentity + "." + column.getName(); } else { return alias + ":" + tableIdentity + "." + column.getName(); } }
public void init(CubeDesc cubeDesc) { DataModelDesc model = cubeDesc.getModel(); if (name != null) name = name.toUpperCase(Locale.ROOT); tableRef = model.findTable(table); table = tableRef.getAlias(); join = null; for (JoinTableDesc joinTable : model.getJoinTables()) { if (joinTable.getTableRef().equals(this.tableRef)) { join = joinTable.getJoin(); break; } } if (column != null && !"{FK}".equals(column)) { column = model.findColumn(table, column).getName(); } if (derived != null && derived.length == 0) { derived = null; } if (derived != null) { for (int i = 0; i < derived.length; i++) { derived[i] = model.findColumn(table, derived[i]).getName(); } } if (derived != null && join == null) { throw new IllegalStateException( "Derived can only be defined on lookup table, cube " + cubeDesc + ", " + this); } }
@Override public void serialize(IFilterCodeSystem<?> cs, ByteBuffer buffer) { TableRef tableRef = columnRef.getTableRef(); if (tableRef == null) { // un-qualified column String table = columnRef.getTable(); BytesUtil.writeUTFString(table, buffer); String columnId = columnRef.getColumnDesc().getId(); BytesUtil.writeUTFString(columnId, buffer); String columnName = columnRef.getName(); BytesUtil.writeUTFString(columnName, buffer); String dataType = columnRef.getDatatype(); BytesUtil.writeUTFString(dataType, buffer); } else { // qualified column (from model) BytesUtil.writeUTFString(_QUALIFIED_, buffer); String model = tableRef.getModel().getName(); BytesUtil.writeUTFString(model, buffer); String alias = tableRef.getAlias(); BytesUtil.writeUTFString(alias, buffer); String col = columnRef.getName(); BytesUtil.writeUTFString(col, buffer); } }
@Override public void serialize(IFilterCodeSystem<?> cs, ByteBuffer buffer) { TableRef tableRef = columnRef.getTableRef(); if (tableRef == null) { // un-qualified column String table = columnRef.getTable(); BytesUtil.writeUTFString(table, buffer); String columnId = columnRef.getColumnDesc().getId(); BytesUtil.writeUTFString(columnId, buffer); String columnName = columnRef.getName(); BytesUtil.writeUTFString(columnName, buffer); String dataType = columnRef.getDatatype(); BytesUtil.writeUTFString(dataType, buffer); } else { // qualified column (from model) BytesUtil.writeUTFString(_QUALIFIED_, buffer); String model = tableRef.getModel().getName(); BytesUtil.writeUTFString(model, buffer); String alias = tableRef.getAlias(); BytesUtil.writeUTFString(alias, buffer); String col = columnRef.getName(); BytesUtil.writeUTFString(col, buffer); } }
public JoinDesc getJoinByPKSide(TableRef table) { Chain chain = tableChains.get(table.getAlias()); if (chain == null) return null; else return chain.join; }
public JoinsTree(TableRef rootTable, List<JoinDesc> joins) { for (JoinDesc join : joins) { for (TblColRef col : join.getForeignKeyColumns()) Preconditions.checkState(col.isQualified()); for (TblColRef col : join.getPrimaryKeyColumns()) Preconditions.checkState(col.isQualified()); } tableChains.put(rootTable.getAlias(), new Chain(rootTable, null, null)); for (JoinDesc join : joins) { TableRef pkSide = join.getPKSide(); Chain fkSide = tableChains.get(join.getFKSide().getAlias()); tableChains.put(pkSide.getAlias(), new Chain(pkSide, join, fkSide)); } }
private void addAlias(TableRef ref) { String alias = ref.getAlias(); if (aliasMap.containsKey(alias)) throw new IllegalStateException("Alias '" + alias + "' ref to multiple tables: " + ref.getTableIdentity() + ", " + aliasMap.get(alias).getTableIdentity()); aliasMap.put(alias, ref); TableDesc table = ref.getTableDesc(); addTableName(table.getName(), ref); addTableName(table.getIdentity(), ref); }
@Override public String toString() { if (isInnerColumn() && parserDescription != null) return parserDescription; String alias = table == null ? "UNKNOWN_MODEL" : table.getAlias(); String tableName = column.getTable() == null ? "NULL" : column.getTable().getName(); String tableIdentity = column.getTable() == null ? "NULL" : column.getTable().getIdentity(); if (alias.equals(tableName)) { return tableIdentity + "." + column.getName(); } else { return alias + ":" + tableIdentity + "." + column.getName(); } }