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

Saiku更改源代码实现默认查询一天的数据(十)的更多相关文章

  1. Saiku根据入参日期查询出对应的数据(二十)

    Saiku根据入参日期查询出对应的数据 之前好像有写过一篇博客关于saiku date range的,现在进一步更新啦!!! 这里的日期筛选会更完善一些,需要提供两个参数 开始日期与结束日期(star ...

  2. Saiku更改導出文件的文件名(十九)

    Saiku更改導出文件的文件名 Saiku查询完数据之后,可以以excel,pdf,csv等格式将数据导出,这里我们来讲一下怎么更改导出的文件名. 找到对应的导出方法所在的js文件: saiku-se ...

  3. Informatica 常用组件Source Qualifier之二 默认查询

    2 默认查询 对于关系源,PowerCenter Server 将在运行会话时为每个源限定符转换生成查询.对于每个在映射中使用的源列,默认查询均为 SELECT 语句.也就是说,PowerCenter ...

  4. Windows10系统如何更改程序的默认安装目录?

    Windows10系统如何更改程序的默认安装目录? 在Windows10系统的使用中,软件程序的默认安装目录是:C:\Program Files\...或者C:\Program Files(x86)\ ...

  5. 如何在TFS中恢复系统默认查询”已指派给我”的设置(TFS 2013)

    故事是这样开始的,一天开发人员求助说,在浏览器中修改了系统默认的工作项查询"已指派给我"的后,发现这个查询每次都提示超时,并且没有办法恢复到初始的设置状态,因为出现超时提示以后,查 ...

  6. mysql数据库管理工具sqlyog在首选项里可以设置默认查询分页条数和字体,改写关键字大小写

    sqlyog设置一直习惯用sqlyog来管理mysql数据库,但有三个地方用得不是很爽:1.默认查询条数只有1000条经常需要勾选掉重新查询.2.自动替换关键字大小写,有时候字段名为关键字的搞成大写的 ...

  7. [saiku] 系统登录成功后查询Cubes

    一.系统启动时初始化ds和conn 1.查询出目前系统拥有的Datasources和Connections放入内存中 2.比对saiku-datasources中的ds是否有新增的,如果有,创建新的d ...

  8. 也可以使用如下命令更改您的默认 Shell

    也可以使用如下命令更改您的默认 Shell chsh -s /bin/zsh (需要输入您的密码)

  9. 更改git bash默认的路径

    更改git bash默认的路径   在打开git bash时,每次都是在C:\Uer路径下,每次都需要先用cd命令转换到自己需要工作的路径(cd  /f/dss).修改打开git bash 时的默认的 ...

随机推荐

  1. cocos2d-x JS 各类点、圆、矩形之间的简单碰撞检测

    这里总结了一下点.圆.矩形之间的简单碰撞检测算法 (ps:矩形不包括旋转状态) 点和圆的碰撞检测: 1.计算点和圆心的距离 2.判断点与圆心的距离是否小于圆的半 isCollision: functi ...

  2. [Luogu]A%BProblem——线性筛素数与前缀和

    题目描述 题目背景 题目名称是吸引你点进来的[你怎么知道的] 实际上该题还是很水的[有种不祥的预感..] 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m接下来n行, ...

  3. 第八篇——Struts2的处理结果类型

    Struts2处理结果类型 1.SUCCESS:表示Action正确的执行完成,返回相应的视图,success是name属性的默认值: 2.ERROR:表示Action执行失败,返回到错误处理视图: ...

  4. 聊聊return false

    最近在做一些关于视频切换的时候.由于是用a标签做的会有默认的跳转.这时候我就想到了,return flase.阻止默认行为,也达到了预期的效果.后来就详细查了查.让我们来看看 “return fals ...

  5. windows 如何创建硬链接

    输入代码:mklink /d F:\ D:\pdf mklink /d 是命令语句,空格,接着是放置硬链接的位置,空格,再是目标文件夹.

  6. JS设计模式(1)单例模式

    什么是单例模式 定义:1.只有一个实例.2.可以全局访问 主要解决:一个全局使用的类频繁地创建与销毁. 何时使用:当您想控制实例数目,节省系统资源的时候. 如何解决:判断系统是否已经有这个单例,如果有 ...

  7. Hadoop Streaming 使用及参数设置

    http://www.cnblogs.com/hopelee/p/7476145.html https://blog.csdn.net/djy37010/article/details/5505103 ...

  8. 线上问题排查(2)——JDK内置工具

    https://www.cnblogs.com/keanuyaoo/p/3253663.html 常用命令目录: jps命令(Java Virtual Machine Process Status T ...

  9. Python标准模块--concurrent.futures(进程池,线程池)

    python为我们提供的标准模块concurrent.futures里面有ThreadPoolExecutor(线程池)和ProcessPoolExecutor(进程池)两个模块. 在这个模块里他们俩 ...

  10. MSSQL DB Replication Error

    Command attempted: if @@trancount > 0 rollback tran (Transaction sequence number: 0x000283BE00007 ...