基于mondrian开发,mdx查询的小例子

来源:互联网 发布:传奇霸业检测网络异常 编辑:程序博客网 时间:2024/04/30 01:33

     mondiran,开源的bi展现工具,但是如果使用 jpivot 的标签来展现 mondrian 的数据,总是有些不顺手,不能和自己的程序融为一体。所以研究了相关标签的代码,写了这个小示例程序。

 

    1、查询数据,主要参考标签源代码:
   com.tonbeller.jpivot.tags.MondrianOlapModelTag

 

  1.     public OlapModel getResultOlapModel(PageContext pageContext, RequestContext context, String mdxQuery, String id) throws JspException {
  2.         try {
  3.             OlapModel om = getOlapModel(pageContext, context, mdxQuery);
  4.             om = (OlapModel) om.getTopDecorator();
  5.             om.setLocale(context.getLocale());
  6.             om.setID(id);
  7.             HttpSession session = pageContext.getSession();
  8.             om.setServletContext(session.getServletContext());
  9.             OlapModelProxy omp = OlapModelProxy.instance(id, session);
  10.             omp.initializeAndShow(om);
  11.             return om;
  12.         } catch (Exception e) {
  13.             throw new JspException(e);
  14.         }
  15.     }
  16.     public OlapModel getOlapModel(PageContext pageContext, RequestContext context, String mdxQuery) throws JspException, OlapException,
  17.             SAXException, IOException {
  18.         MondrianModelFactory.Config cfg = new MondrianModelFactory.Config();
  19.         URL schemaUrl;
  20.         if (catalogUri.startsWith("/"))
  21.             schemaUrl = pageContext.getServletContext().getResource(catalogUri);
  22.         else
  23.             schemaUrl = new URL(catalogUri);
  24.         if (schemaUrl == null)
  25.             throw new JspException("could not find Catalog /"" + catalogUri + "/"");
  26.         cfg.setMdxQuery(mdxQuery);
  27.         // Add the schema URL. Enclose the value in quotes to permit
  28.         // schema URLs that include things like ;jsessionid values.
  29.         cfg.setSchemaUrl("/"" + schemaUrl.toExternalForm() + "/"");
  30.         cfg.setJdbcUrl(jdbcUrl);
  31.         cfg.setJdbcDriver(jdbcDriver);
  32.         cfg.setJdbcUser(jdbcUser);
  33.         cfg.setJdbcPassword(jdbcPassword);
  34.         cfg.setDataSource(dataSource);
  35.         cfg.setRole(role);
  36.         cfg.setDynResolver(dynResolver);
  37.         cfg.setDynLocale(dynLocale);
  38.         cfg.setConnectionPooling(connectionPooling);
  39.         cfg.setDataSourceChangeListener(dataSourceChangeListener);
  40.         allowOverride(context, cfg);
  41.         URL url;
  42.         if (config == null)
  43.             url = getDefaultConfig();
  44.         else
  45.             url = pageContext.getServletContext().getResource(config);
  46.         MondrianModel mm = MondrianModelFactory.instance(url, cfg);
  47.         OlapModel om = (OlapModel) mm.getTopDecorator();
  48.         om.setLocale(context.getLocale());
  49.         om.setServletContext(context.getSession().getServletContext());
  50.         return om;
  51.     }

 

 

2、展示数据,主要参考标签源代码:
   com.tonbeller.wcf.component.RendererTag

 

  1.     public String getResultTable() throws JspException {
  2.         String ret = "";
  3.         try {
  4.             
  5.             // 表格展示
  6.             java.net.URL configUrl = null;
  7.             configUrl = this.getClass().getResource("/com/tonbeller/jpivot/table/config.xml");
  8.             String renderId = "table_" + id;
  9.             Renderable comp = (Renderable) getComponentForTable(renderId, configUrl, olapModel);
  10.             // add "context" and "renderId" to parameter map
  11.             HashMap para = new HashMap();
  12.             para.putAll(RendererParameters.getParameterMap((HttpServletRequest) pageContext.getRequest()));
  13.             createPredefinedParameters(requestContext, para, renderId);
  14.             Transformer transformer = XmlUtils.getTransformer(httpSession, "/WEB-INF/olap/mdxtable.xsl"true);
  15.             setXslParameters(requestContext, transformer, para);
  16.             Document document = comp.render(requestContext);
  17.             DOMSource source = new DOMSource(document);
  18.             StringWriter sw = new StringWriter();
  19.             StreamResult result = new StreamResult(sw);
  20.             transformer.transform(source, result);
  21.             sw.flush();
  22.             ret = sw.toString();
  23.         } catch (Exception e) {
  24.             throw new JspException(e);
  25.         }
  26.         return ret;
  27.     }

 

 

3、可以自己从mondrian的查询结果中将数据整理成自己需要的格式,主要代码如下:

  1.     public void getData(OlapModel om){
  2.         try{
  3.             com.tonbeller.jpivot.mondrian.MondrianResult result = (com.tonbeller.jpivot.mondrian.MondrianResult)om.getResult();
  4.     
  5.             com.tonbeller.jpivot.olap.model.Axis[] axes = result.getAxes(); 
  6.             java.util.List cells = result.getCells(); 
  7.             
  8.             com.tonbeller.jpivot.olap.model.Axis measureAxis = axes[0]; 
  9.             com.tonbeller.jpivot.olap.model.Axis rowAxis = null;
  10.             if(axes.length>1) rowAxis = axes[1]; 
  11.             int numMeasures = 0;
  12.             
  13.             //列
  14.             System.out.println("");
  15.             System.out.println("/////////////////////////////////////////////////");
  16.             com.tonbeller.jpivot.olap.model.Hierarchy[] measureHierarchies = measureAxis.getHierarchies();
  17.             for(int i=0;i<measureHierarchies.length;i++){
  18.                 com.tonbeller.jpivot.olap.model.Hierarchy hierarchy = measureHierarchies[i];
  19.                 System.out.print(hierarchy.getLabel() + "/t");
  20.             }
  21.             
  22.             //列名
  23.             System.out.println("");
  24.             System.out.println("/////////////////////////////////////////////////");
  25.             java.util.List measurePositions = measureAxis.getPositions(); 
  26.             numMeasures = measurePositions.size();
  27.             for(int i=0;i<measurePositions.size();i++){
  28.                 com.tonbeller.jpivot.olap.model.Position position =  (com.tonbeller.jpivot.olap.model.Position)measurePositions.get(i);
  29.                 com.tonbeller.jpivot.olap.model.Member[] posMembers = position.getMembers();
  30.                 
  31.                 for(int j=0;j<posMembers.length;j++){
  32.                     System.out.print(posMembers[j].getLabel() + "/t");
  33.                 }
  34.                 System.out.println("");
  35.             }
  36.             if(rowAxis!=null){
  37.                 //行
  38.                 System.out.println("");
  39.                 System.out.println("/////////////////////////////////////////////////");
  40.                 com.tonbeller.jpivot.olap.model.Hierarchy[] rowHierarchies = rowAxis.getHierarchies(); 
  41.                 for(int i=0;i<rowHierarchies.length;i++){
  42.                     com.tonbeller.jpivot.olap.model.Hierarchy hierarchy = rowHierarchies[i];
  43.                     System.out.print(hierarchy.getLabel() + "/t");
  44.                 }
  45.                 
  46.                 //行名
  47.                 System.out.println("");
  48.                 System.out.println("/////////////////////////////////////////////////");
  49.                 java.util.List rowPositions = rowAxis.getPositions(); 
  50.                 for(int i=0;i<rowPositions.size();i++){
  51.                     com.tonbeller.jpivot.olap.model.Position position =  (com.tonbeller.jpivot.olap.model.Position)rowPositions.get(i);
  52.                     com.tonbeller.jpivot.olap.model.Member[] posMembers = position.getMembers();
  53.                     for(int j=0;j<posMembers.length;j++){
  54.                         System.out.print(posMembers[j].getLabel() + "/t");
  55.                     }
  56.                     System.out.println("");
  57.                 }
  58.             }
  59.             
  60.             //值
  61.             System.out.println("");
  62.             System.out.println("/////////////////////////////////////////////////");
  63.             for(int i=0;i<cells.size();i++){
  64.                 if(i % numMeasures==0){
  65.                     System.out.println("");
  66.                 }
  67.                 
  68.                 com.tonbeller.jpivot.olap.model.Cell cell = (com.tonbeller.jpivot.olap.model.Cell)cells.get(i);
  69.                 System.out.print(cell.getFormattedValue() + "/t");
  70.             }
  71.         } catch (Exception e) {
  72.             e.printStackTrace();
  73.         }
  74.     }

 

 

4、源代码例子可以在我的资源中下载,需要一个资源分,呵呵。

原创粉丝点击