private boolean validatePkFkDim(JoinDesc join, Set<TblColRef> mcols) { if (join == null) return false; boolean pkfkDimAmended = false; for (TblColRef c : join.getForeignKeyColumns()) { if (!mcols.contains(c)) { pkfkDimAmended = validatePkFkDim(c) || pkfkDimAmended; } } for (TblColRef c : join.getPrimaryKeyColumns()) { if (!mcols.contains(c)) { pkfkDimAmended = validatePkFkDim(c) || pkfkDimAmended; } } return pkfkDimAmended; }
throw new IllegalStateException("Missing join conditions on table " + dimTable); StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); StringUtil.toUpperCaseArray(join.getPrimaryKey(), join.getPrimaryKey()); String[] pks = join.getPrimaryKey(); TblColRef[] pkCols = new TblColRef[pks.length]; for (int i = 0; i < pks.length; i++) { pkCols[i] = col; join.setPrimaryKeyColumns(pkCols); String[] fks = join.getForeignKey(); TblColRef[] fkCols = new TblColRef[fks.length]; for (int i = 0; i < fks.length; i++) { fkCols[i] = col; join.setForeignKeyColumns(fkCols); join.sortByFK();
@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; } }
protected JoinDesc buildJoin(RexCall condition) { Map<TblColRef, TblColRef> joinColumns = new HashMap<TblColRef, TblColRef>(); translateJoinColumn(condition, joinColumns); List<String> pks = new ArrayList<String>(); List<TblColRef> pkCols = new ArrayList<TblColRef>(); List<String> fks = new ArrayList<String>(); List<TblColRef> fkCols = new ArrayList<TblColRef>(); for (Map.Entry<TblColRef, TblColRef> columnPair : joinColumns.entrySet()) { TblColRef fromCol = columnPair.getKey(); TblColRef toCol = columnPair.getValue(); fks.add(fromCol.getName()); fkCols.add(fromCol); pks.add(toCol.getName()); pkCols.add(toCol); } JoinDesc join = new JoinDesc(); join.setForeignKey(fks.toArray(COLUMN_ARRAY_MARKER)); join.setForeignKeyColumns(fkCols.toArray(new TblColRef[fkCols.size()])); join.setPrimaryKey(pks.toArray(COLUMN_ARRAY_MARKER)); join.setPrimaryKeyColumns(pkCols.toArray(new TblColRef[pkCols.size()])); join.sortByFK(); return join; }
for (String pk : joinDesc.getPrimaryKey()) { String columnIdentity = (dataModelDesc.findTable(pk.substring(0, pk.indexOf("."))) .getTableIdentity() + pk.substring(pk.indexOf("."))).replace('.', '#'); for (String fk : joinDesc.getForeignKey()) { String columnIdentity = (dataModelDesc.findTable(fk.substring(0, fk.indexOf("."))) .getTableIdentity() + fk.substring(fk.indexOf("."))).replace('.', '#');
String pTable = j.getPrimaryKeyColumns()[0].getTable(); String factTable = cubeDesc.getFactTable(); if (factTable.equals(pTable)) { j.swapPKFK(); String fTable = j.getForeignKeyColumns()[0].getTable(); if (!factTable.equals(fTable)) { logger.info("Fact Table" + factTable + " not matched in join: " + j + " on cube " + cube.getName());
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)); } }
public boolean isPK(ColumnDesc col) { for (JoinTableDesc joinTable : model.getJoinTables()) { JoinDesc join = joinTable.getJoin(); for (TblColRef pk : join.getPrimaryKeyColumns()) { if (pk.getColumnDesc().equals(col)) return true; } } return false; }
JoinDesc join = dim.getJoin(); if (join != null) { String joinType = join.getType().toUpperCase(); String lookupTableName = dim.getTable(); LookupBytesTable btable = new LookupBytesTable(metadataManager.getTableDesc(lookupTableName), join.getPrimaryKey(), htable); lookupTables.put(lookupTableName, btable); for (TblColRef colRef : join.getForeignKeyColumns()) { fkIndice.add(colRef.getColumn().getZeroBasedIndex());
@Test public void testCiModel() { DataModelManager mgr = getInstance(getTestConfig()); DataModelDesc lm = mgr.getDataModelDesc("ci_left_join_model"); DataModelDesc im = mgr.getDataModelDesc("ci_inner_join_model"); assertSnowflakeQuality(lm); assertSnowflakeQuality(im); // check inner/left models are identical apart from the left/inner difference assertEquals(lm.getJoinTables().length, im.getJoinTables().length); for (int i = 0, n = im.getJoinTables().length; i < n; i++) { JoinTableDesc lt = lm.getJoinTables()[i]; JoinTableDesc it = im.getJoinTables()[i]; assertEquals(lt.getAlias(), it.getAlias()); assertEquals(lt.getKind(), it.getKind()); assertEquals(lt.getTable(), it.getTable()); assertArrayEquals(lt.getJoin().getForeignKey(), it.getJoin().getForeignKey()); assertArrayEquals(lt.getJoin().getPrimaryKey(), it.getJoin().getPrimaryKey()); assertTrue(lt.getJoin().isLeftJoin()); assertTrue(it.getJoin().isInnerJoin()); } assertEquals(lm.getDimensions().size(), im.getDimensions().size()); for (int i = 0, n = im.getDimensions().size(); i < n; i++) { ModelDimensionDesc ld = lm.getDimensions().get(i); ModelDimensionDesc id = im.getDimensions().get(i); assertEquals(ld.getTable(), id.getTable()); assertArrayEquals(ld.getColumns(), id.getColumns()); } assertArrayEquals(lm.getMetrics(), im.getMetrics()); }
for (org.apache.kylin.cube.model.v1.DimensionDesc dim : oldDimensions) { JoinDesc join = dim.getJoin(); if (join != null && !StringUtils.isEmpty(join.getType()) && join.getForeignKey() != null && join.getForeignKey().length > 0) { LookupDesc lookup = new LookupDesc(); lookup.setJoin(join);
@Override public int compare(DimensionDesc o1, DimensionDesc o2) { JoinDesc j1 = o2.getJoin(); JoinDesc j2 = o1.getJoin(); return Integer.valueOf(j1 != null ? j1.getPrimaryKey().length : 0).compareTo(j2 != null ? j2.getPrimaryKey().length : 0); } });
private ILookupTable getInMemLookupTable(CubeSegment cubeSegment, JoinDesc join, SnapshotTableDesc snapshotTableDesc) { String tableName = join.getPKSide().getTableIdentity(); String snapshotResPath = getSnapshotResPath(cubeSegment, tableName, snapshotTableDesc); String[] pkCols = join.getPrimaryKey(); try { SnapshotTable snapshot = getSnapshotManager().getSnapshotTable(snapshotResPath); TableDesc tableDesc = getMetadataManager().getTableDesc(tableName, cubeSegment.getProject()); return LookupProviderFactory.getInMemLookupTable(tableDesc, pkCols, snapshot); } catch (IOException e) { throw new IllegalStateException( "Failed to load lookup table " + tableName + " from snapshot " + snapshotResPath, e); } }
@Override public List<TblColRef> getAllColumns() { final Set<TblColRef> factTableColumnSet = Sets.newHashSet(); TableRef rootFactTable = getDataModel().getRootFactTable(); for (TblColRef colRef : flatDesc.getAllColumns()) { if (colRef.getTableRef().equals(rootFactTable)) { factTableColumnSet.add(colRef); } } // Add column which belongs to root fact table in join relation but lost for (JoinTableDesc joinTableDesc : getDataModel().getJoinTables()) { JoinDesc join = joinTableDesc.getJoin(); for (TblColRef colRef : join.getForeignKeyColumns()) { if (colRef.getTableRef().equals(rootFactTable)) { factTableColumnSet.add(colRef); } } } return new LinkedList<>(factTableColumnSet); }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JoinDesc other = (JoinDesc) obj; // note pk/fk are sorted, sortByFK() if (!Arrays.equals(foreignKey, other.foreignKey)) return false; if (!Arrays.equals(primaryKey, other.primaryKey)) return false; if (!Arrays.equals(foreignKeyColumns, other.foreignKeyColumns)) return false; if (!Arrays.equals(primaryKeyColumns, other.primaryKeyColumns)) return false; if (!this.type.equalsIgnoreCase(other.getType())) return false; return true; }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JoinDesc other = (JoinDesc) obj; if (!this.columnsEqualIgnoringOrder(foreignKeyColumns, other.foreignKeyColumns)) return false; if (!this.columnsEqualIgnoringOrder(primaryKeyColumns, other.primaryKeyColumns)) return false; if (!this.type.equalsIgnoreCase(other.getType())) return false; return true; }
newDim.setTable(getMetadataManager().appendDBName(newModel.getFactTable())); newDim.setColumn(dim.getJoin().getForeignKey());
public void init(Map<String, TableDesc> tables) { if (name != null) name = name.toUpperCase(); if (table != null) table = table.toUpperCase(); if (column != null) column = column.toUpperCase(); TableDesc tableDesc = tables.get(table); if (tableDesc == null) throw new IllegalStateException("Can't find table " + table + " on dimension " + name); if (hierarchy != null && hierarchy.length == 0) hierarchy = null; if (derived != null && derived.length == 0) derived = null; if (join != null) { StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); StringUtil.toUpperCaseArray(join.getPrimaryKey(), join.getPrimaryKey()); } if (hierarchy != null) { for (HierarchyDesc h : hierarchy) h.setColumn(h.getColumn().toUpperCase()); } if (derived != null) { StringUtil.toUpperCaseArray(derived, derived); } }
String pTable = j.getPrimaryKeyColumns()[0].getTable(); String factTable = cubeDesc.getFactTable(); if (factTable.equals(pTable)) { j.swapPKFK(); String fTable = j.getForeignKeyColumns()[0].getTable(); if (!factTable.equals(fTable)) { logger.info("Fact Table" + factTable + " not matched in join: " + j + " on cube " + cube.getName());
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)); } }