Package org.olap4j.mdx

Source Code of org.olap4j.mdx.MdxTest

/*
// This software is subject to the terms of the Eclipse Public License v1.0
// Agreement, available at the following URL:
// http://www.eclipse.org/legal/epl-v10.html.
// Copyright (C) 2007-2010 Julian Hyde
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package org.olap4j.mdx;

import junit.framework.TestCase;

import java.util.*;

import org.olap4j.mdx.parser.MdxParser;
import org.olap4j.mdx.parser.impl.DefaultMdxParserImpl;
import org.olap4j.test.TestContext;

/**
* Testcase for org.olap4j.mdx package.
*
* @author jhyde
* @version $Id: MdxTest.java 381 2010-12-17 07:49:03Z jhyde $
* @since Dec 12, 2007
*/
public class MdxTest extends TestCase {
    /**
     * Tests methods {@link IdentifierNode#quoteMdxIdentifier(String)},
     * {@link IdentifierNode#unparseIdentifierList(java.util.List)}.
     */
    public void testQuoteMdxIdentifier() {
        assertEquals(
            "[San Francisco]",
            IdentifierNode.quoteMdxIdentifier("San Francisco"));

        assertEquals(
            "[a [bracketed]] string]",
            IdentifierNode.quoteMdxIdentifier("a [bracketed] string"));

        assertEquals(
            "[Store].[USA].[California]",
            IdentifierNode.unparseIdentifierList(
                Arrays.asList(
                    new NameSegment(
                        null, "Store", Quoting.QUOTED),
                    new NameSegment(
                        null, "USA", Quoting.QUOTED),
                    new NameSegment(
                        null, "California", Quoting.QUOTED))));
    }

    public void testImplode() {
        List<IdentifierSegment> fooBar =
            Arrays.<IdentifierSegment>asList(
                new NameSegment(
                    null, "foo", Quoting.UNQUOTED),
                new NameSegment(
                    null, "bar", Quoting.QUOTED));
        assertEquals(
            "foo.[bar]",
            IdentifierNode.unparseIdentifierList(fooBar));

        List<IdentifierSegment> empty = Collections.emptyList();
        assertEquals("", IdentifierNode.unparseIdentifierList(empty));

        List<IdentifierSegment> nasty =
            Arrays.<IdentifierSegment>asList(
                new NameSegment(
                    null, "string", Quoting.QUOTED),
                new NameSegment(
                    null, "with", Quoting.QUOTED),
                new NameSegment(
                    null, "a [bracket] in it", Quoting.QUOTED));
        assertEquals(
            "[string].[with].[a [bracket]] in it]",
            IdentifierNode.unparseIdentifierList(nasty));
    }

    public void testParseIdentifier() {
        List<IdentifierSegment> segments =
            IdentifierNode.parseIdentifier(
                "[string].[with].[a [bracket]] in it]").getSegmentList();
        assertEquals(3, segments.size());
        assertEquals(
            "a [bracket] in it",
            segments.get(2).getName());
        assertEquals(
            Quoting.QUOTED,
            segments.get(2).getQuoting());

        segments = IdentifierNode.parseIdentifier(
            "[Worklog].[All].[calendar-[LANGUAGE]].js]").getSegmentList();
        assertEquals(3, segments.size());
        assertEquals(
            "calendar-[LANGUAGE].js",
            segments.get(2).getName());

        segments = IdentifierNode.parseIdentifier("[foo].bar").getSegmentList();
        assertEquals(2, segments.size());
        assertEquals(
            Quoting.QUOTED,
            segments.get(0).getQuoting());
        assertEquals(
            Quoting.UNQUOTED,
            segments.get(1).getQuoting());

        try {
            segments =
                IdentifierNode.parseIdentifier("[foo].[bar").getSegmentList();
            fail("expected exception, got " + segments);
        } catch (RuntimeException e) {
            assertEquals(
                "Expected ']', in member identifier '[foo].[bar'",
                e.getMessage());
        }
    }

    /**
     * Unit test for {@link org.olap4j.mdx.IdentifierNode#ofNames(String...)}.
     */
    public void testIdentifierOfNames() {
        IdentifierNode identifierNode =
            IdentifierNode.ofNames(
                "string", "with", "a [bracket] in it");
        List<IdentifierSegment> segments =
            identifierNode.getSegmentList();
        assertEquals(3, segments.size());
        assertEquals(
            "a [bracket] in it",
            segments.get(2).getName());
        assertEquals(
            Quoting.QUOTED,
            segments.get(2).getQuoting());

        assertEquals(
            "[string].[with].[a [bracket]] in it]",
            identifierNode.toString());

        // Empty array is invalid.
        try {
            identifierNode = IdentifierNode.ofNames();
            fail("expected error, got " + identifierNode);
        } catch (IllegalArgumentException e) {
            // ok
        }

        // Array containing null is not valid.
        try {
            identifierNode =
                IdentifierNode.ofNames("foo", null, "bar");
            fail("expected error, got " + identifierNode);
        } catch (NullPointerException e) {
            // ok
        }
    }

    /**
     * Tests that escaped single quotes ('') nested inside a quoted
     * 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() {
        String query =
            "WITH\n"
            + "MEMBER [CustomerDim].[CustomerName].[XL_QZX] AS '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])";
        final MdxParser parser = new DefaultMdxParserImpl();
        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))\n"
            + "SELECT\n"
            + "FROM [Cube]",
            rootNode.toString());
    }
}

// End MdxTest.java
TOP

Related Classes of org.olap4j.mdx.MdxTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.