aggstar.java
来自「数据仓库展示程序」· Java 代码 · 共 1,134 行 · 第 1/3 页
JAVA
1,134 行
public boolean hasParent() {
return false;
}
public boolean hasJoinCondition() {
return false;
}
public Table.JoinCondition getJoinCondition() {
return null;
}
/**
* Get the volume of the table (now of rows * size of a row).
*
* @return
*/
public int getVolume() {
return getTotalColumnSize() * getNumberOfRows();
}
/**
* Get the total size of all columns in a row.
*
* @return
*/
public int getTotalColumnSize() {
return totalColumnSize;
}
/**
* Get the number of rows in this aggregate table.
*
* @return
*/
public int getNumberOfRows() {
if (numberOfRows == -1) {
makeNumberOfRows();
}
return numberOfRows;
}
/**
* This is for testing ONLY.
*
* @param numberOfRows
*/
void setNumberOfRows(int numberOfRows) {
this.numberOfRows = numberOfRows;
}
/**
* Get all Measures.
*
* @return Iterator over measures,
*/
public Iterator getMeasures() {
return measures.iterator();
}
/**
* Get all columns.
*
* @return Iterator over columns,
*/
public Iterator getColumns() {
List list = new ArrayList();
list.addAll(measures);
list.addAll(levels);
for (Iterator it = getChildren(); it.hasNext(); ) {
DimTable dimTable = (DimTable) it.next();
dimTable.addColumnsToList(list);
}
return list.iterator();
}
/**
* For a foreign key usage create a child DimTable table.
*
* @param usage
*/
private void loadForeignKey(final JdbcSchema.Table.Column.Usage usage) {
if (usage.rTable != null) {
DimTable child = convertTable(usage.rTable,
usage.rightJoinConditionColumnName);
addTable(child);
} else {
// it a column thats not a measure or foreign key - it must be
// a non-shared dimension
// See: AggTableManager.java
JdbcSchema.Table.Column column = usage.getColumn();
String name = column.getName();
String symbolicName = usage.getSymbolicName();
if (symbolicName == null) {
symbolicName = name;
}
MondrianDef.Expression expression =
new MondrianDef.Column(getName(), name);
boolean isNumeric = column.isNumeric();
RolapStar.Column rColumn = usage.rColumn;
if (rColumn == null) {
String msg = "loadForeignKey: for column " +
name +
", rColumn == null";
getLogger().warn(msg);
} else {
int bitPosition = rColumn.getBitPosition();
// RME Note: this should be a Level Object, not a Column
Column c = new Column(symbolicName,
expression,
isNumeric,
bitPosition);
}
}
}
/**
* Given a usage of type measure, create a Measure column.
*
* @param usage
*/
private void loadMeasure(final JdbcSchema.Table.Column.Usage usage) {
String name = usage.getColumn().getName();
String symbolicName = usage.getSymbolicName();
if (symbolicName == null) {
symbolicName = name;
}
boolean isNumeric = usage.getColumn().isNumeric();
RolapAggregator aggregator = usage.getAggregator();
MondrianDef.Expression expression = null;
if (usage.getColumn().hasUsage(JdbcSchema.FOREIGN_KEY_COLUMN_USAGE)
&& ! aggregator.isDistinct()) {
expression = factCountColumn.getExpression();
} else {
expression = new MondrianDef.Column(getName(), name);
}
int bitPosition = usage.rMeasure.getBitPosition();
Measure aggMeasure = new Measure(symbolicName,
expression,
isNumeric,
bitPosition,
aggregator);
measures.add(aggMeasure);
}
/**
* Create a fact_count column for a usage of type fact count.
*
* @param usage
*/
private void loadFactCount(final JdbcSchema.Table.Column.Usage usage) {
String name = usage.getColumn().getName();
String symbolicName = usage.getSymbolicName();
if (symbolicName == null) {
symbolicName = name;
}
MondrianDef.Expression expression =
new MondrianDef.Column(getName(), name);
boolean isNumeric = usage.getColumn().isNumeric();
int bitPosition = -1;
Column aggColumn = new Column(symbolicName,
expression,
isNumeric,
bitPosition);
factCountColumn = aggColumn;
}
/**
* Given a usage of type level, create a Level column.
*
* @param usage
*/
private void loadLevel(final JdbcSchema.Table.Column.Usage usage) {
String name = usage.getSymbolicName();
MondrianDef.Expression expression =
new MondrianDef.Column(getName(), usage.levelColumnName);
boolean isNumeric = usage.getColumn().isNumeric();
int bitPosition = usage.rColumn.getBitPosition();
Level level = new Level(name,
expression,
isNumeric,
bitPosition);
addLevel(level);
}
public void print(final PrintWriter pw, final String prefix) {
pw.print(prefix);
pw.println("Table:");
String subprefix = prefix + " ";
String subsubprefix = subprefix + " ";
pw.print(subprefix);
pw.print("name=");
pw.println(getName());
if (getRelation() != null) {
pw.print(subprefix);
pw.print("relation=");
pw.println(getRelation());
}
pw.print(subprefix);
pw.print("numberofrows=");
pw.println(getNumberOfRows());
pw.print(subprefix);
pw.println("FactCount:");
factCountColumn.print(pw, subsubprefix);
pw.println();
pw.print(subprefix);
pw.println("Measures:");
for (Iterator it = getMeasures(); it.hasNext(); ) {
Column column = (Column) it.next();
column.print(pw, subsubprefix);
pw.println();
}
pw.print(subprefix);
pw.println("Levels:");
for (Iterator it = getLevels(); it.hasNext(); ) {
Level level = (Level) it.next();
level.print(pw, subsubprefix);
pw.println();
}
for (Iterator it = getChildren(); it.hasNext(); ) {
DimTable child = (DimTable) it.next();
child.print(pw, subprefix);
}
}
private void makeNumberOfRows() {
SqlQuery query = getSqlQuery();
query.addSelect("count(*)");
query.addFrom(getRelation(), getName(), false);
Connection conn = getJdbcConnection();
try {
ResultSet rs = null;
try {
rs = RolapUtil.executeQuery(conn, query.toString(),
"AggStar.FactTable.makeNumberOfRows");
if (rs.next()) {
numberOfRows = rs.getInt(1);
} else {
String msg = mres.SqlQueryFailed.str(
"AggStar.FactTable.makeNumberOfRows",
query.toString());
getLogger().warn(msg);
// set to large number so that this table is never used
numberOfRows = Integer.MAX_VALUE/getTotalColumnSize();
}
} finally {
if (rs != null) {
rs.close();
}
}
} catch (SQLException ex) {
// ignore
getLogger().error(ex);
} finally {
try {
conn.close();
} catch (SQLException ex) {
// ignore
}
}
}
}
/**
* This class represents a dimension table.
*/
public class DimTable extends Table {
private final Table parent;
private final JoinCondition joinCondition;
DimTable(final Table parent,
final String name,
final MondrianDef.Relation relation,
final JoinCondition joinCondition) {
super(name, relation);
this.parent = parent;
this.joinCondition = joinCondition;
}
public Table getParent() {
return parent;
}
public boolean hasParent() {
return true;
}
public boolean hasJoinCondition() {
return true;
}
public Table.JoinCondition getJoinCondition() {
return joinCondition;
}
/**
* Add all of this Table's columns to the list parameter and then add
* all child table columns.
*
* @param list
*/
public void addColumnsToList(final List list) {
list.addAll(levels);
for (Iterator it = getChildren(); it.hasNext(); ) {
DimTable dimTable = (DimTable) it.next();
dimTable.addColumnsToList(list);
}
}
public void print(final PrintWriter pw, final String prefix) {
pw.print(prefix);
pw.println("Table:");
String subprefix = prefix + " ";
String subsubprefix = subprefix + " ";
pw.print(subprefix);
pw.print("name=");
pw.println(getName());
if (getRelation() != null) {
pw.print(subprefix);
pw.print("relation=");
pw.println(getRelation());
}
pw.print(subprefix);
pw.println("Levels:");
for (Iterator it = getLevels(); it.hasNext(); ) {
Level level = (Level) it.next();
level.print(pw, subsubprefix);
pw.println();
}
joinCondition.print(pw, subprefix);
for (Iterator it = getChildren(); it.hasNext(); ) {
DimTable child = (DimTable) it.next();
child.print(pw, subprefix);
}
}
}
public String toString() {
StringWriter sw = new StringWriter(256);
PrintWriter pw = new PrintWriter(sw);
print(pw, "");
pw.flush();
return sw.toString();
}
/**
* Print this AggStar.
*
* @param pw
* @param prefix
*/
public void print(final PrintWriter pw, final String prefix) {
pw.print(prefix);
pw.println("AggStar:");
String subprefix = prefix + " ";
pw.print(subprefix);
pw.println(bitKey);
aggTable.print(pw, subprefix);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?