Skip to content

Commit

Permalink
Fix further issues in bug 3042937 by no longer enclosing formula of c…
Browse files Browse the repository at this point in the history
…alculated

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
  • Loading branch information
julianhyde committed Aug 12, 2010
1 parent c6702a9 commit d13bb5c
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 30 deletions.
8 changes: 1 addition & 7 deletions src/org/olap4j/mdx/IdentifierNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

public void unparse(ParseTreeWriter writer) {
String str = toString();
if(writer.isInsideSingleQuote()) {
str = str.replace("'", "''");
}
writer.getPrintWriter().print(str);
writer.getPrintWriter().print(this);
}

public String toString() {
Expand Down
9 changes: 0 additions & 9 deletions src/org/olap4j/mdx/ParseTreeWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ public class ParseTreeWriter {
private final PrintWriter pw;
private int linePrefixLength;
private String linePrefix;
private boolean isInsideSingleQuote;

private static final int INDENT = 4;
private static String bigString = " ";
Expand Down Expand Up @@ -113,14 +112,6 @@ private static synchronized String spaces(int n)
}
return bigString.substring(0, n);
}

boolean isInsideSingleQuote() {
return isInsideSingleQuote;
}

void setInsideSingleQuote(boolean isInsideSingleQuote) {
this.isInsideSingleQuote = isInsideSingleQuote;
}
}

// End ParseTreeWriter.java
14 changes: 6 additions & 8 deletions src/org/olap4j/mdx/WithMemberNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,20 +62,18 @@ public void unparse(ParseTreeWriter writer) {
PrintWriter pw = writer.getPrintWriter();
pw.print("MEMBER ");
name.unparse(writer);
pw.print(" AS '");
writer.setInsideSingleQuote(true);
try {
expression.unparse(writer);
} finally {
writer.setInsideSingleQuote(false);
}
pw.print("'");
writer.indent();
pw.println(" AS");
// The MDX language, and olap4j's parser, allows formulas in calculated
// members and sets to be specified with and without single quotes.
expression.unparse(writer);
if (memberPropertyList != null) {
for (PropertyValueNode memberProperty : memberPropertyList) {
pw.print(", ");
memberProperty.unparse(writer);
}
}
writer.outdent();
}

/**
Expand Down
5 changes: 3 additions & 2 deletions src/org/olap4j/mdx/WithSetNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ public void unparse(ParseTreeWriter writer) {
PrintWriter pw = writer.getPrintWriter();
pw.print("SET ");
name.unparse(writer);
pw.print(" AS '");
writer.indent();
pw.println(" AS");
expression.unparse(writer);
pw.print("'");
writer.outdent();
}

/**
Expand Down
31 changes: 27 additions & 4 deletions testsrc/org/olap4j/mdx/MdxTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,12 @@ public void testParseIdentifier() {

/**
* Tests that escaped single quotes ('') nested inside a quoted
* part of a query are unparsed as escaped quotes as well.
* part of a query are handled correctly. The MDX language allows
* expressions for calculated members and sets to be specified with and
* without single quotes; the unparser generates expressions without quotes.
*/
public void testQuoteEscaping() {
final String query =
String query =
"WITH\n"
+ "MEMBER [CustomerDim].[CustomerName].[XL_QZX] AS 'Aggregate"
+ "({[CustomerDim].[CustomerName].&[ABC INT''L],"
Expand All @@ -129,8 +131,29 @@ public void testQuoteEscaping() {
+ "FROM [cube]\n"
+ "WHERE ([CustomerDim].[CustomerName].[XL_QZX])";
final MdxParser parser = new DefaultMdxParserImpl();
final SelectNode rootNode = parser.parseSelect(query);
assertEquals(query,TestContext.unfold(rootNode.toString()));
SelectNode rootNode = parser.parseSelect(query);
TestContext.assertEqualsVerbose(
"WITH\n"
+ "MEMBER [CustomerDim].[CustomerName].[XL_QZX] AS\n"
+ " Aggregate({[CustomerDim].[CustomerName].&[ABC INT'L], [CustomerDim].[CustomerName].&[XYZ]})\n"
+ "SELECT\n"
+ "{[Measures].[Sales]} ON COLUMNS\n"
+ "FROM [cube]\n"
+ "WHERE ([CustomerDim].[CustomerName].[XL_QZX])",
rootNode.toString());

// Now named set
query =
"WITH SET Foo as Filter(Bar.Members, Instr(Name, \"'\") > 0)\n"
+ "SELECT FROM [Cube]";
rootNode = parser.parseSelect(query);
TestContext.assertEqualsVerbose(
"WITH\n"
+ "SET Foo AS\n"
+ " Filter(Bar.Members, (Instr(Name, \"'\") > 0.0))\n"
+ "SELECT\n"
+ "FROM [Cube]",
rootNode.toString());
}
}

Expand Down

0 comments on commit d13bb5c

Please sign in to comment.