rolapcube.java
来自「数据仓库展示程序」· Java 代码 · 共 1,687 行 · 第 1/5 页
JAVA
1,687 行
}
}
public void clearCache() {
if (isVirtual()) {
// Currently a virtual cube does not keep a list of all of its
// base cubes, so we must just flush all of them.
schema.flushRolapStarCaches();
} else {
star.clearCache();
}
}
/**
* Returns this cube's underlying star schema.
*/
public RolapStar getStar() {
return star;
}
private void createUsages(RolapDimension dimension,
MondrianDef.CubeDimension xmlCubeDimension) {
// RME level may not be in all hierarchies
// If one uses the DimensionUsage attribute "level", which level
// in a hierarchy to join on, and there is more than one hierarchy,
// then a HierarchyUsage can not be created for the hierarchies
// that do not have the level defined.
RolapHierarchy[] hierarchies =
(RolapHierarchy[]) dimension.getHierarchies();
if (hierarchies.length == 1) {
// Only one, so let lower level error checking handle problems
createUsage(hierarchies[0], xmlCubeDimension);
} else if ((xmlCubeDimension instanceof MondrianDef.DimensionUsage) &&
(((MondrianDef.DimensionUsage) xmlCubeDimension).level != null)) {
// More than one, make sure if we are joining by level, that
// at least one hierarchy can and those that can not are
// not registered
MondrianDef.DimensionUsage du =
(MondrianDef.DimensionUsage) xmlCubeDimension;
int cnt = 0;
for (int j = 0; j < hierarchies.length; j++) {
RolapHierarchy hierarchy = hierarchies[j];
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube<init>: hierarchy="
+hierarchy.getName());
}
RolapLevel joinLevel = (RolapLevel)
Util.lookupHierarchyLevel(hierarchy, du.level);
if (joinLevel == null) {
continue;
}
createUsage(hierarchy, xmlCubeDimension);
cnt++;
}
if (cnt == 0) {
// None of the hierarchies had the level, let lower level
// detect and throw error
createUsage(hierarchies[0], xmlCubeDimension);
}
} else {
// just do it
for (int j = 0; j < hierarchies.length; j++) {
RolapHierarchy hierarchy = hierarchies[j];
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube<init>: hierarchy="
+hierarchy.getName());
}
createUsage(hierarchy, xmlCubeDimension);
}
}
}
synchronized void createUsage(
RolapHierarchy hierarchy,
MondrianDef.CubeDimension cubeDim) {
HierarchyUsage usage = new HierarchyUsage(this, hierarchy, cubeDim);
for (Iterator it = hierarchyUsages.iterator(); it.hasNext(); ) {
HierarchyUsage hierUsage = (HierarchyUsage) it.next();
if (hierUsage.equals(usage)) {
getLogger().warn("RolapCube.createUsage: duplicate " +hierUsage);
return;
}
}
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.createUsage: register " +usage);
}
this.hierarchyUsages.add(usage);
}
private synchronized HierarchyUsage getUsageByName(String name) {
for (Iterator it = hierarchyUsages.iterator(); it.hasNext(); ) {
HierarchyUsage hierUsage = (HierarchyUsage) it.next();
if (hierUsage.getFullName().equals(name)) {
return hierUsage;
}
}
return null;
}
/**
* A Hierarchy may have one or more HierarchyUsages. This method returns
* an array holding the one or more usages associated with a Hierarchy.
* The HierarchyUsages hierarchyName attribute always equals the name
* attribute of the Hierarchy.
*
* @param hierarchy
* @return an HierarchyUsages array with 0 or more members.
*/
public synchronized HierarchyUsage[] getUsages(Hierarchy hierarchy) {
String name = hierarchy.getName();
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsages: name="+name);
}
HierarchyUsage hierUsage = null;
List list = null;
for (Iterator it = hierarchyUsages.iterator(); it.hasNext(); ) {
HierarchyUsage hu = (HierarchyUsage) it.next();
if (hu.getHierarchyName().equals(name)) {
if (list != null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsages: "
+"add list HierarchyUsage.name="+hu.getName());
}
list.add(hu);
} else if (hierUsage == null) {
hierUsage = hu;
} else {
list = new ArrayList();
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsages: "
+ "add list hierUsage.name="
+ hierUsage.getName()
+ ", hu.name="
+ hu.getName());
}
list.add(hierUsage);
list.add(hu);
hierUsage = null;
}
}
}
if (hierUsage != null) {
return new HierarchyUsage[] { hierUsage };
} else if (list != null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsages: return list");
}
return (HierarchyUsage[])
list.toArray(new HierarchyUsage[list.size()]);
} else {
return new HierarchyUsage[0];
}
}
/**
* Looks up all of the HierarchyUsages with the same "source" returning
* an array of HierarchyUsage of length 0 or more.
*
* @param source
* @return array of HierarchyUsage (HierarchyUsage[]) - never null.
*/
synchronized HierarchyUsage[] getUsagesBySource(String source) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsagesBySource: source="+source);
}
HierarchyUsage hierUsage = null;
List list = null;
for (Iterator it = hierarchyUsages.iterator(); it.hasNext(); ) {
HierarchyUsage hu = (HierarchyUsage) it.next();
String s = hu.getSource();
if ((s != null) && s.equals(source)) {
if (list != null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsagesBySource: "
+ "add list HierarchyUsage.name="
+ hu.getName());
}
list.add(hu);
} else if (hierUsage == null) {
hierUsage = hu;
} else {
list = new ArrayList();
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsagesBySource: "
+ "add list hierUsage.name="
+ hierUsage.getName()
+ ", hu.name="
+ hu.getName());
}
list.add(hierUsage);
list.add(hu);
hierUsage = null;
}
}
}
if (hierUsage != null) {
return new HierarchyUsage[] { hierUsage };
} else if (list != null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.getUsagesBySource: return list");
}
return (HierarchyUsage[])
list.toArray(new HierarchyUsage[list.size()]);
} else {
return new HierarchyUsage[0];
}
}
/**
* Understand this and you are no longer a novice.
*
* @param dimension
*/
void registerDimension(Dimension dimension) {
RolapStar star = getStar();
Hierarchy[] hierarchies = dimension.getHierarchies();
for (int k = 0; k < hierarchies.length; k++) {
RolapHierarchy hierarchy = (RolapHierarchy) hierarchies[k];
MondrianDef.Relation relation = hierarchy.getRelation();
if (relation == null) {
continue; // e.g. [Measures] hierarchy
}
RolapLevel[] levels = (RolapLevel[]) hierarchy.getLevels();
HierarchyUsage[] hierarchyUsages = getUsages(hierarchy);
if (hierarchyUsages.length == 0) {
if (getLogger().isDebugEnabled()) {
StringBuffer buf = new StringBuffer(64);
buf.append("RolapCube.registerDimension: ");
buf.append("hierarchyUsages == null for cube=\"");
buf.append(this.name);
buf.append("\", hierarchy=\"");
buf.append(hierarchy.getName());
buf.append("\"");
getLogger().debug(buf.toString());
}
continue;
}
for (int j = 0; j < hierarchyUsages.length; j++) {
HierarchyUsage hierarchyUsage = hierarchyUsages[j];
String usagePrefix = hierarchyUsage.getUsagePrefix();
RolapStar.Table table = star.getFactTable();
String levelName = hierarchyUsage.getLevelName();
// RME
// If a DimensionUsage has its level attribute set, then
// one wants joins to occur at that level and not below (not
// at a finer level), i.e., if you have levels: Year, Quarter,
// Month, and Day, and the level attribute is set to Month, the
// you do not want aggregate joins to include the Day level.
// By default, it is the lowest level that the fact table
// joins to, the Day level.
// To accomplish this, we reorganize the relation and then
// copy it (so that elsewhere the original relation can
// still be used), and finally, clip off those levels below
// the DimensionUsage level attribute.
// Note also, if the relation (MondrianDef.Relation) is not
// a MondrianDef.Join, i.e., the dimension is not a snowflake,
// there is a single dimension table, then this is currently
// an unsupported configuation and all bets are off.
if (relation instanceof MondrianDef.Join) {
// RME
// take out after things seem to be working
MondrianDef.Relation relationTmp1 = relation;
relation = reorder(relation, levels);
if (relation == null && getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.registerDimension: after reorder relation==null");
getLogger().debug("RolapCube.registerDimension: reorder relationTmp1="
+format(relationTmp1));
}
}
MondrianDef.Relation relationTmp2 = relation;
if (levelName != null) {
//System.out.println("RolapCube.registerDimension: levelName=" +levelName);
// When relation is a table, this does nothing. Otherwise
// it tries to arrange the joins so that the fact table
// in the RolapStar will be joining at the lowest level.
//
// Make sure the level exists
RolapLevel level =
RolapLevel.lookupLevel(levels, levelName);
if (level == null) {
StringBuffer buf = new StringBuffer(64);
buf.append("For cube \"");
buf.append(getName());
buf.append("\" and HierarchyUsage [");
buf.append(hierarchyUsage);
buf.append("], there is no level with given");
buf.append(" level name \"");
buf.append(levelName);
buf.append("\"");
throw Util.newInternal(buf.toString());
}
// If level has child, not the lowest level, then snip
// relation between level and its child so that
// joins do not include the lower levels.
// If the child level is null, then the DimensionUsage
// level attribute was simply set to the default, lowest
// level and we do nothing.
if (relation instanceof MondrianDef.Join) {
RolapLevel childLevel = (RolapLevel) level.getChildLevel();
if (childLevel != null) {
String tableName = childLevel.getTableName();
if (tableName != null) {
relation = snip(relation, tableName);
if (relation == null && getLogger().isDebugEnabled()) {
getLogger().debug("RolapCube.registerDimension: after snip relation==null");
getLogger().debug("RolapCube.registerDimension: snip relationTmp2="
+format(relationTmp2));
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?