agggen.java
来自「数据仓库展示程序」· Java 代码 · 共 983 行 · 第 1/3 页
JAVA
983 行
JdbcSchema.Table.Column.Usage tmpUsage =
(JdbcSchema.Table.Column.Usage) uit.next();
if ((tmpUsage.getAggregator() == aggregator) &&
tmpUsage.getSymbolicName().equals(rColumn.getName())) {
usage = tmpUsage;
break;
}
}
}
if (usage == null) {
usage = c.newUsage(JdbcSchema.MEASURE_COLUMN_USAGE);
usage.setAggregator(aggregator);
usage.setSymbolicName(rColumn.getName());
}
measures.add(usage);
}
// If we got to here, then everything is ok.
isReady = true;
}
private boolean addSpecialCollapsedColumn(final JdbcSchema db,
final RolapStar.Column rColumn) {
String rname = getRolapStarColumnName(rColumn);
if (rname == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Special Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get column name for RolapStar.Column: ");
buf.append(rColumn);
getLogger().warn(buf.toString());
return false;
}
// this is in fact the fact table.
RolapStar.Table rt = rColumn.getTable();
JdbcSchema.Table jt = getTable(db, rt);
if (jt == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Special Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get jdbc schema table ");
buf.append("for RolapStar.Table with alias \"");
buf.append(rt.getAlias());
buf.append("\"");
getLogger().warn(buf.toString());
return false;
}
try {
jt.load();
} catch (SQLException ex) {
getLogger().error(ex);
return false;
}
List list = (List) collapsedColumnUsages.get(rt);
if (list == null) {
list = new ArrayList();
collapsedColumnUsages.put(rt, list);
}
JdbcSchema.Table.Column c = getColumn(jt, rname);
if (c == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Special Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get jdbc schema column ");
buf.append("for RolapStar.Table with alias \"");
buf.append(rt.getAlias());
buf.append("\" and column name \"");
buf.append(rname);
buf.append("\"");
getLogger().warn(buf.toString());
return false;
}
// NOTE: this creates a new usage for the fact table
// I do not know if this is a problem is AggGen is run before
// Mondrian uses aggregate tables.
list.add(c.newUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE));
RolapStar.Column prColumn = rColumn;
while (prColumn.getParentColumn() != null) {
prColumn = prColumn.getParentColumn();
rname = getRolapStarColumnName(prColumn);
if (rname == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Special Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get parent column name");
buf.append("for RolapStar.Column \"");
buf.append(rname);
buf.append("\" for RolapStar.Table with alias \"");
buf.append(rt.getAlias());
buf.append("\"");
getLogger().warn(buf.toString());
return false;
}
c = getColumn(jt, rname);
if (c == null) {
getLogger().warn("Can not find column: " +rname);
break;
}
// NOTE: this creates a new usage for the fact table
// I do not know if this is a problem is AggGen is run before
// Mondrian uses aggregate tables.
list.add(c.newUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE));
}
return true;
}
private boolean addCollapsedColumn(final JdbcSchema db,
final RolapStar.Column rColumn) {
// TODO: if column is "id" column, then there is no collapse
String rname = getRolapStarColumnName(rColumn);
if (rname == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get column name for RolapStar.Column: ");
buf.append(rColumn);
getLogger().warn(buf.toString());
return false;
}
RolapStar.Table rt = rColumn.getTable();
JdbcSchema.Table jt = getTable(db, rt);
if (jt == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get jdbc schema table ");
buf.append("for RolapStar.Table with alias \"");
buf.append(rt.getAlias());
buf.append("\"");
getLogger().warn(buf.toString());
return false;
}
try {
jt.load();
} catch (SQLException ex) {
getLogger().error(ex);
return false;
}
//CG guarantee the columns has been loaded before looking up them
try {
jt.load();
} catch (SQLException sqle) {
getLogger().error(sqle);
return false;
}
// if this is a dimension table, then walk down the levels until
// we hit the current column
List list = new ArrayList();
for (Iterator it = rt.getColumns(); it.hasNext(); ) {
RolapStar.Column rc = (RolapStar.Column) it.next();
// do not include name columns
if (rc.isNameColumn()) {
continue;
}
String name = getRolapStarColumnName(rc);
if (name == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("Adding Collapsed Column: ");
buf.append("For fact table \"");
buf.append(getFactTableName());
buf.append("\", could not get column name");
buf.append(" for RolapStar.Column \"");
buf.append(rc);
buf.append("\" for RolapStar.Table with alias \"");
buf.append(rt.getAlias());
buf.append("\"");
getLogger().warn(buf.toString());
return false;
}
JdbcSchema.Table.Column c = getColumn(jt, name);
if (c == null) {
getLogger().warn("Can not find column: " +name);
break;
}
JdbcSchema.Table.Column.Usage usage =
c.newUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE);
usage.usagePrefix = rc.getUsagePrefix();
list.add(usage);
if (rname.equals(name)) {
break;
}
}
// may already be there so only enter if new list is bigger
List l = (List) collapsedColumnUsages.get(rt);
if ((l == null) || (l.size() < list.size())) {
collapsedColumnUsages.put(rt, list);
}
return true;
}
private static final String AGG_LOST_PREFIX = "agg_l_XXX_";
String makeLostAggregateTableName(String factTableName) {
StringBuffer buf = new StringBuffer(64);
buf.append(AGG_LOST_PREFIX);
buf.append(factTableName);
return buf.toString();
}
private static final String AGG_COLLAPSED_PREFIX = "agg_c_XXX_";
String makeCollapsedAggregateTableName(String factTableName) {
StringBuffer buf = new StringBuffer(64);
buf.append(AGG_COLLAPSED_PREFIX);
buf.append(factTableName);
return buf.toString();
}
/**
* Return a String containing the sql code to create a lost dimension
* table.
*
* @return lost dimension sql code
*/
public String createLost() {
StringWriter sw = new StringWriter(512);
PrintWriter pw = new PrintWriter(sw);
String prefix = " ";
String factTableName = getFactTableName();
pw.print("CREATE TABLE ");
pw.print(makeLostAggregateTableName(getFactTableName()));
pw.println(" (");
// do foreign keys
for (Iterator it = notLostColumnUsages.iterator(); it.hasNext(); ) {
JdbcSchema.Table.Column.Usage usage =
(JdbcSchema.Table.Column.Usage) it.next();
addColumnCreate(pw, prefix, usage);
}
// do measures
for (Iterator it = measures.iterator(); it.hasNext(); ) {
JdbcSchema.Table.Column.Usage usage =
(JdbcSchema.Table.Column.Usage) it.next();
addColumnCreate(pw, prefix, usage);
}
// do fact_count
pw.print(prefix);
pw.print(getFactCount());
pw.println(" INTEGER NOT NULL");
pw.println(");");
return sw.toString();
}
/**
* Return the sql code to populate a lost dimension table from the fact
* table.
*
* @return
*/
public String insertIntoLost() {
StringWriter sw = new StringWriter(512);
PrintWriter pw = new PrintWriter(sw);
String prefix = " ";
String factTableName = getFactTableName();
SqlQuery sqlQuery = getSqlQuery();
pw.print("INSERT INTO ");
pw.print(makeLostAggregateTableName(getFactTableName()));
pw.println(" (");
for (Iterator it = notLostColumnUsages.iterator(); it.hasNext(); ) {
JdbcSchema.Table.Column.Usage usage =
(JdbcSchema.Table.Column.Usage) it.next();
JdbcSchema.Table.Column c = usage.getColumn();
pw.print(prefix);
pw.print(c.getName());
pw.println(',');
}
for (Iterator it = measures.iterator(); it.hasNext(); ) {
JdbcSchema.Table.Column.Usage usage =
(JdbcSchema.Table.Column.Usage) it.next();
JdbcSchema.Table.Column c = usage.getColumn();
pw.print(prefix);
String name = getUsageName(usage);
pw.print(name);
pw.println(',');
}
// do fact_count
pw.print(prefix);
pw.print(getFactCount());
pw.println(")");
pw.println("SELECT");
for (Iterator it = notLostColumnUsages.iterator(); it.hasNext(); ) {
JdbcSchema.Table.Column.Usage usage =
(JdbcSchema.Table.Column.Usage) it.next();
JdbcSchema.Table.Column c = usage.getColumn();
pw.print(prefix);
pw.print(sqlQuery.getDialect().quoteIdentifier(factTableName, c.getName()));
pw.print(" AS ");
pw.print(sqlQuery.getDialect().quoteIdentifier(c.getName()));
pw.println(',');
}
for (Iterator it = measures.iterator(); it.hasNext(); ) {
JdbcSchema.Table.Column.Usage usage =
(JdbcSchema.Table.Column.Usage) it.next();
JdbcSchema.Table.Column c = usage.getColumn();
RolapAggregator agg = usage.getAggregator();
pw.print(prefix);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?