zoukankan      html  css  js  c++  java
  • Saiku更改源代码实现默认查询一天的数据(十)

    Saiku通过更改源代码实现默认查询前一天数据

    saiku在本地进行的编译的方式前面已有教程说明,接下来就是更改原代码了 (从网上学得教程,目前只了解到获取最新一天的数据信息)

    参考博客地址: https://blog.csdn.net/zstao168/article/details/52818569

     

    1. 主要更改的类信息:在saiku-web工程中的Query2Resource.java中,具体类路径为:  /saiku-web/src/main/java/org/saiku/web/rest/resources/Query2Resource.java

    在该类的 public QueryResult execute(ThinQuery tq  ) 方法中添加  tq = this.restrictQueryByDate(tq);  (execute方法大概在该类的 185-220行左右)

     /**
       *
       * Execute a Saiku Query
       * @summary Execute Query
       * @param tq Thin Query model
       * @return A query result set.
       */
        @POST
        @Consumes({"application/json" })
        @Path("/execute")
        public QueryResult execute(ThinQuery tq) {
        
        	//add code to limit query date
        	tq = this.restrictQueryByDate(tq);
            try {
                if (thinQueryService.isMdxDrillthrough(tq)) {
                    Long start = (new Date()).getTime();
                    ResultSet rs = thinQueryService.drillthrough(tq);
                    QueryResult rsc = RestUtil.convert(rs);
                    rsc.setQuery(tq);
                    Long runtime = (new Date()).getTime()- start;
                    rsc.setRuntime(runtime.intValue());
                    return rsc;
                }
    
                QueryResult qr = RestUtil.convert(thinQueryService.execute(tq));
                ThinQuery tqAfter = thinQueryService.getContext(tq.getName()).getOlapQuery();
                qr.setQuery(tqAfter);
                return qr;
            }
            catch (Exception e) {
                log.error("Cannot execute query (" + tq + ")",e);
                String error = ExceptionUtils.getRootCauseMessage(e);
                return new QueryResult(error);
            }
        }
    

     

    在Query2Resource.java类中添加 ThinQuery  restrictQueryByDate(ThinQuery tq) 方法,内容如下

      // add code for query limit
      private ThinQuery restrictQueryByDate(ThinQuery tq) {
    	  
    		ThinQueryModel queryModel = tq.getQueryModel();
    	  	Map<AxisLocation, ThinAxis> axesMap = queryModel.getAxes();
    	  	
    	  	NamedList<ThinHierarchy> namedList = new NamedListImpl<ThinHierarchy>();
    	  	
    	  	ThinAxis filterAxis = axesMap.get(AxisLocation.FILTER);
    	  	List<ThinHierarchy> filterHie = filterAxis.getHierarchies();
    	  	
    	  	namedList = this.resetThinHierachy(filterHie);
    	  		
    	  	//将修改后的Row重新set到queryModel
    	  	if(namedList.size() > 0) {
    	  		
    			ThinAxis newFilterAxis = new ThinAxis(
    					AxisLocation.FILTER,
    					namedList,
    					filterAxis.isNonEmpty(),
    					filterAxis.getAggregators()
    					);
    			
    			axesMap.put(AxisLocation.FILTER,newFilterAxis);
    	  	}
    	  	
    	  	//将修改后的Row重新set到queryModel
    	  	if(namedList.size() == 0) {
    	  		
    	  		ThinAxis rowAxis = axesMap.get(AxisLocation.ROWS);
    	  	  	List<ThinHierarchy> rowHie = rowAxis.getHierarchies();
    	  	  	
    	  	  	namedList = this.resetThinHierachy(rowHie);
    	  		
    	  		if(namedList.size() > 0) {
    				ThinAxis newRowsAxis = new ThinAxis(
    						AxisLocation.ROWS,
    						namedList,
    						rowAxis.isNonEmpty(),
    						rowAxis.getAggregators()
    						);
    				
    				axesMap.put(AxisLocation.ROWS,newRowsAxis);
    	  		}	
    	  	}
    	  	
    	  	//if columns contained date member
    	  	//if contained and have not set the limit ,then add limit to one day ,if do not hava then add this column and limit to one day;
    	  	if(namedList.size() == 0) {
    	  		
    //	  		namedList.clear();
    	  		
    	    	ThinAxis colAxis = axesMap.get(AxisLocation.COLUMNS);
    	    	List<ThinHierarchy> colHie = colAxis.getHierarchies();
    	    	
    	    	namedList = this.resetThinHierachy(colHie);
    	    	
    	    	if(namedList.size() == 0) {
    	    		
    	    		//if list is empty,then column don't hava date ,then add colHie to list and enfore to add date member;
    	    		namedList.addAll(colHie);
    	    		
    	    		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    				String yesterday = format.format(new Date(new Date().getTime() - 24 * 60 * 60 * 1000));
    				
    				String newDateMdx = "[SaikuUseDate].[SaikuUseDate].["+yesterday+"]";
    				
    				ThinMember thinMember = new ThinMember(yesterday,newDateMdx,yesterday);
    	    		ThinHierarchy thinHie = new ThinHierarchy();
    	    		
    	    		thinHie.setName("[SaikuUseDate].[SaikuUseDate]");
    	    		
    	    		List<ThinMember> thinMemberList = new ArrayList<ThinMember>();
    				thinMemberList.add(thinMember);
    				ThinSelection selection = new ThinSelection();
    				selection.setMembers(thinMemberList);
    				selection.setType(ThinSelection.Type.INCLUSION);
    				ThinLevel thinLevel = new ThinLevel(yesterday,yesterday,selection,null);
    		//  			thinLevel.setSelection(selection);
    				Map<String,ThinLevel> mapLevel = new LinkedHashMap<String,ThinLevel>();
    				mapLevel.put("SaikuUseDate", thinLevel);
    		    		
    				thinHie.setLevels(mapLevel);
    				
    				namedList.add(thinHie);
    	    		ThinAxis newColAxis = new ThinAxis(
    	    				AxisLocation.COLUMNS,
    	    				namedList,
    	    				colAxis.isNonEmpty(),
    	    				colAxis.getAggregators()
    	    				);
    	    		
    	    		axesMap.put(AxisLocation.COLUMNS,newColAxis);
    	    	}
    	  	}
    	  	
    	  	return tq;
    	  }
    	  
    	  private NamedList<ThinHierarchy> resetThinHierachy(List<ThinHierarchy> hieList) {
    		  
    		  NamedList<ThinHierarchy> namedList = new NamedListImpl<ThinHierarchy>();
    		  boolean flag = false;
    		  
    		  for(ThinHierarchy hie : hieList) {
    		  		if(hie.getName().equals("[SaikuUseDate].[SaikuUseDate]")) {
    		    		
    		    		if(hie.getLevels().get("SaikuUseDate").getSelection() == null) {
    		    			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    		    			String yesterday = format.format(new Date(new Date().getTime() - 24 * 60 * 60 * 1000));
    		    			
    		    			String newDateMdx = "[SaikuUseDate].[SaikuUseDate].["+yesterday+"]";
    		    			
    		    			ThinMember thinMember = new ThinMember(null,newDateMdx,yesterday);
    		    			
    		    			List<ThinMember> thinMemberList = new ArrayList<ThinMember>();
    		    			thinMemberList.add(thinMember);
    		    			ThinSelection selection = new ThinSelection();
    		    			selection.setMembers(thinMemberList);
    		    			
    		    			hie.getLevels().get("SaikuUseDate").setSelection(selection);
    		    		}
    		    		
    		    		flag = true;
    		  		}
    		  		
    		  		namedList.add(hie);
    		  	}
    		  if(flag) return namedList;
    		  
    		  namedList.clear();
    		  return namedList;
    	  
    	  }
     
    

     

    ps:  如果 hie.getLevels().get("SaikuUseDate") 中得到的ThinLevel对象没有setSeletion(selection)方法,需要手工在ThinLevel中添加set方法

    还有一点需要注意,就是加上这些代码之后,saiku的schame文件中cube需要有 SaikuUseDate 日期字段

     

    最后将整个项目打包编译即可,将新的saiku-server启动,然后配置一些数据信息,便能获取最近一天的数据信息了。

  • 相关阅读:
    让Windows Server 2008 + IIS 7+ ASP.NET 支持10万个同时请求
    C#多线程锁定全局变量
    ASP.NET 防止F5刷新页面按钮重复提交
    子线程调用窗体控件
    asp.net 转成XML后在SQL操作XML的值
    Sql中字符串的循环截取(用循环实现输入键串能输出值串)
    大数据量分页存储过程
    函数相关概念,及练习
    js循环(while循环,do while循环,for循环)相关知识点及练习
    parseInt()和Number()的应用区别
  • 原文地址:https://www.cnblogs.com/DFX339/p/10449863.html
Copyright © 2011-2022 走看看