Skip to content

Commit d13bb5c

Browse files
committed
Fix further issues in bug 3042937 by no longer enclosing formula of calculated
member and set in single quotes. Also, indent formulas for readability. git-svn-id: https://olap4j.svn.sourceforge.net/svnroot/olap4j/trunk@349 c6a108a4-781c-0410-a6c6-c2d559e19af0
1 parent c6702a9 commit d13bb5c

File tree

5 files changed

+37
-30
lines changed

5 files changed

+37
-30
lines changed

src/org/olap4j/mdx/IdentifierNode.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
import java.util.AbstractList;
1313
import java.util.ArrayList;
1414
import java.util.List;
15-
import java.util.regex.Matcher;
16-
import java.util.regex.Pattern;
1715

1816
import org.olap4j.impl.*;
1917
import org.olap4j.type.Type;
@@ -165,11 +163,7 @@ public <T> T accept(ParseTreeVisitor<T> visitor) {
165163
}
166164

167165
public void unparse(ParseTreeWriter writer) {
168-
String str = toString();
169-
if(writer.isInsideSingleQuote()) {
170-
str = str.replace("'", "''");
171-
}
172-
writer.getPrintWriter().print(str);
166+
writer.getPrintWriter().print(this);
173167
}
174168

175169
public String toString() {

src/org/olap4j/mdx/ParseTreeWriter.java

-9
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ public class ParseTreeWriter {
4141
private final PrintWriter pw;
4242
private int linePrefixLength;
4343
private String linePrefix;
44-
private boolean isInsideSingleQuote;
4544

4645
private static final int INDENT = 4;
4746
private static String bigString = " ";
@@ -113,14 +112,6 @@ private static synchronized String spaces(int n)
113112
}
114113
return bigString.substring(0, n);
115114
}
116-
117-
boolean isInsideSingleQuote() {
118-
return isInsideSingleQuote;
119-
}
120-
121-
void setInsideSingleQuote(boolean isInsideSingleQuote) {
122-
this.isInsideSingleQuote = isInsideSingleQuote;
123-
}
124115
}
125116

126117
// End ParseTreeWriter.java

src/org/olap4j/mdx/WithMemberNode.java

+6-8
Original file line numberDiff line numberDiff line change
@@ -62,20 +62,18 @@ public void unparse(ParseTreeWriter writer) {
6262
PrintWriter pw = writer.getPrintWriter();
6363
pw.print("MEMBER ");
6464
name.unparse(writer);
65-
pw.print(" AS '");
66-
writer.setInsideSingleQuote(true);
67-
try {
68-
expression.unparse(writer);
69-
} finally {
70-
writer.setInsideSingleQuote(false);
71-
}
72-
pw.print("'");
65+
writer.indent();
66+
pw.println(" AS");
67+
// The MDX language, and olap4j's parser, allows formulas in calculated
68+
// members and sets to be specified with and without single quotes.
69+
expression.unparse(writer);
7370
if (memberPropertyList != null) {
7471
for (PropertyValueNode memberProperty : memberPropertyList) {
7572
pw.print(", ");
7673
memberProperty.unparse(writer);
7774
}
7875
}
76+
writer.outdent();
7977
}
8078

8179
/**

src/org/olap4j/mdx/WithSetNode.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ public void unparse(ParseTreeWriter writer) {
5454
PrintWriter pw = writer.getPrintWriter();
5555
pw.print("SET ");
5656
name.unparse(writer);
57-
pw.print(" AS '");
57+
writer.indent();
58+
pw.println(" AS");
5859
expression.unparse(writer);
59-
pw.print("'");
60+
writer.outdent();
6061
}
6162

6263
/**

testsrc/org/olap4j/mdx/MdxTest.java

+27-4
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,12 @@ public void testParseIdentifier() {
116116

117117
/**
118118
* Tests that escaped single quotes ('') nested inside a quoted
119-
* part of a query are unparsed as escaped quotes as well.
119+
* part of a query are handled correctly. The MDX language allows
120+
* expressions for calculated members and sets to be specified with and
121+
* without single quotes; the unparser generates expressions without quotes.
120122
*/
121123
public void testQuoteEscaping() {
122-
final String query =
124+
String query =
123125
"WITH\n"
124126
+ "MEMBER [CustomerDim].[CustomerName].[XL_QZX] AS 'Aggregate"
125127
+ "({[CustomerDim].[CustomerName].&[ABC INT''L],"
@@ -129,8 +131,29 @@ public void testQuoteEscaping() {
129131
+ "FROM [cube]\n"
130132
+ "WHERE ([CustomerDim].[CustomerName].[XL_QZX])";
131133
final MdxParser parser = new DefaultMdxParserImpl();
132-
final SelectNode rootNode = parser.parseSelect(query);
133-
assertEquals(query,TestContext.unfold(rootNode.toString()));
134+
SelectNode rootNode = parser.parseSelect(query);
135+
TestContext.assertEqualsVerbose(
136+
"WITH\n"
137+
+ "MEMBER [CustomerDim].[CustomerName].[XL_QZX] AS\n"
138+
+ " Aggregate({[CustomerDim].[CustomerName].&[ABC INT'L], [CustomerDim].[CustomerName].&[XYZ]})\n"
139+
+ "SELECT\n"
140+
+ "{[Measures].[Sales]} ON COLUMNS\n"
141+
+ "FROM [cube]\n"
142+
+ "WHERE ([CustomerDim].[CustomerName].[XL_QZX])",
143+
rootNode.toString());
144+
145+
// Now named set
146+
query =
147+
"WITH SET Foo as Filter(Bar.Members, Instr(Name, \"'\") > 0)\n"
148+
+ "SELECT FROM [Cube]";
149+
rootNode = parser.parseSelect(query);
150+
TestContext.assertEqualsVerbose(
151+
"WITH\n"
152+
+ "SET Foo AS\n"
153+
+ " Filter(Bar.Members, (Instr(Name, \"'\") > 0.0))\n"
154+
+ "SELECT\n"
155+
+ "FROM [Cube]",
156+
rootNode.toString());
134157
}
135158
}
136159

0 commit comments

Comments
 (0)