接口查询主要场景是客户不想或者没有办法连接到数据源,需要通过接口的方式获取数;更多的是作为数据集的存在,并且返回的数据是基本都是一个大宽表。
Smartbi 数据模型支持添加 2 种接口查询:Java查询、脚本查询。
1、Java查询、脚本查询只支持抽取模式, 如果模型原先是直连模式,加入了Java查询会强制变成抽取模式!详情可查阅:直连&抽取。 2、如果Java查询、脚本查询有定义参数,可参考参数管理进行参数映射。 |
Java查询是指由用户通过二次开发,自定义JavaQueryData接口实现类,以实现自定义数据结构。
支持以下几种方式:
需要写java代码从接口获取不开放数据库取数的场景:自定义类。
下面示例演示通"CSV查询"获取文件数据。
刘老师想基于把学生的每个月的考试分数进行一个趋势分析,所以把线下数据上传到服务器上进行分析。
下载示例数据:StudentScore.csv
具体步骤如下:
1)需要先把CSV格式的文件上传到部署Smartbi war包的服务器上,以Linux服务器为例,可以把文件上传到home目录下:路径不限,存放的文件夹可以是自己新建的,也可以是已有的文件夹中。
2)存放好之后再去模型中建【Java查询】,选择”CSV查询“,操作如下图:
3)获取到数据,想回到数据模型,建议先点击【保存】之后再点击【回到模型】;
回到模型,可以选中该查询,右键菜单可以对该进行进行更多的操作比如编辑、复制等,具体可查看:设置及修改查询
对于技术能力比较强的客户,Smartbi提供了灵活的接口,方便用户自定义Java文件,实现某些业务需求。
为了方便举例,本文用产品内置的”smartbi.session.SessionQueryData“即获取”每日会话信息“为例。
具体的操作如下:
1)创建模型并在里面添加“Java查询”
2)如果要回到模型,建议先点击保存,然后再回到模型,更多操作可查看设置及修改查询;
脚本查询是指通过编写代码脚本获取数据结果;
目前“脚本查询”支持的语言只有JavaScript,因此适用于熟悉JavaScript的技术人员,相关接口文档可参考IJavaQueryData。
为了方面理解,以产品自带的数据源“northwind”中的【产品表】为目标资源,展示了如何通过编写JavaScript脚本获取指定节点ID的数据源表数据的例子来进行说明。
具体操作如下:
1)左侧 “系统导航栏”中的“数据连接” ,选择 “数据连接” > “northwind” > “产品表” ,右键打开扩展菜单,点击“属性”,找到【产品表】资源的节点ID,并且记录下来
2)去模型中建【脚本查询】,把刚记录下来的资源节点复制下图的变量中,如下图, 并且写好获取数据的代码,执行成功之后可以看到已经获取【产品表】的数据
importPackage(Packages.smartbi.freequery.client.datasource); var datasourceService = DataSourceService.getInstance(); var tableId = "TAB.northwind.null.products"; //目标资源的节点ID var table = datasourceService.getTable(tableId); var sql = "select"; var data; function init() { var fieldList = table.getFields(); var fields = []; for (var i = 0; i < fieldList.size(); i++) { var field = fieldList.get(i); sql = sql + " " + field.getName(); fields[i] = { id: field.getId(), //字段ID name: field.getName(), //字段名称 alias: field.getAlias(), //字段别名 desc: field.getDesc(), //字段描述 valueType: parseValueType(field.getDataType().getSQLType()) //字段数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME } if (i < fieldList.size() - 1) { sql = sql + ","; } } sql = sql + " from " + table.getName(); return { // //参数列表 // params: [{ // id: 'Param.northwind.null.products', //参数ID // name: 'ParamName', //参数名称 // alias: 'ParamAlias', //参数别名 // desc: 'ParamDesc', //参数描述 // nullable: true, //参数是否允许是空 // valueType: 'STRING' //参数数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME // }], //输出字段 fields: fields }; } function getGridData(paramValues, from, count) { data = datasourceService.executeNoCacheable(table.getDataSource().getId(), sql); return data; } function getRowCount() { return data.getRowsCount(); } /** 关闭查询对象 */ function close() {} function parseValueType(type) { switch ("" + type) { case "LONG": return "LONG"; case "BIGINT": case "INTEGER": return "INTEGER"; case "BIGDECIMAL": case "DOUBLE": return "DOUBLE"; case "TIME": case "DATE": case "DATETIME": return "DATETIME"; default: return "STRING"; } } |
单击 保存 按钮,系统提示保存成功后,当前脚本查询会以表的输出节点方式保存在数据模型的”表关系区“中,如下图:
可以在模型修改数据类型、修改别名、设置与其他查询的关系或者构建数据模型