aggstar.java
来自「数据仓库展示程序」· Java 代码 · 共 1,134 行 · 第 1/3 页
JAVA
1,134 行
return name;
}
/**
* Get the enclosing AggStar.Table.
*
* @return
*/
public AggStar.Table getTable() {
return AggStar.Table.this;
}
/**
* Get the bit possition associted with this column. This has the
* same value as this column's RolapStar.Column.
*
* @return
*/
public int getBitPosition() {
return bitPosition;
}
/**
* Return true if this is a numeric column.
*
* @return
*/
public boolean isNumeric() {
return isNumeric;
}
public SqlQuery getSqlQuery() {
return getTable().getAggStar().getSqlQuery();
}
public MondrianDef.Expression getExpression() {
return expression;
}
/**
* This is used to create, generally, an SQL query segment of the
* form: tablename.columnname.
*
* @param query
* @return
*/
public String getExpression(final SqlQuery query) {
return getExpression().getExpression(query);
}
public String toString() {
StringWriter sw = new StringWriter(256);
PrintWriter pw = new PrintWriter(sw);
print(pw, "");
pw.flush();
return sw.toString();
}
public void print(final PrintWriter pw, final String prefix) {
SqlQuery sqlQuery = getSqlQuery();
pw.print(prefix);
pw.print(getName());
pw.print(" (");
pw.print(getBitPosition());
pw.print("): ");
pw.print(getExpression(sqlQuery));
}
}
/**
* This class is used for holding dimension level information.
* Both DimTables and FactTables can have Level columns.
*/
final class Level extends Column {
Level(final String name,
final MondrianDef.Expression expression,
final boolean isNumeric,
final int bitPosition) {
super(name, expression, isNumeric, bitPosition);
}
}
/** The name of the table in the database. */
private final String name;
private final MondrianDef.Relation relation;
protected final List levels;
protected List children;
Table(final String name, final MondrianDef.Relation relation) {
this.name = name;
this.relation = relation;
this.levels = new ArrayList();
this.children = Collections.EMPTY_LIST;
}
/**
* Return the name of the table in the database.
*
* @return
*/
public String getName() {
return name;
}
/**
* Return true if this table has a parent table (FactTable instances
* do not have parent tables, all other do).
*
* @return
*/
public abstract boolean hasParent();
/**
* Get the parent table (returns null if this table is a FactTable).
*
* @return
*/
public abstract Table getParent();
/**
* Return true if this table has a join condition (only DimTables have
* join conditions, FactTable instances do not).
*
* @return
*/
public abstract boolean hasJoinCondition();
public abstract Table.JoinCondition getJoinCondition();
public MondrianDef.Relation getRelation() {
return relation;
}
/**
* Get this table's enclosing AggStar.
*
* @return
*/
protected AggStar getAggStar() {
return AggStar.this;
}
/**
* Get a SqlQuery object.
*
* @return
*/
protected SqlQuery getSqlQuery() {
return getAggStar().getSqlQuery();
}
/**
* Get a java.sql.Connection.
*
* @return
*/
public Connection getJdbcConnection() {
return getAggStar().getJdbcConnection();
}
/**
* Add a Level column.
*
* @param level
*/
protected void addLevel(final AggStar.Table.Level level) {
this.levels.add(level);
}
/**
* Get all Level columns.
*
* @return
*/
public Iterator getLevels() {
return levels.iterator();
}
/**
* Add a child DimTable table.
*
* @param child
*/
protected void addTable(final DimTable child) {
if (children == Collections.EMPTY_LIST) {
children = new ArrayList();
}
children.add(child);
}
/**
* Get all child tables.
*
* @return
*/
public Iterator getChildren() {
return children.iterator();
}
/**
* Convert a RolapStar.Table into a AggStar.DimTable as well as
* converting all columns and child tables. If the
* rightJoinConditionColumnName parameter is null, then the table's namd
* and the rTable parameter's condition left condition's column name
* are used to form the join condition's left expression.
*
* @param rTable
* @param rightJoinConditionColumnName
* @return
*/
protected AggStar.DimTable convertTable(final RolapStar.Table rTable,
final String rightJoinConditionColumnName) {
String tableName = rTable.getAlias();
MondrianDef.Relation relation = rTable.getRelation();
RolapStar.Condition rjoinCondition = rTable.getCondition();
MondrianDef.Expression rleft = rjoinCondition.getLeft();
MondrianDef.Expression rright = rjoinCondition.getRight();
MondrianDef.Expression left = null;
if (rightJoinConditionColumnName != null) {
left = new MondrianDef.Column(getName(),
rightJoinConditionColumnName);
} else {
if (rleft instanceof MondrianDef.Column) {
MondrianDef.Column rcolumn = (MondrianDef.Column) rleft;
left = new MondrianDef.Column(getName(), rcolumn.name);
} else {
// RME TODO can we catch this during validation
String msg = mres.BadRolapStarLeftJoinCondition.str(
"AggStar.Table",
rleft.getClass().getName(), left.toString());
getLogger().warn(msg);
}
}
JoinCondition joinCondition = new JoinCondition(left, rright);
DimTable dimTable =
new DimTable(this, tableName, relation, joinCondition);
dimTable.convertColumns(rTable);
dimTable.convertChildren(rTable);
return dimTable;
}
/**
* Convert a RolapStar.Table table's columns into
* AggStar.Table.Level columns.
*
* @param rTable
*/
protected void convertColumns(final RolapStar.Table rTable) {
// add level columns
for (Iterator it = rTable.getColumns(); it.hasNext(); ) {
RolapStar.Column column = (RolapStar.Column) it.next();
String name = column.getName();
MondrianDef.Expression expression = column.getExpression();
boolean isNumeric = column.isNumeric();
int bitPosition = column.getBitPosition();
Level level = new Level(name,
expression,
isNumeric,
bitPosition);
addLevel(level);
}
}
/**
* Convert the child tables of a RolapStar.Table into
* child AggStar.DimTable tables.
*
* @param rTable
*/
protected void convertChildren(final RolapStar.Table rTable) {
// add children tables
for (Iterator it = rTable.getChildren(); it.hasNext(); ) {
RolapStar.Table rTableChild = (RolapStar.Table) it.next();
AggStar.DimTable dimChild = convertTable(rTableChild, null);
addTable(dimChild);
}
}
/**
* This is a copy of the code found in RolapStar used to generate an SQL
* query.
*
* @param query
* @param failIfExists
* @param joinToParent
*/
public void addToFrom(final SqlQuery query,
final boolean failIfExists,
final boolean joinToParent) {
query.addFrom(relation, name, failIfExists);
if (joinToParent) {
if (hasParent()) {
getParent().addToFrom(query, failIfExists, joinToParent);
}
if (hasJoinCondition()) {
query.addWhere(getJoinCondition().toString(query));
}
}
}
public String toString() {
StringWriter sw = new StringWriter(256);
PrintWriter pw = new PrintWriter(sw);
print(pw, "");
pw.flush();
return sw.toString();
}
public abstract void print(final PrintWriter pw, final String prefix);
}
/**
* This is an aggregate fact table.
*/
public class FactTable extends Table {
/**
* This is a Column that is a Measure (contains an aggregator).
*/
public class Measure extends Table.Column {
private final RolapAggregator aggregator;
Measure(final String name,
final MondrianDef.Expression expression,
final boolean isNumeric,
final int bitPosition,
final RolapAggregator aggregator) {
super(name, expression, isNumeric, bitPosition);
this.aggregator = aggregator;
}
/**
* Get this Measure's RolapAggregator.
*
* @return
*/
public RolapAggregator getAggregator() {
return aggregator;
}
/**
* Get this Measure's sql expression which is an aggregator.
*
* @param query
* @return
*/
public String getExpression(final SqlQuery query) {
String expr = getExpression().getExpression(query);
return getAggregator().getExpression(expr);
}
}
private Column factCountColumn;
private final List measures;
private final int totalColumnSize;
private int numberOfRows;
FactTable(final JdbcSchema.Table aggTable) {
this(aggTable.getName(),
aggTable.table,
aggTable.getTotalColumnSize(),
aggTable.getNumberOfRows());
}
FactTable(final String name,
final MondrianDef.Relation relation,
final int totalColumnSize,
final int numberOfRows) {
super(name, relation);
this.totalColumnSize = totalColumnSize;
this.measures = new ArrayList();
this.numberOfRows = numberOfRows;
}
public Table getParent() {
return null;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?