Skip to content

Commit

Permalink
MONDRIAN: Implement ValidMeasure function (contributed by Matthew Cam…
Browse files Browse the repository at this point in the history
…pbell);

    factor out SetToStr and TupleToStr functions into their own files.

[git-p4: depot-paths = "//open/mondrian/": change = 7329]
  • Loading branch information
julianhyde committed Aug 4, 2006
1 parent 6a00fc6 commit 04ec7fb
Show file tree
Hide file tree
Showing 6 changed files with 348 additions and 118 deletions.
114 changes: 5 additions & 109 deletions src/main/mondrian/olap/fun/BuiltinFunTable.java
Expand Up @@ -22,7 +22,6 @@
import mondrian.olap.type.DimensionType;
import mondrian.olap.type.LevelType;
import mondrian.olap.type.Type;
import mondrian.olap.type.TypeUtil;
import org.eigenbase.xom.XOMUtil;

import java.io.PrintWriter;
Expand Down Expand Up @@ -616,15 +615,8 @@ Member strToMember(Evaluator evaluator, String memberName) {
}
});

if (false) define(new FunDefBase(
"ValidMeasure",
"ValidMeasure(<Tuple>)",
"Returns a valid measure in a virtual cube by forcing inapplicable dimensions to their top level.",
"fm*") {
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
throw new UnsupportedOperationException();
}
});
define(ValidMeasureFunDef.instance);

//
// NUMERIC FUNCTIONS
define(AggregateFunDef.resolver);
Expand Down Expand Up @@ -1350,77 +1342,9 @@ public String evaluateString(Evaluator evaluator) {
}
});

define(new FunDefBase(
"SetToStr",
"SetToStr(<Set>)",
"Constructs a string from a set.",
"fSx") {
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
final ListCalc listCalc =
compiler.compileList(call.getArg(0));
return new AbstractStringCalc(call, new Calc[] {listCalc}) {
public String evaluateString(Evaluator evaluator) {
final List list = listCalc.evaluateList(evaluator);
return strToSet(list);
}
};
}
define(SetToStrFunDef.instance);

String strToSet(List list) {
StringBuffer buf = new StringBuffer();
buf.append("{");
for (int i = 0; i < list.size(); i++) {
if (i > 0) {
buf.append(", ");
}
final Object o = list.get(i);
appendMemberOrTuple(buf, o);
}
buf.append("}");
return buf.toString();
}
});

define(new FunDefBase(
"TupleToStr",
"TupleToStr(<Tuple>)",
"Constructs a string from a tuple.",
"fSt") {
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
if (TypeUtil.couldBeMember(call.getArg(0).getType())) {
final MemberCalc memberCalc =
compiler.compileMember(call.getArg(0));
return new AbstractStringCalc(call, new Calc[] {memberCalc}) {
public String evaluateString(Evaluator evaluator) {
final Member member =
memberCalc.evaluateMember(evaluator);
if (member.isNull()) {
return "";
}
StringBuffer buf = new StringBuffer();
appendMember(buf, member);
return buf.toString();
}
};
} else {
final TupleCalc tupleCalc =
compiler.compileTuple(call.getArg(0));
return new AbstractStringCalc(call, new Calc[] {tupleCalc}) {
public String evaluateString(Evaluator evaluator) {
final Member[] members =
tupleCalc.evaluateTuple(evaluator);
if (members == null) {
return "";
}
StringBuffer buf = new StringBuffer();
appendTuple(buf, members);
return buf.toString();
}
};
}
}

});
define(TupleToStrFunDef.instance);

define(new FunDefBase(
"UniqueName",
Expand Down Expand Up @@ -2021,35 +1945,6 @@ public boolean evaluateBoolean(Evaluator evaluator) {
define(CalculatedChildFunDef.instance);
}


static void appendMemberOrTuple(
StringBuffer buf,
Object memberOrTuple) {
if (memberOrTuple instanceof Member) {
Member member = (Member) memberOrTuple;
appendMember(buf, member);
} else {
Member[] members = (Member[]) memberOrTuple;
appendTuple(buf, members);
}
}

private static void appendMember(StringBuffer buf, Member member) {
buf.append(member.getUniqueName());
}

private static void appendTuple(StringBuffer buf, Member[] members) {
buf.append("(");
for (int j = 0; j < members.length; j++) {
if (j > 0) {
buf.append(", ");
}
Member member = members[j];
appendMember(buf, member);
}
buf.append(")");
}

/**
* Returns a read-only version of the name-to-resolvers map. Used by the
* testing framework.
Expand Down Expand Up @@ -2130,6 +2025,7 @@ static List dimensionMembers(
FunUtil.hierarchize(memberList, false);
return memberList;
}

}

// End BuiltinFunTable.java
30 changes: 21 additions & 9 deletions src/main/mondrian/olap/fun/FunUtil.java
Expand Up @@ -1463,23 +1463,23 @@ static Member makeNullMember(
}
return hierarchy.getNullMember();
}

/**
* Validates the arguments to a function and resolves the function.
*
*
* @param validator validator used to validate function arguments and
* resolve the function
* @param args arguments to the function
* @param newArgs returns the resolved arguments to the function
* @param name function name
* @param syntax syntax style used to invoke function
*
*
* @return resolved function definition
*/
public static FunDef resolveFunArgs(
Validator validator, Exp[] args, Exp[] newArgs, String name,
Syntax syntax) {

Query query = validator.getQuery();
Cube cube = null;
if (query != null) {
Expand All @@ -1489,8 +1489,8 @@ public static FunDef resolveFunArgs(
newArgs[i] = validator.validate(args[i], false);
}
final FunTable funTable = validator.getFunTable();
FunDef funDef = funTable.getDef(newArgs, validator, name, syntax);
FunDef funDef = funTable.getDef(newArgs, validator, name, syntax);

// if a measure or the measures dimension is referenced in a function,
// then native cross joins cannot be used because the functions need
// to be executed to determine the resultant measures; the set
Expand All @@ -1512,12 +1512,24 @@ public static FunDef resolveFunArgs(
query.setVirtualCubeNonNativeCrossJoin();
break;
}
}
}
}

return funDef;
}

static void appendTuple(StringBuffer buf, Member[] members) {
buf.append("(");
for (int j = 0; j < members.length; j++) {
if (j > 0) {
buf.append(", ");
}
Member member = members[j];
buf.append(member.getUniqueName());
}
buf.append(")");
}

// Inner classes


Expand Down Expand Up @@ -2011,7 +2023,7 @@ public String getDescription() {
public OlapElement lookupChild(SchemaReader schemaReader, String s) {
throw new UnsupportedOperationException();
}

public OlapElement lookupChild(
SchemaReader schemaReader, String s, int matchType) {
throw new UnsupportedOperationException();
Expand Down
74 changes: 74 additions & 0 deletions src/main/mondrian/olap/fun/SetToStrFunDef.java
@@ -0,0 +1,74 @@
/*
// $Id$
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// Copyright (C) 2006-2006 Julian Hyde
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package mondrian.olap.fun;

import mondrian.calc.Calc;
import mondrian.calc.ExpCompiler;
import mondrian.calc.ListCalc;
import mondrian.calc.impl.AbstractStringCalc;
import mondrian.mdx.ResolvedFunCall;
import mondrian.olap.Evaluator;
import mondrian.olap.Member;

import java.util.List;

/**
* Definition of the <code>SetToStr</code> MDX function.
*
* @author jhyde
* @version $Id$
* @since Aug 3, 2006
*/
class SetToStrFunDef extends FunDefBase {
public static final FunDefBase instance = new SetToStrFunDef();

private SetToStrFunDef() {
super("SetToStr", "SetToStr(<Set>)", "Constructs a string from a set.", "fSx");
}

public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
final ListCalc listCalc =
compiler.compileList(call.getArg(0));
return new AbstractStringCalc(call, new Calc[] {listCalc}) {
public String evaluateString(Evaluator evaluator) {
final List list = listCalc.evaluateList(evaluator);
return strToSet(list);
}
};
}

static String strToSet(List list) {
StringBuffer buf = new StringBuffer();
buf.append("{");
for (int i = 0; i < list.size(); i++) {
if (i > 0) {
buf.append(", ");
}
final Object o = list.get(i);
appendMemberOrTuple(buf, o);
}
buf.append("}");
return buf.toString();
}

static void appendMemberOrTuple(
StringBuffer buf,
Object memberOrTuple) {
if (memberOrTuple instanceof Member) {
Member member = (Member) memberOrTuple;
buf.append(member.getUniqueName());
} else {
Member[] members = (Member[]) memberOrTuple;
appendTuple(buf, members);
}
}
}

// End SetToStrFunDef.java
72 changes: 72 additions & 0 deletions src/main/mondrian/olap/fun/TupleToStrFunDef.java
@@ -0,0 +1,72 @@
/*
// $Id$
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// Copyright (C) 2006-2006 Julian Hyde
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package mondrian.olap.fun;

import mondrian.calc.Calc;
import mondrian.calc.ExpCompiler;
import mondrian.calc.MemberCalc;
import mondrian.calc.TupleCalc;
import mondrian.calc.impl.AbstractStringCalc;
import mondrian.mdx.ResolvedFunCall;
import mondrian.olap.type.TypeUtil;
import mondrian.olap.Evaluator;
import mondrian.olap.Member;

/**
* Definition of the <code>TupleToStr</code> MDX function.
*
* @author jhyde
* @version $Id$
* @since Aug 3, 2006
*/
class TupleToStrFunDef extends FunDefBase {
static final TupleToStrFunDef instance = new TupleToStrFunDef();

private TupleToStrFunDef() {
super("TupleToStr", "TupleToStr(<Tuple>)", "Constructs a string from a tuple.", "fSt");
}

public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
if (TypeUtil.couldBeMember(call.getArg(0).getType())) {
final MemberCalc memberCalc =
compiler.compileMember(call.getArg(0));
return new AbstractStringCalc(call, new Calc[] {memberCalc}) {
public String evaluateString(Evaluator evaluator) {
final Member member =
memberCalc.evaluateMember(evaluator);
if (member.isNull()) {
return "";
}
StringBuffer buf = new StringBuffer();
buf.append(member.getUniqueName());
return buf.toString();
}
};
} else {
final TupleCalc tupleCalc =
compiler.compileTuple(call.getArg(0));
return new AbstractStringCalc(call, new Calc[] {tupleCalc}) {
public String evaluateString(Evaluator evaluator) {
final Member[] members =
tupleCalc.evaluateTuple(evaluator);
if (members == null) {
return "";
}
StringBuffer buf = new StringBuffer();
SetToStrFunDef.appendTuple(buf, members);
return buf.toString();
}
};
}
}

}

// End TupleToStrFunDef.java

0 comments on commit 04ec7fb

Please sign in to comment.