explicitrules.java
来自「数据仓库展示程序」· Java 代码 · 共 1,597 行 · 第 1/4 页
JAVA
1,597 行
// Is the level name a duplicate
if (namesToObjects.containsKey(level.getName())) {
msgRecorder.reportError(
mres.DuplicateLevelNames.str(
msgRecorder.getContext(),
level.getName()));
} else {
namesToObjects.put(level.getName(), level);
}
// Is the level foreign key name a duplicate
if (columnsToObjects.containsKey(level.getColumnName())) {
Level l = (Level)
columnsToObjects.get(level.getColumnName());
msgRecorder.reportError(
mres.DuplicateLevelColumnNames.str(
msgRecorder.getContext(),
level.getName(),
l.getName(),
level.getColumnName()));
} else {
columnsToObjects.put(level.getColumnName(), level);
}
}
// reset names map, but keep the columns from levels
namesToObjects.clear();
for (Iterator it = measures.iterator(); it.hasNext(); ) {
Measure measure = (Measure) it.next();
measure.validate(msgRecorder);
if (namesToObjects.containsKey(measure.getName())) {
msgRecorder.reportError(
mres.DuplicateMeasureNames.str(
msgRecorder.getContext(),
measure.getName()));
continue;
} else {
namesToObjects.put(measure.getName(), measure);
}
if (columnsToObjects.containsKey(measure.getColumnName())) {
Object o = columnsToObjects.get(measure.getColumnName());
if (o instanceof Measure) {
Measure m = (Measure) o;
msgRecorder.reportError(
mres.DuplicateMeasureColumnNames.str(
msgRecorder.getContext(),
measure.getName(),
m.getName(),
measure.getColumnName()));
} else {
Level l = (Level) o;
msgRecorder.reportError(
mres.DuplicateLevelMeasureColumnNames.str(
msgRecorder.getContext(),
l.getName(),
measure.getName(),
measure.getColumnName()));
}
} else {
columnsToObjects.put(measure.getColumnName(), measure);
}
}
// reset both
namesToObjects.clear();
columnsToObjects.clear();
// Make sure that the base fact table foreign key names match
// real columns
RolapStar star = getStar();
RolapStar.Table factTable = star.getFactTable();
String tableName = factTable.getAlias();
for (Iterator it = getFKEntries(); it.hasNext(); ) {
Map.Entry e = (Map.Entry) it.next();
String baseFKName = (String) e.getKey();
String aggFKName = (String) e.getValue();
if (namesToObjects.containsKey(baseFKName)) {
msgRecorder.reportError(
mres.DuplicateFactForeignKey.str(
msgRecorder.getContext(),
baseFKName,
aggFKName));
} else {
namesToObjects.put(baseFKName, aggFKName);
}
if (columnsToObjects.containsKey(aggFKName)) {
msgRecorder.reportError(
mres.DuplicateFactForeignKey.str(
msgRecorder.getContext(),
baseFKName,
aggFKName));
} else {
columnsToObjects.put(aggFKName, baseFKName);
}
MondrianDef.Column c =
new MondrianDef.Column(tableName, baseFKName);
if (factTable.findTableWithLeftCondition(c) == null) {
msgRecorder.reportError(
mres.UnknownLeftJoinCondition.str(
msgRecorder.getContext(),
tableName,
baseFKName));
}
}
} finally {
msgRecorder.popContextName();
}
}
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) {
String subprefix = prefix + " ";
String subsubprefix = subprefix + " ";
pw.print(subprefix);
pw.print("id=");
pw.println(this.id);
pw.print(subprefix);
pw.print("ignoreCase=");
pw.println(this.ignoreCase);
pw.print(subprefix);
pw.println("Levels: [");
Iterator it = this.levels.iterator();
while (it.hasNext()) {
Level level = (Level) it.next();
level.print(pw, subsubprefix);
}
pw.print(subprefix);
pw.println("]");
pw.print(subprefix);
pw.println("Measures: [");
it = this.measures.iterator();
while (it.hasNext()) {
Measure measure = (Measure) it.next();
measure.print(pw, subsubprefix);
}
pw.print(subprefix);
pw.println("]");
}
}
static class NameTableDef extends ExplicitRules.TableDef {
/**
* Make a NameTableDef from the calalog schema.
*
* @param aggName
* @param group
* @return
*/
static ExplicitRules.NameTableDef make(final MondrianDef.AggName aggName,
final ExplicitRules.Group group) {
ExplicitRules.NameTableDef name =
new ExplicitRules.NameTableDef(aggName.getNameAttribute(),
aggName.isIgnoreCase(),
group);
ExplicitRules.TableDef.add(name, aggName);
return name;
}
private final String name;
public NameTableDef(final String name,
final boolean ignoreCase,
final ExplicitRules.Group group) {
super(ignoreCase, group);
this.name = name;
}
/**
* Does the given tableName match this NameTableDef (either exact match
* or, if set, a case insensitive match).
*
* @param tableName
* @return
*/
public boolean matches(final String tableName) {
return (this.ignoreCase)
? this.name.equals(tableName)
: this.name.equalsIgnoreCase(tableName);
}
/**
* Validate name and base class.
*
* @param msgRecorder
*/
public void validate(final MessageRecorder msgRecorder) {
msgRecorder.pushContextName("NameTableDef");
try {
checkAttributeString(msgRecorder, name, "name");
super.validate(msgRecorder);
} finally {
msgRecorder.popContextName();
}
}
public void print(final PrintWriter pw, final String prefix) {
pw.print(prefix);
pw.println("ExplicitRules.NameTableDef:");
super.print(pw, prefix);
String subprefix = prefix + " ";
pw.print(subprefix);
pw.print("name=");
pw.println(this.name);
}
}
/**
* This class matches candidate aggregate table name with a pattern.
*/
public static class PatternTableDef extends ExplicitRules.TableDef {
/**
* Make a PatternTableDef from the calalog schema.
*
* @param aggPattern
* @param group
* @return
*/
static ExplicitRules.PatternTableDef make(
final MondrianDef.AggPattern aggPattern,
final ExplicitRules.Group group) {
ExplicitRules.PatternTableDef pattern =
new ExplicitRules.PatternTableDef(aggPattern.getPattern(),
aggPattern.isIgnoreCase(),
group);
MondrianDef.AggExclude[] excludes = aggPattern.getAggExcludes();
if (excludes != null) {
for (int i = 0; i < excludes.length; i++) {
Exclude exclude = ExplicitRules.make(excludes[i]);
pattern.add(exclude);
}
}
ExplicitRules.TableDef.add(pattern, aggPattern);
return pattern;
}
private final Pattern pattern;
private List excludes;
public PatternTableDef(final String pattern,
final boolean ignoreCase,
final ExplicitRules.Group group) {
super(ignoreCase, group);
this.pattern = (this.ignoreCase)
? Pattern.compile(pattern, Pattern.CASE_INSENSITIVE)
: Pattern.compile(pattern);
this.excludes = Collections.EMPTY_LIST;
}
/**
* Get the Pattern.
*
* @return
*/
public Pattern getPattern() {
return pattern;
}
/**
* Get an Iterator over the list of Excludes.
*
* @return
*/
public Iterator getExcludes() {
return excludes.iterator();
}
/**
* Add an Exclude.
*
* @param exclude
*/
private void add(final Exclude exclude) {
if (this.excludes == Collections.EMPTY_LIST) {
this.excludes = new ArrayList();
}
this.excludes.add(exclude);
}
/**
* Return true if the tableName 1) matches the pattern and 2) is not
* matched by any of the Excludes.
*
* @param tableName
* @return
*/
public boolean matches(final String tableName) {
if (! pattern.matcher(tableName).matches()) {
return false;
} else {
for (Iterator it = getExcludes(); it.hasNext(); ) {
Exclude exclude = (Exclude) it.next();
if (exclude.isExcluded(tableName)) {
return false;
}
}
return true;
}
}
/**
* Validate excludes and base class.
*
* @param msgRecorder
*/
public void validate(final MessageRecorder msgRecorder) {
msgRecorder.pushContextName("PatternTableDef");
try {
checkAttributeString(msgRecorder, pattern.pattern(), "pattern");
for (Iterator it = getExcludes(); it.hasNext(); ) {
Exclude exclude = (Exclude) it.next();
exclude.validate(msgRecorder);
}
super.validate(msgRecorder);
} finally {
msgRecorder.popContextName();
}
}
public void print(final PrintWriter pw, final String prefix) {
pw.print(prefix);
pw.println("ExplicitRules.PatternTableDef:");
super.print(pw, prefix);
String subprefix = prefix + " ";
String subsubprefix = subprefix + " ";
pw.print(subprefix);
pw.print("pattern=");
pw.print(this.pattern.pattern());
pw.print(":");
pw.println(this.pattern.flags());
pw.print(subprefix);
pw.println("Excludes: [");
Iterator it = this.excludes.iterator();
while (it.hasNext()) {
Exclude exclude = (Exclude) it.next();
exclude.print(pw, subsubprefix);
}
pw.print(subprefix);
pw.println("]");
}
}
/**
* Helper method used to determine if an attribute with name attrName has a
* non-empty value.
*
* @param msgRecorder
* @param attrValue
* @param attrName
*/
private static void checkAttributeString(final MessageRecorder msgRecorder,
final String attrValue,
final String attrName) {
if (attrValue == null) {
msgRecorder.reportError(mres.NullAttributeString.str(
msgRecorder.getContext(),
attrName));
} else if (attrValue.length() == 0) {
msgRecorder.reportError(mres.EmptyAttributeString.str(
msgRecorder.getContext(),
attrName));
}
}
private ExplicitRules() {}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?