⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mementotest.java

📁 OLAP 的客户端代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * Created on 12.08.2003
 *  by hh
 */
package com.tonbeller.jpivot.mondrian;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

import junit.framework.TestCase;

import org.xml.sax.SAXException;

import com.tonbeller.jpivot.olap.model.Axis;
import com.tonbeller.jpivot.olap.model.Hierarchy;
import com.tonbeller.jpivot.olap.model.Member;
import com.tonbeller.jpivot.olap.model.OlapException;
import com.tonbeller.jpivot.olap.model.Position;
import com.tonbeller.jpivot.olap.model.Result;
import com.tonbeller.jpivot.olap.navi.ChangeSlicer;
import com.tonbeller.jpivot.olap.navi.DrillExpandPosition;
import com.tonbeller.jpivot.olap.navi.DrillReplace;
import com.tonbeller.jpivot.olap.navi.ExpressionParser;
import com.tonbeller.jpivot.olap.navi.SortRank;
import com.tonbeller.jpivot.olap.query.DrillExpandPositionExt;
import com.tonbeller.jpivot.olap.query.DrillReplaceExt;
import com.tonbeller.jpivot.olap.query.ExpBean;
import com.tonbeller.jpivot.olap.query.PositionNodeBean;
import com.tonbeller.jpivot.olap.query.ResultBase;
import com.tonbeller.wcf.bookmarks.Bookmarkable;

/**
 * Test Memento State Serialization.
 */
public class MementoTest extends TestCase {

  /**
   */
  public MementoTest() {
    super();
  }

  /**
   * @param arg0
   */
  public MementoTest(String arg0) {
    super(arg0);
  }

  public void testMementoExpandExtensional() throws Exception {
    MondrianMemento memento = createMementoExpand(Bookmarkable.EXTENSIONAL);
    assertEquals(2, memento.getQuaxes().length);
    PositionNodeBean nb = memento.getQuaxes()[1].getPosTreeRoot();
    assertEquals(3, nb.getChildren().length);
    assertEquals( "[Gender].[All Gender].[F]", nb.getChildren()[2].getReference().getName());
    String xml = serializeMemento(memento);
    setMementoExpand(xml);
  }

  public void testMementoExpandIntensional() throws Exception {
    MondrianMemento memento = createMementoExpand(Bookmarkable.INTENSIONAL);
    assertEquals(2, memento.getQuaxes().length);
    // check measures on columns
    PositionNodeBean nb = memento.getQuaxes()[0].getPosTreeRoot();
    assertEquals(1, nb.getChildren().length);
    assertNull(nb.getReference());
    ExpBean eb = nb.getChildren()[0].getReference();
    assertEquals(3, eb.getArgs().length);
    // check rows
    nb = memento.getQuaxes()[1].getPosTreeRoot();
    assertEquals(1, nb.getChildren().length);
    assertNull(nb.getReference());
    String[] hiers = {"[Gender]", "[Marital Status]", "[Customers]", "[Product]"};
    for (int i = 0; i < hiers.length; i++) {
      assertEquals(1, nb.getChildren().length);
      nb = nb.getChildren()[0];
      eb = nb.getReference();
      assertEquals(ExpBean.TYPE_TOPLEVEL_MEMBERS, eb.getType());
      assertEquals(1, eb.getArgs().length);
      ExpBean arg = eb.getArgs()[0];
      assertEquals(ExpBean.TYPE_HIER, arg.getType());
      assertEquals(hiers[i], arg.getName());
    }
    
    // we use a different initial query to restore
    MondrianModel model = createSimpleModel();
    model.setBookmarkState(memento);
    Result result = model.getResult();
    Axis axis = result.getAxes()[1];
    // nur die toplevel member = ALL
    assertEquals(1, axis.getPositions().size());
    MondrianHierarchy[] mh = (MondrianHierarchy[]) axis.getHierarchies();
    for (int i = 0; i < hiers.length; i++) {
      assertEquals(hiers[i], mh[i].getUniqueName());
    }
  }

  public void testMementoDrillExtensional() throws Exception {
    MondrianMemento memento = createMementoDrill(Bookmarkable.EXTENSIONAL);
    assertEquals(2, memento.getQuaxes().length);
    PositionNodeBean nb = memento.getQuaxes()[1].getPosTreeRoot();
    assertEquals(1, nb.getChildren().length);
    assertEquals("[Store].[All Stores]", nb.getChildren()[0].getReference().getArgs()[0].getName());
    String xml = serializeMemento(memento);
    setMementoDrill(xml);
  }

  public void testMementoDrillIntensional() throws Exception {
    MondrianMemento memento = createMementoDrill(Bookmarkable.INTENSIONAL);
    assertEquals(2, memento.getQuaxes().length);
    PositionNodeBean nb = memento.getQuaxes()[1].getPosTreeRoot();
    assertNull(nb.getReference());
    assertEquals(1, nb.getChildren().length);
    nb = nb.getChildren()[0];
    ExpBean eb = nb.getReference();
    assertEquals(ExpBean.TYPE_TOPLEVEL_MEMBERS, eb.getType());
    assertEquals(1, eb.getArgs().length);
    eb = eb.getArgs()[0];
    assertEquals(ExpBean.TYPE_HIER, eb.getType());
    assertEquals("[Store]", eb.getName());
    
    MondrianModel model = createSimpleModel();
    model.setBookmarkState(memento);
    Result result = model.getResult();
    
    // nur die toplevel member = ALL
    Axis axis = result.getAxes()[1];
    assertEquals(1, axis.getPositions().size());
  }
  
  /**
   * slicer is restored by bookmark
   */
  public void testSlicerExtensional() throws Exception {
    MondrianMemento memento = createMementoSlicer(Bookmarkable.EXTENSIONAL);
    MondrianModel model = createSimpleModel();
    model.setBookmarkState(memento);
    Result result = model.getResult();
    Axis axis = result.getSlicer();
    assertNotNull(axis);
    Position pos = (Position) axis.getPositions().get(0);
    MondrianMember[] m = (MondrianMember[]) pos.getMembers();
    assertEquals(1, m.length);
    assertEquals("[Time].[1997]", m[0].getUniqueName());
  }
  
  /**
   * slicer is NOT restored by bookmark - because the members
   * may not be available anymore when the slicer is restored
   */
  public void testSlicerIntensional() throws Exception {
    MondrianMemento memento = createMementoSlicer(Bookmarkable.INTENSIONAL);
    MondrianModel model = createSimpleModel();
    model.setBookmarkState(memento);
    Result result = model.getResult();
    Axis axis = result.getSlicer();
    assertNotNull(axis);
    Position pos = (Position) axis.getPositions().get(0);
    MondrianMember[] m = (MondrianMember[]) pos.getMembers();
    assertEquals(0, m.length);
  }
  
  
  public void testSortExtensional() throws Exception {
    MondrianMemento memento = createMementoSort(createSimpleModel(), Bookmarkable.EXTENSIONAL);
    assertEquals("[Measures].[Unit Sales]", memento.getSortPosMembers()[0]);
    Result result = restoreMementoSort(createCalcMeasureModel(), memento);
    assertEquals(3, result.getAxes()[1].getPositions().size());  
  }

  public void testSortIntensional() throws Exception {
    MondrianMemento memento = createMementoSort(createSimpleModel(), Bookmarkable.INTENSIONAL);
    Result result = restoreMementoSort(createCalcMeasureModel(), memento);
    assertEquals(1, result.getAxes()[1].getPositions().size());  
    assertEquals("[Measures].[Unit Sales]", memento.getSortPosMembers()[0]);
    // ensure no ex is thrown when the sort position can not be restored
    MondrianModel model = createSimpleModel();
    SortRank sr = (SortRank) model.getExtension(SortRank.ID);
    memento.setSortPosMembers(new String[]{"[Measures].[Invalid Measure]"});
    model.setBookmarkState(memento);
    assertFalse(sr.isSorting());
    result = model.getResult();
    assertEquals(1, result.getAxes()[1].getPositions().size());  
  }
  
  public void testSortCalcMeasureExtensional() throws Exception {
    MondrianMemento memento = createMementoSort(createCalcMeasureModel(), Bookmarkable.EXTENSIONAL);
    assertEquals("[Measures].[Calculated]", memento.getSortPosMembers()[0]);
    Result result = restoreMementoSort(createSimpleModel(), memento);
    assertEquals(3, result.getAxes()[1].getPositions().size());  
  }

  public void testSortCalcMeasureIntensional() throws Exception {
    MondrianMemento memento = createMementoSort(createCalcMeasureModel(), Bookmarkable.INTENSIONAL);
    assertEquals("[Measures].[Calculated]", memento.getSortPosMembers()[0]);
    Result result = restoreMementoSort(createSimpleModel(), memento);
    assertEquals(1, result.getAxes()[1].getPositions().size());  
  }
  
  public MondrianMemento createMementoSlicer(int levelOfDetail) throws Exception {
    MondrianModel model = createSimpleModel();
    ChangeSlicer cs = (ChangeSlicer) model.getExtension(ChangeSlicer.ID);
    ExpressionParser ep = (ExpressionParser)model.getExtension(ExpressionParser.ID);
    Member m = ep.lookupMember("[Time].[1997]");
    cs.setSlicer(new Member[]{m});
    Result result = model.getResult();
    // create and test memento
    MondrianMemento memento = (MondrianMemento) model.getBookmarkState(levelOfDetail);
    return memento;
  }
  
  public MondrianMemento createMementoSort(MondrianModel model, int levelOfDetail) throws Exception {
    SortRank sr = (SortRank) model.getExtension(SortRank.ID);
    // first step
    Result result = model.getResult();
    sr.setSortMode(SortRank.ASC);
    sr.setSorting(true);
    Axis axis = result.getAxes()[0];
    Position pos = (Position) axis.getPositions().get(0);
    sr.sort(axis, pos);
    // second step
    result = model.getResult();
    // create and test memento
    MondrianMemento memento = (MondrianMemento) model.getBookmarkState(levelOfDetail);
    assertTrue(memento.isSorting());
    assertEquals(1, memento.getSortPosMembers().length);
    return memento;
  }
  
  public Result restoreMementoSort(MondrianModel model, MondrianMemento memento) throws Exception {
    SortRank sr = (SortRank) model.getExtension(SortRank.ID);
    model.setBookmarkState(memento);
    assertTrue(sr.isSorting());
    Result result = model.getResult();
    assertEquals(2, result.getAxes().length);
    return result;
  }

  private MondrianModel createSimpleModel() throws SAXException, IOException, OlapException {
    String mdxQuery =
      "select {[Measures].[Unit Sales]} on columns,"
      + "  [Product].[Product Family].Members ON rows\n"
        + "from [Sales]";
    MondrianModel model = MondrianModelFactory.instance();
    model.setMdxQuery(mdxQuery);
    TestConnection.initModel(model);
    return model;
  }

  private MondrianModel createCalcMeasureModel() throws SAXException, IOException, OlapException {
    String mdxQuery =
      "with member [Measures].[Calculated] as '([Measures].[Store Sales] - [Measures].[Store Cost])', format_string = \"#,##0.00\"\n"
        + "select {[Measures].[Calculated]} ON columns,\n"
        + "  [Product].[Product Family].Members ON rows\n"
        + "from [Sales]\n";
    MondrianModel model = MondrianModelFactory.instance();
    model.setMdxQuery(mdxQuery);
    TestConnection.initModel(model);
    return model;
  }

  
  public MondrianMemento createMementoExpand(int levelOfDetail) throws Exception {
    String renderFile = null; // "d:\\x\\createMementoExpand";
    int renderNum = 0;

    String mdxQuery =
      "select {[Measures].[Unit Sales], [Measures].[Store Cost], [Measures].[Store Sales]} on columns,"
        + "{([Gender].[All Gender], [Marital Status].[All Marital Status],"
        + "[Customers].[All Customers],"
        + "[Product].[All Products] ) } on rows "
        + "from Sales where ([Time].[1997])";

    Result result;
    List positions;

    MondrianModel model = MondrianModelFactory.instance();
    model.setMdxQuery(mdxQuery);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -