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启动,然后配置一些数据信息,便能获取最近一天的数据信息了。

  • 相关阅读:
    POJ 2175 Evacuation Plan 费用流 负圈定理
    POJ 2983 Is the Information Reliable? 差分约束
    codeforces 420B Online Meeting
    POJ 3181 Dollar Dayz DP
    POJ Ant Counting DP
    POJ 1742 Coins DP 01背包
    中国儒学史
    产品思维30讲
    Java多线程编程核心技术
    编写高质量代码:改善Java程序的151个建议
  • 原文地址:https://www.cnblogs.com/DFX339/p/10449863.html
Copyright © 2011-2022 走看看