public List<String> getPkValuesIfIsFk(ColumnDesc fk) throws IOException { JoinTableDesc[] joinTables = model.getJoinTables(); for (int i = 0; i < joinTables.length; i++) { JoinTableDesc joinTable = joinTables[i]; ColumnDesc pk = findPk(joinTable, fk); if (pk == null) continue; List<String> pkValues = getPkValues(pk); if (pkValues != null) return pkValues; } return null; }
public void generate() throws IOException { Set<TableDesc> generated = new HashSet<>(); Set<TableDesc> allTableDesc = new LinkedHashSet<>(); JoinTableDesc[] allTables = model.getJoinTables(); for (int i = allTables.length - 1; i >= -1; i--) { // reverse order needed for FK generation TableDesc table = (i == -1) ? model.getRootFactTable().getTableDesc() : allTables[i].getTableRef().getTableDesc(); allTableDesc.add(table); if (generated.contains(table)) continue; logger.info(String.format(Locale.ROOT, "generating data for %s", table)); boolean gen = generateTable(table); if (gen) generated.add(table); } generateDDL(allTableDesc); }
.append(" as ").append(quoteIdentifier(rootTable.getAlias())).append(sep); for (JoinTableDesc lookupDesc : model.getJoinTables()) { JoinDesc join = lookupDesc.getJoin(); if (join != null && join.getType().equals("") == false) {
if (joinsTree.matchNum(originJoinsTree) != originDataModelDesc.getJoinTables().length + 1) checkRet.append("The join shouldn't be modified in this model.");
public int getCost(SQLDigest digest) { int calculatedCost = cost; //the number of dimensions is not as accurate as number of row key cols calculatedCost += getRowKeyColumnCount() * COST_WEIGHT_DIMENSION + getMeasures().size() * COST_WEIGHT_MEASURE; for (JoinTableDesc joinTable : this.getModel().getJoinTables()) { // more tables, more cost if (joinTable.getJoin().isInnerJoin()) { // inner join cost is bigger than left join, as it will filter some records calculatedCost += COST_WEIGHT_INNER_JOIN; } } return calculatedCost; }
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; }
@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 int getCost() { if (getDescriptor() == null) { //in case not initialized return 0; } int countedDimensionNum = getRowKeyColumnCount(); int c = countedDimensionNum * COST_WEIGHT_DIMENSION + getMeasures().size() * COST_WEIGHT_MEASURE; DataModelDesc model = getModel(); if (model == null) { //in case broken cube return 0; } for (JoinTableDesc join : model.getJoinTables()) { if (join.getJoin().isInnerJoin()) c += CubeInstance.COST_WEIGHT_INNER_JOIN; } return c; }
for (JoinTableDesc joinTableDesc : dataModelDesc.getJoinTables()) { JoinDesc joinDesc = joinTableDesc.getJoin(); for (String pk : joinDesc.getPrimaryKey()) {
for (JoinTableDesc joinTable : model.getJoinTables()) { JoinDesc join = joinTable.getJoin(); int n = join.getForeignKeyColumns().length;
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); } }
for (JoinTableDesc lookupDesc : flatDesc.getDataModel().getJoinTables()) { TableDesc tableDesc = metadataManager.getTableDesc(lookupDesc.getTable(), prj); if (lookupDesc.getKind() == DataModelDesc.TableKind.LOOKUP && tableDesc.isView()) {
@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()); }
public DataModelDescResponse(DataModelDesc dataModelDesc) { setUuid(dataModelDesc.getUuid()); setLastModified(dataModelDesc.getLastModified()); setVersion(dataModelDesc.getVersion()); setName(dataModelDesc.getName()); setOwner(dataModelDesc.getOwner()); setDraft(dataModelDesc.isDraft()); setDescription(dataModelDesc.getDescription()); setRootFactTableName(dataModelDesc.getRootFactTableName()); setJoinTables(dataModelDesc.getJoinTables()); setDimensions(dataModelDesc.getDimensions()); setMetrics(dataModelDesc.getMetrics()); setFilterCondition(dataModelDesc.getFilterCondition()); if (dataModelDesc.getPartitionDesc() != null) setPartitionDesc(PartitionDesc.getCopyOf(dataModelDesc.getPartitionDesc())); setCapacity(dataModelDesc.getCapacity()); } }
public List<String> getPkValuesIfIsFk(ColumnDesc fk) throws IOException { JoinTableDesc[] joinTables = model.getJoinTables(); for (int i = 0; i < joinTables.length; i++) { JoinTableDesc joinTable = joinTables[i]; ColumnDesc pk = findPk(joinTable, fk); if (pk == null) continue; List<String> pkValues = getPkValues(pk); if (pkValues != null) return pkValues; } return null; }
public void generate() throws IOException { Set<TableDesc> generated = new HashSet<>(); Set<TableDesc> allTableDesc = new LinkedHashSet<>(); JoinTableDesc[] allTables = model.getJoinTables(); for (int i = allTables.length - 1; i >= -1; i--) { // reverse order needed for FK generation TableDesc table = (i == -1) ? model.getRootFactTable().getTableDesc() : allTables[i].getTableRef().getTableDesc(); allTableDesc.add(table); if (generated.contains(table)) continue; logger.info(String.format(Locale.ROOT, "generating data for %s", table)); boolean gen = generateTable(table); if (gen) generated.add(table); } generateDDL(allTableDesc); }
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; }
public int getCost(SQLDigest digest) { int calculatedCost = cost; //the number of dimensions is not as accurate as number of row key cols calculatedCost += getRowKeyColumnCount() * COST_WEIGHT_DIMENSION + getMeasures().size() * COST_WEIGHT_MEASURE; for (JoinTableDesc joinTable : this.getModel().getJoinTables()) { // more tables, more cost if (joinTable.getJoin().isInnerJoin()) { // inner join cost is bigger than left join, as it will filter some records calculatedCost += COST_WEIGHT_INNER_JOIN; } } return calculatedCost; }
@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 int getCost() { if (getDescriptor() == null) { //in case not initialized return 0; } int countedDimensionNum = getRowKeyColumnCount(); int c = countedDimensionNum * COST_WEIGHT_DIMENSION + getMeasures().size() * COST_WEIGHT_MEASURE; DataModelDesc model = getModel(); if (model == null) { //in case broken cube return 0; } for (JoinTableDesc join : model.getJoinTables()) { if (join.getJoin().isInnerJoin()) c += CubeInstance.COST_WEIGHT_INNER_JOIN; } return c; }