[Mondrian] Re: Eigenbase perforce change 11768 for review

Julian Hyde jhyde at pentaho.com
Tue Oct 28 10:51:16 EDT 2008


Khanh,

I saw you added a 'MondrianProperties props' member to FunctionTest.
The 

T save  = MondrianProperties.property.get();
try {
   MondrianProperties.instance().property.set(newValue);
   << test >>
} finally {
   MondrianProperties.instance().property.set(save);
}

pattern has become ubiquitous in mondrian tests, so I have introduced
mondrian.test.PropertySaver to do deal with it.  Just create a
PropertySaver as a protected final member variable, set properties via
the saver, and make sure your test has a tearDown() method that calls
PropertySaver.reset().

See change 11828 http://p4web.eigenbase.org/@md=d&c=6PU@//11828?ac=10

Others,

Please use PropertySaver when you see this pattern. Please also convert
existing code that you see.

Julian



On Sun, 2008-10-19 at 11:40 -0700, Khanh Vu wrote:

> http://p4web.eigenbase.org/@md=d&c=6PU@//11768?ac=10
> 
> Change 11768 by kvu at kvu.shada.eigenbase on 2008/10/19 11:39:47
> 
> 	MONDRIAN: itegrates change 11758 to mondrian head
> 
> Affected files ...
> 
> ... //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#154 integrate
> ... //open/mondrian/src/main/mondrian/olap/fun/FunUtil.java#112 integrate
> ... //open/mondrian/src/main/mondrian/olap/fun/OrderSetFunDef.java#1 branch
> ... //open/mondrian/testsrc/main/mondrian/olap/fun/FunctionTest.java#136 integrate
> ... //open/mondrian/testsrc/main/mondrian/test/Main.java#96 integrate
> ... //open/mondrian/testsrc/main/mondrian/test/clearview/OrderSetTest.java#1 branch
> ... //open/mondrian/testsrc/main/mondrian/test/clearview/OrderSetTest.ref.xml#1 branch
> ... //open/mondrian/testsrc/main/mondrian/xmla/XmlaBasicTest.ref.xml#67 integrate
> 
> Differences ...
> 
> ==== //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#154 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#153 $
> ---
> > // $Id: //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#154 $
> 42c42
> <  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#153 $
> ---
> >  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#154 $
> 1091a1092
> >         define(OrderSetFunDef.Resolver);
> 
> ==== //open/mondrian/src/main/mondrian/olap/fun/FunUtil.java#112 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/src/main/mondrian/olap/fun/FunUtil.java#111 $
> ---
> > // $Id: //open/mondrian/src/main/mondrian/olap/fun/FunUtil.java#112 $
> 20a21,22
> > import mondrian.calc.MemberCalc;
> > import mondrian.calc.impl.*;
> 36c38
> <  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/FunUtil.java#111 $
> ---
> >  * @version $Id: //open/mondrian/src/main/mondrian/olap/fun/FunUtil.java#112 $
> 256a259
> >         ;
> 328c331
> <     static Map<Member, Object> evaluateMembers(
> ---
> >     static Map<Object, Object> evaluateMembers(
> 338c341
> <         Map<Member, Object> mapMemberToValue = new HashMap<Member, Object>();
> ---
> >         Map<Object, Object> mapMemberToValue = new HashMap<Object, Object>();
> 420a424,611
> >      * For each tuple/member in a list, evaluates the member value expression
> >      * and populates a map from tuples/members to members
> >      *
> >      * @param <T> Generic type, can take a member or a tuple
> >      * @param evaluator Evaluation context
> >      * @param exp Expression to evaluate
> >      * @param members List of members
> >      * @param parentsToo If true, evaluate the expression for all ancestors
> >      *            of the members as well
> >      * @return the map from members or tuples to members
> >      */
> >     static <T> Map<Object, Object> evaluateMemberValueExps(
> >         Evaluator evaluator,
> >         Calc exp,
> >         List<T> members,
> >         boolean parentsToo)
> >     {
> >         MemberCalc mcalc = (MemberCalc) exp;
> >         Map<Object, Object> mapMemberToMember = new HashMap<Object, Object>();
> > 
> >         // try to optimize when exp is currentMember
> >         boolean isCurrMemExp = mcalc instanceof DimensionCurrentMemberFunDef.CalcImpl;
> >         int idx = -1;
> >         if (isCurrMemExp) {
> >             Object first = members.get(0);
> >             if (first instanceof Member[]) {
> >                 Member[] firstMem = (Member[]) first;
> >                 int n = firstMem.length;
> >                 Dimension dim = mcalc.getType().getDimension();
> >                 for (int i = 0; i < n; i++) {
> >                     if (dim.equals(firstMem[i].getDimension())) {
> >                         idx = i;
> >                         break;
> >                     }
> >                 }
> >                 assert idx != -1;
> >             }
> >         }
> >         // populate the map
> >         Object obj;
> >         Member result;
> >         for (int i = 0, n = members.size(); i < n; i++) {
> >             obj = members.get(i);
> >             if (obj instanceof Member) {
> >                 while (true) {
> >                     if (isCurrMemExp) {
> >                         mapMemberToMember.put(obj, obj);
> >                     } else {
> >                         evaluator.setContext((Member) obj);
> >                         result = mcalc.evaluateMember(evaluator);
> >                         if (result == null) {
> >                             result = NullMember;
> >                         }
> >                         mapMemberToMember.put(obj, result);
> >                     }
> >                     if (!parentsToo) {
> >                         break;
> >                     }
> >                     obj = ((Member) obj).getParentMember();
> >                     if (obj == null) {
> >                         break;
> >                     }
> >                     if (mapMemberToMember.containsKey((Member) obj)) {
> >                         break;
> >                     }
> >                 }
> >             } else if (obj instanceof Member[]) {
> >                 evaluator.setContext((Member[]) obj);
> >                 if (isCurrMemExp) {
> >                     mapMemberToMember.put(
> >                         new ArrayHolder<Member>((Member[]) obj), ((Member[]) obj)[idx]);
> >                 } else {
> >                     // populate tuples map
> >                     result = mcalc.evaluateMember(evaluator);
> >                     if (result == null) {
> >                         result = NullMember;
> >                     }
> >                     mapMemberToMember.put(
> >                         new ArrayHolder<Member>((Member[]) obj), result);
> >                 }
> >             }
> >         }
> >         return mapMemberToMember;
> >     }
> > 
> >     /**
> >      * Populates the list of maps from tuples/members to values/members.
> >      * Each member of the list corresponds to a sort key. Since it is
> >      * unlikely that all sort keys will be used to compare any pair
> >      * of members, prepopulate the first half only
> >      *
> >      * @param <T> Generic type; can be member or tuple
> >      * @param listMapMemberToValue List of maps
> >      * @param evaluator Evaluation context
> >      * @param members List of members
> >      * @param keySpecList List of sort key specifications
> >      */
> >     static <T> void populateMembersMap(
> >         List<Map<Object, Object>> listMapMemberToValue,
> >         Evaluator evaluator,
> >         List<T> members,
> >         List<SortKeySpec> keySpecList)
> >     {
> >         final int keyCount = keySpecList.size();
> >         // magic number - pre-populate the map
> >         // for one plus the first half of sort keys
> >         final int depth = keyCount / 2 + 1;
> >         Object first = members.get(0);
> >         for (int i = 0; i < depth; i++) {
> >             SortKeySpec sortKey = keySpecList.get(i);
> >             if (sortKey.isMemberValueExp()) {
> >                 // get member
> >                 listMapMemberToValue.add(
> >                     evaluateMemberValueExps(
> >                         evaluator,
> >                         sortKey.getKey(),
> >                         members,
> >                         !sortKey.getDirection().brk));
> >             } else {
> >                 // get value
> >                 if (first instanceof Member) {
> >                     listMapMemberToValue.add(
> >                         evaluateMembers(
> >                             evaluator,
> >                             sortKey.getKey(),
> >                             (List<Member>) members,
> >                             !sortKey.getDirection().brk));
> >                 } else {
> >                     // populate map for tuples only
> >                     // meaning optimize for break hierarchy comparison only
> >                     listMapMemberToValue.add(
> >                         evaluateTuples(
> >                             evaluator,
> >                             sortKey.getKey(),
> >                             (List<Member[]>) members));
> >                 }
> >             }
> >         }
> >         for (int i = depth; i < keyCount; i++) {
> >             listMapMemberToValue.add(new HashMap<Object, Object>());
> >         }
> >     }
> > 
> >     /**
> >      * Gets the value from the map or evaluates the member using the expression
> >      * if the value is not ready
> >      *
> >      * @param member Key of the map
> >      * @param exp Expression to evaluate
> >      * @param evaluator Evaluation context
> >      * @param mapTuples Map of members or tuples to members or cell values
> >      * @return Value from the map
> >      */
> >     static Object getFromMapOrEvaluate(
> >         Object member,
> >         Calc exp,
> >         Evaluator evaluator,
> >         boolean isMemValExp,
> >         Map<Object, Object> mapTuples)
> >     {
> >         Object key;
> >         boolean isTuple = (member instanceof Member[]);
> >         if (isTuple) {
> >             key = new ArrayHolder<Member>((Member[]) member);
> >         } else {
> >             key = member;
> >         }
> >         Object val = mapTuples.get(key);
> >         if (val == null) {
> >             if (isTuple) {
> >                 evaluator.setContext((Member[]) member);
> >             } else {
> >                 evaluator.setContext((Member) member);
> >             }
> >             val = exp.evaluate(evaluator);
> >             if (val == null) {
> >                 if (isMemValExp) {
> >                     val = NullMember;
> >                 } else {
> >                     val = Util.nullValue;
> >                 }
> >             }
> >             mapTuples.put(key, val);
> >         }
> >         return val;
> >     }
> > 
> >     /**
> 436c627
> <         Map<Member, Object> mapMemberToValue;
> ---
> >         Map<Object, Object> mapMemberToValue;
> 483a675,707
> >      * Helper function to sortMembers a list of members according to a list
> >      * of expressions and a list of sorting flags.
> >      *
> >      * <p>NOTE: This function does not preserve the contents of the validator.
> >      */
> >     public static void sortMembers(
> >         Evaluator evaluator, List<Member> members, List<SortKeySpec> keySpecList)
> >     {
> >         if (members.isEmpty()) {
> >             return;
> >         }
> >         Object first = members.get(0);
> >         List<Map<Object, Object>> listMapMemberToValue =
> >             new ArrayList<Map<Object, Object>>();
> >         populateMembersMap(
> >             listMapMemberToValue, evaluator, members, keySpecList);
> >         if (first instanceof Member) {
> >             Comparator<Member> comparator =
> >                 new MultiKeysMemberComparator(
> >                     evaluator, keySpecList, listMapMemberToValue).wrap();
> >             Collections.sort(members, comparator);
> >         } else {
> >             Util.assertTrue(first instanceof Member[]);
> >             List<Member[]> tupleList = Util.cast(members);
> >             final int arity = ((Member[]) first).length;
> >             Comparator<Member[]> comparator =
> >                 new MultiKeysArrayComparator(
> >                     evaluator, keySpecList, listMapMemberToValue, arity).wrap();
> >             Collections.sort(tupleList, comparator);
> >         }
> >     }
> > 
> >     /**
> 1633a1858,1948
> >     public static int compareMembersByOrderKeys(
> >         Member m1, Member m2)
> >     {
> >         // calculated members collate after non-calculated
> >         final boolean calculated1 = m1.isCalculatedInQuery();
> >         final boolean calculated2 = m2.isCalculatedInQuery();
> >         if (calculated1) {
> >             if (!calculated2) {
> >                 return 1;
> >             }
> >         } else {
> >             if (calculated2) {
> >                 return -1;
> >             }
> >         }
> >         final Comparable k1 = m1.getOrderKey();
> >         final Comparable k2 = m2.getOrderKey();
> >         if ((k1 != null) && (k2 != null)) {
> >             return k1.compareTo(k2);
> >         } else {
> >             return m1.compareTo(m2);
> >         }
> >     }
> > 
> >     public static int compareMembers(
> >         Member m1,
> >         Member m2,
> >         Evaluator evaluator,
> >         Calc exp,
> >         boolean isMemValExp,
> >         Map<Object, Object> mapMemberToValue)
> >     {
> >         if (isMemValExp) {
> >             return FunUtil.compareMembersByOrderKeys(m1, m2);
> >         } else {
> >             Member old = evaluator.setContext(m1);
> >             Object v1 = getFromMapOrEvaluate(
> >                 m1, exp, evaluator, false, mapMemberToValue);
> >             Object v2 = getFromMapOrEvaluate(
> >                 m2, exp, evaluator, false, mapMemberToValue);
> >             // important to restore the evaluator state -- and this is faster
> >             // than calling evaluator.push()
> >             evaluator.setContext(old);
> >             return FunUtil.compareValues(v1, v2);
> >         }
> >     }
> > 
> >     public static int compareMembersHierarchically(
> >         Member m1,
> >         Member m2,
> >         Evaluator evaluator,
> >         Calc exp,
> >         boolean desc,
> >         boolean isMemValExp,
> >         Map<Object, Object> mapMemberToValue)
> >     {
> >         if (FunUtil.equals(m1, m2)) {
> >             return 0;
> >         }
> >         while (true) {
> >             int depth1 = m1.getDepth(),
> >                     depth2 = m2.getDepth();
> >             if (depth1 < depth2) {
> >                 m2 = m2.getParentMember();
> >                 if (FunUtil.equals(m1, m2)) {
> >                     return -1;
> >                 }
> >             } else if (depth1 > depth2) {
> >                 m1 = m1.getParentMember();
> >                 if (FunUtil.equals(m1, m2)) {
> >                     return 1;
> >                 }
> >             } else {
> >                 Member prev1 = m1, prev2 = m2;
> >                 m1 = m1.getParentMember();
> >                 m2 = m2.getParentMember();
> >                 if (FunUtil.equals(m1, m2)) {
> >                     // including case where both parents are null
> >                     int c = FunUtil.compareMembers(
> >                         prev1, prev2, evaluator, exp, isMemValExp, mapMemberToValue);
> >                     // skip the below compare if isMemValExp is true
> >                     if ((c == 0) && !(isMemValExp)) {
> >                         c = FunUtil.compareMembersByOrderKeys(
> >                             prev1, prev2);
> >                     }
> >                     return desc ? -c : c;
> >                 }
> >             }
> >         }
> >     }
> > 
> 1829c2144
> <         List <Member> memberList =
> ---
> >         List<Member> memberList =
> 1880c2195
> <         Map<Member, Object> mapMemberToValue;
> ---
> >         Map<Object, Object> mapMemberToValue;
> 1881a2197
> >         Evaluator evaluator;
> 1883c2199
> <         MemberComparator(Map<Member, Object> mapMemberToValue, boolean desc) {
> ---
> >         MemberComparator(Map<Object, Object> mapMemberToValue, boolean desc) {
> 1887a2204,2210
> >         MemberComparator(
> >             Evaluator evaluator,
> >             List<SortKeySpec> keySpecList)
> >         {
> >             this.evaluator = evaluator;
> >         }
> > 
> 1890c2213
> <             if (LOGGER.isDebugEnabled()) {
> ---
> >             if (LOGGER.isDebugEnabled() && (mapMemberToValue != null)) {
> 1961c2284
> <             Map<Member, Object> mapMemberToValue, boolean desc)
> ---
> >             Map<Object, Object> mapMemberToValue, boolean desc)
> 1972c2295
> <         BreakMemberComparator(Map<Member, Object> mapMemberToValue, boolean desc) {
> ---
> >         BreakMemberComparator(Map<Object, Object> mapMemberToValue, boolean desc) {
> 1980a2304,2365
> >     private static class MultiKeysMemberComparator extends MemberComparator
> >     {
> >         List<SortKeySpec> keySpecList;
> >         List<Map<Object, Object>> listMapMemberToValue;
> >         int keySpecCount;
> > 
> >         MultiKeysMemberComparator(
> >             Evaluator evaluator,
> >             List<SortKeySpec> keySpecList,
> >             List<Map<Object, Object>> listMapMemberToValue)
> >         {
> >             super(evaluator, keySpecList);
> >             this.keySpecList = keySpecList;
> >             this.listMapMemberToValue = listMapMemberToValue;
> >             this.keySpecCount = keySpecList.size();
> >         }
> > 
> >         public final int compare(Member m1, Member m2)
> >         {
> >             int c = 0;
> >             for (int i = 0; i < keySpecCount; i++) {
> >                 SortKeySpec sortKey = keySpecList.get(i);
> >                 Calc exp = sortKey.key;
> >                 Flag flag = sortKey.direction;
> >                 boolean isMemValExp = sortKey.isMemberValExp;
> >                 Map<Object, Object> mapMemberToValue =
> >                     listMapMemberToValue.get(i);
> >                 //this.evaluator.push(); //check if this is needed
> >                 Member tm1 = null, tm2 = null;
> >                 if (isMemValExp) {
> >                     tm1 = (Member) getFromMapOrEvaluate(
> >                         m1, exp, evaluator, true, mapMemberToValue);
> >                     tm2 = (Member) getFromMapOrEvaluate(
> >                         m2, exp, evaluator, true, mapMemberToValue);
> >                 }
> >                 if (flag.brk) {
> >                     int c1 = compareMembers(
> >                         isMemValExp ? tm1 : m1,
> >                         isMemValExp ? tm2 : m2,
> >                         evaluator,
> >                         exp,
> >                         isMemValExp,
> >                         mapMemberToValue);
> >                     c = flag.descending ? -c1 : c1;
> >                 } else {
> >                     c = compareMembersHierarchically(
> >                         isMemValExp ? tm1 : m1,
> >                         isMemValExp ? tm2 : m2,
> >                         evaluator,
> >                         exp,
> >                         flag.descending,
> >                         isMemValExp,
> >                         mapMemberToValue);
> >                 }
> >                 if (c != 0) {
> >                     return c;
> >                 }
> >             }
> >             return c;
> >         }
> >     }
> > 
> 2044c2429
> <         final Calc calc;
> ---
> >         Calc calc;
> 2050a2436,2442
> > 
> >         ArrayExpComparator(
> >             Evaluator evaluator,
> >             int arity) {
> >             super(arity);
> >             this.evaluator = evaluator;
> >         }
> 2142a2535,2640
> >     private static class MultiKeysArrayComparator
> >         extends ArrayExpComparator
> >     {
> >         List<SortKeySpec> keySpecList;
> >         List<Map<Object, Object>> listMapMemberToValue;
> >         int keySpecCount;
> > 
> >         MultiKeysArrayComparator(
> >             Evaluator evaluator,
> >             List<SortKeySpec> keySpecList,
> >             List<Map<Object, Object>> listMapMemberToValue,
> >             int arity)
> >         {
> >             super(evaluator, arity);
> >             this.keySpecList = keySpecList;
> >             this.keySpecCount = keySpecList.size();
> >             this.listMapMemberToValue = listMapMemberToValue;
> >         }
> > 
> >         public int compare(Member[] a1, Member[] a2) {
> >             int c = 0;
> >             for (int i = 0; i < keySpecCount; i++) {
> >                 SortKeySpec sortKey = keySpecList.get(i);
> >                 if (sortKey.direction.brk) {
> >                     c = compareBreakHierarchy(
> >                         a1,
> >                         a2,
> >                         sortKey.key,
> >                         sortKey.direction.descending,
> >                         sortKey.isMemberValExp,
> >                         listMapMemberToValue.get(i));
> >                 } else {
> >                     c = compareHierarchically(
> >                         a1,
> >                         a2,
> >                         sortKey.key,
> >                         sortKey.direction.descending,
> >                         sortKey.isMemberValExp,
> >                         listMapMemberToValue.get(i));
> >                 }
> >                 if (c != 0) {
> >                     return c;
> >                 }
> >             }
> >             return c;
> >         }
> > 
> >         public int compareBreakHierarchy(
> >             Member[] a1,
> >             Member[] a2,
> >             Calc exp,
> >             boolean desc,
> >             boolean isMemValExp,
> >             Map<Object, Object> mapTupleToValue)
> >         {
> >             if (isMemValExp) {
> >                 Member m1 = (Member) getFromMapOrEvaluate(
> >                     a1, exp, evaluator, true, mapTupleToValue);
> >                 Member m2 = (Member) getFromMapOrEvaluate(
> >                     a2, exp, evaluator, true, mapTupleToValue);
> >                 return desc ?
> >                     - compareMembersByOrderKeys(m1, m2) :
> >                     compareMembersByOrderKeys(m1, m2);
> >             } else {
> >                 Object v1 = getFromMapOrEvaluate(
> >                     a1, exp, evaluator, false, mapTupleToValue);
> >                 Object v2 = getFromMapOrEvaluate(
> >                     a2, exp, evaluator, false, mapTupleToValue);
> >                 return desc ?
> >                     - compareValues(v1, v2) :
> >                     compareValues(v1, v2);
> >             }
> >         }
> > 
> >         public int compareHierarchically(
> >             Member[] a1,
> >             Member[] a2,
> >             Calc exp,
> >             boolean desc,
> >             boolean isMemValExp,
> >             Map<Object, Object> mapTupleToValue)
> >         {
> >             int c = 0;
> >             if (isMemValExp) {
> >                 Member m1 = (Member) getFromMapOrEvaluate(
> >                     a1, exp, evaluator, true, mapTupleToValue);
> >                 Member m2 = (Member) getFromMapOrEvaluate(
> >                     a2, exp, evaluator, true, mapTupleToValue);
> >                 c = compareMembersHierarchically(
> >                     m1, m2, evaluator, exp, desc, isMemValExp, mapTupleToValue);
> >             } else {
> >                 for (int i = 0; i < arity; i++) {
> >                     Member m1 = a1[i],
> >                             m2 = a2[i];
> >                     c = compareMembersHierarchically(
> >                         m1, m2, evaluator, exp, desc, isMemValExp, mapTupleToValue);
> >                     if (c != 0) {
> >                         break;
> >                     }
> >                     evaluator.setContext(m1);
> >                 }
> >             }
> >             return c;
> >         }
> >     }
> > 
> 2386a2885,2946
> > 
> >     /**
> >      * Enumeration of the flags allowed to the <code>ORDER</code> MDX function.
> >      */
> >     enum Flag {
> >         ASC(false, false),
> >         DESC(true, false),
> >         BASC(false, true),
> >         BDESC(true, true);
> > 
> >         final boolean descending;
> >         final boolean brk;
> > 
> >         Flag(boolean descending, boolean brk) {
> >             this.descending = descending;
> >             this.brk = brk;
> >         }
> > 
> >         public static String[] getNames() {
> >             List<String> names = new ArrayList<String>();
> >             for (Flag flags : Flag.class.getEnumConstants()) {
> >                 names.add(flags.name());
> >             }
> >             return names.toArray(new String[names.size()]);
> >         }
> >     }
> > 
> >     class SortKeySpec {
> >         private Calc key;
> >         private boolean isMemberValExp = true;
> >         private Flag direction;
> > 
> >         SortKeySpec(Calc key, boolean memberValExp, Flag dir) {
> >             this.key = key;
> >             this.isMemberValExp = memberValExp;
> >             this.direction = dir;
> >         }
> > 
> >         Calc getKey() {
> >             return this.key;
> >         }
> > 
> >         boolean isMemberValueExp() {
> >             return this.isMemberValExp;
> >         }
> > 
> >         Flag getDirection() {
> >             return this.direction;
> >         }
> > 
> >         void setKey(Calc key) {
> >             this.key = key;
> >         }
> > 
> >         void setMemberValueExp(boolean m) {
> >             this.isMemberValExp = m;
> >         }
> > 
> >         void setDirection(Flag dir) {
> >             this.direction = dir;
> >         }
> >     }
> 
> ==== //open/mondrian/testsrc/main/mondrian/olap/fun/FunctionTest.java#136 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/testsrc/main/mondrian/olap/fun/FunctionTest.java#135 $
> ---
> > // $Id: //open/mondrian/testsrc/main/mondrian/olap/fun/FunctionTest.java#136 $
> 34c34
> <  * @version $Id: //open/mondrian/testsrc/main/mondrian/olap/fun/FunctionTest.java#135 $
> ---
> >  * @version $Id: //open/mondrian/testsrc/main/mondrian/olap/fun/FunctionTest.java#136 $
> 37a38,39
> >     private MondrianProperties props;
> > 
> 161a164
> >         props = MondrianProperties.instance();
> 165a169
> >         props = MondrianProperties.instance();
> 5982a5987,6434
> >     public void testOrderSetEmpty() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {}," +
> >             "    [Customers].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n"));
> >     }
> > 
> >     public void testOrderOne() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}," +
> >             "    [Customers].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "Row #0: 75\n"));
> >     }
> > 
> >     public void testOrderSetMemberMemberValueExpNew() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Customers].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         boolean saved = props.CompareSiblingsByOrderKey.get();
> >         props.CompareSiblingsByOrderKey.set(true);
> >         Connection conn = null;
> >         try {
> >             // Use a fresh connection to make sure bad member ordinals haven't
> >             // been assigned by previous tests.
> >             conn = getTestContext().getFoodMartConnection(false);
> >             TestContext context = getTestContext(conn);
> >             context.assertQueryReturns(query,
> >                 fold(
> >                     "Axis #0:\n" +
> >                     "{}\n" +
> >                     "Axis #1:\n" +
> >                     "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                     "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                     "Row #0: 33\n" +
> >                     "Row #0: 75\n"));
> >         } finally {
> >             props.CompareSiblingsByOrderKey.set(saved);
> >             if (conn != null) {
> >                 conn.close();
> >             }
> >         }
> >     }
> > 
> >     public void testOrderSetMemberDefaultFlag1() {
> >         // flags not specified default to ASC
> >         String query =
> >             "with \n" +
> >             "  Member [Measures].[Zero] as '0' \n" +
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Customers].currentMember) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 75\n"));
> >     }
> > 
> >     public void testOrderSetMemberDefaultFlag2() {
> >         // flags not specified default to ASC
> >         String query =
> >             "with \n" +
> >             "  Member [Measures].[Zero] as '0' \n" +
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Measures].[Store Cost]) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetMemberMemberValueExpHierarchy() {
> >         // Santa Monica and Woodland Hills both don't have orderkey
> >         // members are sorted by the order of their keys
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Customers].currentMember, DESC) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetMemberMultiKeysMemberValueExp1() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Measures].[Unit Sales], BDESC, [Customers].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "{[Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetMemberMultiKeysMemberValueExp2() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Customers].currentMember.Parent.Parent, BASC, [Customers].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         boolean saved = props.CompareSiblingsByOrderKey.get();
> >         props.CompareSiblingsByOrderKey.set(true);
> >         Connection conn = null;
> >         try {
> >             // Use a fresh connection to make sure bad member ordinals haven't
> >             // been assigned by previous tests.
> >             conn = getTestContext().getFoodMartConnection(false);
> >             TestContext context = getTestContext(conn);
> >             context.assertQueryReturns(query,
> >                 fold(
> >                     "Axis #0:\n" +
> >                     "{}\n" +
> >                     "Axis #1:\n" +
> >                     "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                     "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                     "{[Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                     "Row #0: 33\n" +
> >                     "Row #0: 75\n" +
> >                     "Row #0: 33\n"));
> >         } finally {
> >             props.CompareSiblingsByOrderKey.set(saved);
> >             if (conn != null) {
> >                 conn.close();
> >             }
> >         }
> >     }
> > 
> >     public void testOrderSetMemberMultiKeysMemberValueExpDepends() {
> >         // should preserve order of Abe and Adeline (note second key is [Time])
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Measures].[Unit Sales], BDESC, [Time].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetTupleSingleKeysNew() {
> >         String query =
> >             "with \n" +
> >             "  set [NECJ] as \n" +
> >             "    'NonEmptyCrossJoin( \n" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    {[Store].[USA].[WA].[Seattle],\n" +
> >             "     [Store].[USA].[CA],\n" +
> >             "     [Store].[USA].[OR]})'\n" +
> >             "select \n" +
> >             " OrderSet([NECJ], [Customers].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         boolean saved = props.CompareSiblingsByOrderKey.get();
> >         props.CompareSiblingsByOrderKey.set(true);
> >         Connection conn = null;
> >         try {
> >             // Use a fresh connection to make sure bad member ordinals haven't
> >             // been assigned by previous tests.
> >             conn = getTestContext().getFoodMartConnection(false);
> >             TestContext context = getTestContext(conn);
> >             context.assertQueryReturns(query,
> >                 fold(
> >                     "Axis #0:\n" +
> >                     "{}\n" +
> >                     "Axis #1:\n" +
> >                     "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun], [Store].[All Stores].[USA].[CA]}\n" +
> >                     "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young], [Store].[All Stores].[USA].[CA]}\n" +
> >                     "{[Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel], [Store].[All Stores].[USA].[WA].[Seattle]}\n" +
> >                     "Row #0: 33\n" +
> >                     "Row #0: 75\n" +
> >                     "Row #0: 33\n"));
> >         } finally {
> >             props.CompareSiblingsByOrderKey.set(saved);
> >             if (conn != null) {
> >                 conn.close();
> >             }
> >         }
> >     }
> > 
> >     public void testOrderSetTupleMultiKeys1() {
> >         String query =
> >             "with \n" +
> >             "  set [NECJ] as \n" +
> >             "    'NonEmptyCrossJoin( \n" +
> >             "    {[Store].[USA].[CA],\n" +
> >             "     [Store].[USA].[WA]},\n" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]})' \n" +
> >             "select \n" +
> >             " OrderSet([NECJ], [Store].currentMember, BDESC, [Measures].[Unit Sales], BDESC) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Store].[All Stores].[USA].[WA], [Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "{[Store].[All Stores].[USA].[CA], [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Store].[All Stores].[USA].[CA], [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetTupleMultiKeys2() {
> >         String query =
> >             "with \n" +
> >             "  set [NECJ] as \n" +
> >             "    'NonEmptyCrossJoin( \n" +
> >             "    {[Store].[USA].[CA],\n" +
> >             "     [Store].[USA].[WA]},\n" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]})' \n" +
> >             "select \n" +
> >             " OrderSet([NECJ], [Measures].[Unit Sales], BDESC, Ancestor([Customers].currentMember, [Customers].[Name]), BDESC) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Store].[All Stores].[USA].[CA], [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Store].[All Stores].[USA].[CA], [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "{[Store].[All Stores].[USA].[WA], [Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetTupleMultiKeys3() {
> >         // WA unit sales is greater than CA unit sales
> >         // Santa Monica unit sales (2660) is greater that Woodland hills (2516)
> >         String query =
> >             "with \n" +
> >             "  set [NECJ] as \n" +
> >             "    'NonEmptyCrossJoin( \n" +
> >             "    {[Store].[USA].[CA],\n" +
> >             "     [Store].[USA].[WA]},\n" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]})' \n" +
> >             "select \n" +
> >             " OrderSet([NECJ], [Measures].[Unit Sales], DESC, Ancestor([Customers].currentMember, [Customers].[Name]), BDESC) \n" +
> >             "on 0 from [Sales]";
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Store].[All Stores].[USA].[WA], [Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "{[Store].[All Stores].[USA].[CA], [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "{[Store].[All Stores].[USA].[CA], [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 75\n"));
> >     }
> > 
> >     public void testOrderSetTupleMultiKeyswithVCube() {
> >         // WA unit sales is greater than CA unit sales
> >         String query =
> >             "with \n" +
> >             "  set [CJ] as \n" +
> >             "    'CrossJoin( \n" +
> >             "    {[Position].[Store Management].children},\n" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]})' \n" +
> >             "select \n" +
> >             "  [Measures].[Org Salary] on columns, \n" +
> >             "  OrderSet([CJ], [Position].currentMember, BASC, Ancestor([Customers].currentMember, [Customers].[Name]), BDESC) \n" +
> >             "on rows \n" +
> >             "from [Sales vs HR]";
> > 
> >         boolean saved = props.CompareSiblingsByOrderKey.get();
> >         props.CompareSiblingsByOrderKey.set(true);
> >         Connection conn = null;
> >         try {
> >             // Use a fresh connection to make sure bad member ordinals haven't
> >             // been assigned by previous tests.
> >             conn = getTestContext().getFoodMartConnection(false);
> >             TestContext context = getTestContext(conn);
> >             // a non-sense cube just to test ordering by order key
> >             context = context.create(
> >                 null, null,
> >                 "<VirtualCube name=\"Sales vs HR\">\n" +
> >                     "<VirtualCubeDimension cubeName=\"Sales\" name=\"Customers\"/>\n" +
> >                     "<VirtualCubeDimension cubeName=\"HR\" name=\"Position\"/>\n" +
> >                     "<VirtualCubeMeasure cubeName=\"HR\" name=\"[Measures].[Org Salary]\"/>\n" +
> >                     "</VirtualCube>",
> >                 null, null, null);
> > 
> >             context.assertQueryReturns(query,
> >                 fold(
> >                     "Axis #0:\n" +
> >                     "{}\n" +
> >                     "Axis #1:\n" +
> >                     "{[Measures].[Org Salary]}\n" +
> >                     "Axis #2:\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Manager], [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Manager], [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Manager], [Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Assistant Manager], [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Assistant Manager], [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Assistant Manager], [Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Shift Supervisor], [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Shift Supervisor], [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                     "{[Position].[All Position].[Store Management].[Store Shift Supervisor], [Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                     "Row #0: \n" +
> >                     "Row #1: \n" +
> >                     "Row #2: \n" +
> >                     "Row #3: \n" +
> >                     "Row #4: \n" +
> >                     "Row #5: \n" +
> >                     "Row #6: \n" +
> >                     "Row #7: \n" +
> >                     "Row #8: \n"));
> >         } finally {
> >             props.CompareSiblingsByOrderKey.set(saved);
> >             if (conn != null) {
> >                 conn.close();
> >             }
> >         }
> >     }
> > 
> >     public void testOrderSetConstant1() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Customers].[USA], BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> >     public void testOrderSetDiffrentDim() {
> >         String query =
> >             "select \n" +
> >             "  OrderSet(" +
> >             "    {[Customers].[USA].[WA].[Issaquah].[Abe Tramel]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]," +
> >             "     [Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}," +
> >             "    [Product].currentMember, BDESC, [Gender].currentMember, BDESC) \n" +
> >             "on 0 from [Sales]";
> > 
> >         assertQueryReturns(query,
> >             fold(
> >                 "Axis #0:\n" +
> >                 "{}\n" +
> >                 "Axis #1:\n" +
> >                 "{[Customers].[All Customers].[USA].[WA].[Issaquah].[Abe Tramel]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Woodland Hills].[Abel Young]}\n" +
> >                 "{[Customers].[All Customers].[USA].[CA].[Santa Monica].[Adeline Chun]}\n" +
> >                 "Row #0: 33\n" +
> >                 "Row #0: 75\n" +
> >                 "Row #0: 33\n"));
> >     }
> > 
> 
> ==== //open/mondrian/testsrc/main/mondrian/test/Main.java#96 (ktext) ====
> 
> 2c2
> < // $Id: //open/mondrian/testsrc/main/mondrian/test/Main.java#95 $
> ---
> > // $Id: //open/mondrian/testsrc/main/mondrian/test/Main.java#96 $
> 49c49
> <  * @version $Id: //open/mondrian/testsrc/main/mondrian/test/Main.java#95 $
> ---
> >  * @version $Id: //open/mondrian/testsrc/main/mondrian/test/Main.java#96 $
> 198a199
> >             addTest(suite, OrderSetTest.class, "suite");
> 
> ==== //open/mondrian/testsrc/main/mondrian/xmla/XmlaBasicTest.ref.xml#67 (ktext) ====
> 
> 5626a5627,5636
> >                         <FUNCTION_NAME>OrderSet</FUNCTION_NAME>
> >                         <DESCRIPTION>Arranges members of a set,
> >                             optionally preserving or breaking the hierarchy.</DESCRIPTION>
> >                         <PARAMETER_LIST>(none)</PARAMETER_LIST>
> >                         <RETURN_TYPE>1</RETURN_TYPE>
> >                         <ORIGIN>1</ORIGIN>
> >                         <INTERFACE_NAME/>
> >                         <CAPTION>OrderSet</CAPTION>
> >                     </row>
> >                     <row>
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.pentaho.org/pipermail/mondrian/attachments/20081028/05628ba0/attachment.html 


More information about the Mondrian mailing list