<< Click to Display Table of Contents >> 定制数据集复制链接 |
1.概述
定制数据集提供给客户更加自由灵活的操作方式,完全由用户自己定义数据集条件和选择数据来源,因此它也是现有数据集类型里面对于客户技术要求最高的。用户在使用 vividime Z-Suite 之前已经建立好自己的数据集系统,并和自己的数据系统深度绑定,因此不需要重新定义数据集机制。定制数据集正好满足此类用户的需求,可以将自有的数据集系统与 vividime Z-Suite 快速绑定。
在建立新的定制数据集的时候,提供g5.qry.GCustomQuery 类接口给用户,帮助他们通过 Java 编程的方式与自己原有数据集系统进行绑定。 通过继承 Query 的方式, vividime Z-Suite 可以返回用户自定义的数据集结果。另外当用户希望直接从数据库获取原始数据而不使用数据集功能的时候,定制数据集也可以帮助用户完成此类操作。
定制数据集具有联合数据集功能,可以将多张表单的数据集结果链接在一起,同时支持不同数据库类型。定制数据集在技术方面要求较高,需要用户自定义java 文件。
2.创建定制数据集
点击数据集页面左侧顶部的图标,进入新建数据集页面。点击定制数据集进入创建页面。
3.编辑定制数据集
在类名中填入所需的开发的定制查询完整类路径,例如com.yonghongtech.query.CustomQuery,然后刷新数据保存即可。
3.1 相关的类和接口
•g5.qry.GcustomQuery
开发定制查询首先需要继承这个类。然后需要实现以下方法。
1)public DataGrid exec(QCol[] qCols, QContext qContext)
该方式实现自己的逻辑,然后将数据存放到QGrid中并返回。
2)public QCol[] metaCols(QContext qContext)
创建QCol数组,存放所有字段。
3)public Query createRuntime(QContext qContext)
return this即可
4)public boolean isDynamic()
当字段个数不固定的时候需要override该方法,并返回true。
5)构造方法
当需要通过构造方法传一些参数时可以另外写一个构造方法,此时定制查询的“类名”中需要在类名后填写<参数>,多个参数则用逗号隔开,不许有空格。
➢例如:
com.yonghongtech.query.MongoZhiwenOffers<true,false>
•g5.DataGrid
用来储存数据,是一个接口,开发定制查询的时候一般用QGrid。
public void add(int c, Object obj)
使用add方法将数据储存到QGrid中,最终返回。
•g5.meta.QCol
表示查询的字段,QCol是一个接口,定制查询中可以使用g5.meta.BCol,
public BCol(String name, String view, byte dtype, boolean dim)
其构造方法的四个参数含义分别是:
name:字段名
view:别名
dtype:类型
dim:是否为维度
可根据实际需求选择正确的构造方法构造BCol。
3.2 样例代码
import g5.DataGrid;
import g5.common.meta.DType;
import g5.common.meta.QCol;
import g5.common.qry.QContext;
import g5.grid.impl.DynamicObjectSeg;
import g5.grid.impl.QGrid;
import g5.meta.BCol;
import g5.qry.GCustomQuery;
import g5.qry.Query;
import java.util.*;
// If the default dataset parameters exist in the customized dataset, you need to load the following classes.
import g5.meta.Parameter;
import g5.common.rep.AssetRef;
import g5.common.rep.info.LocalQueryFolder;
public class CQuery extends GCustomQuery {
// Predefined class parameters
private String param1;
private String param2;
// Customize default dataset parameters for datasets.
public Parameter[] findParams(Set<AssetRef> processed, LocalQueryFolder pro) {
Parameter setDataParam1 = new Parameter("setDataParam1", (byte) 2);
Parameter setDataParam2 = new Parameter("setDataParam2", (byte) 2);
return new Parameter[] { setDataParam1,setDataParam2 };
}
// Get class parameter values
public CQuery(String param1,String param2) {
this.param1 = param1;
this.param2 = param2;
}
@Override
public DataGrid exec(QCol[] qCols, QContext qContext) throws Exception {
// Get data set parameter values
String setDataP1 = (String) qContext.get("setDataParam1");
String setDataP2 = (String) qContext.get("setDataParam2");
QGrid qgrid = create(qContext);
Date nowDate = new Date();
// Insert the first row of data
qgrid.add(0, "yonghongtech");
qgrid.add(1, true);
qgrid.add(2, 1.1);
qgrid.add(3, 1.1);
qgrid.add(4, 0.00000000000000000001);
qgrid.add(5, "yonghongtech");
qgrid.add(6, (byte) 42);
qgrid.add(7, 1);
qgrid.add(8, 1);
qgrid.add(9, 1);
qgrid.add(10, nowDate);
qgrid.add(11, nowDate);
qgrid.add(12, nowDate);
qgrid.add(13, "yonghongtech");
// Use class parameters
qgrid.add(14, this.param1);
qgrid.add(15, this.param2);
// Insert the second row of data
qgrid.add(0, "yonghongtech");
qgrid.add(1, false);
qgrid.add(2, 1.2);
qgrid.add(3, 1.2);
qgrid.add(4, 0.00000000000000000002);
qgrid.add(5, "yonghongtech");
qgrid.add(6, (byte) 42);
qgrid.add(7, 2);
qgrid.add(8, 2);
qgrid.add(9, 2);
qgrid.add(10, null);
qgrid.add(11, null);
qgrid.add(12, null);
qgrid.add(13, "yonghongtech");
// Using dataset parameters
qgrid.add(14, setDataP1);
qgrid.add(15, setDataP2);
qgrid.complete();
return qgrid;
}
@Override
public QCol[] metaCols(QContext qContext) throws Exception {
return new QCol[] {
new BCol("string_data", DType.STRING, true),
new BCol("boolean_data", DType.BOOLEAN, true),
new BCol("float_data", DType.FLOAT, true),
new BCol("double_data", DType.DOUBLE, true),
new BCol("decimal_data", DType.DECIMAL, true),
new BCol("char_data", DType.CHAR, true),
new BCol("byte_data", DType.BYTE, true),
new BCol("short_data", DType.SHORT, true),
new BCol("integer_data", DType.INTEGER, true),
new BCol("long_data", DType.LONG, true),
new BCol("date_time_data", DType.DATE_TIME, true),
new BCol("date_data", DType.DATE, true),
new BCol("time_data", DType.TIME, true),
new BCol("character_data", DType.CHARACTER, true),
new BCol("param1", DType.CHARACTER, true),
new BCol("param2", DType.CHARACTER, true)
};
}
protected QGrid create(QContext context) {
QCol[] cols = new QCol[0];
try {
cols = metaCols(context);
} catch (Exception e) {
e.printStackTrace();
}
String[] harr = new String[cols.length];
byte[] sarr = new byte[cols.length];
for (int i = 0; i < cols.length; i++) {
harr[i] = cols[i].getView();
sarr[i] = DynamicObjectSeg.getPreferredSeg(cols[i].getDType(), false);
}
return (QGrid) QGrid.create(harr, sarr, cols, context);
}
@Override
public Query createRuntime(QContext qContext) {
return this;
}
}
其中create方法可以不做改动,只需要实现其他三个方法即可。
3.3部署测试
•部署
将程序编译成class文件,可以依赖开发工具进行编译,也可以通过命令行进行编译,由于脚本中引用了产品类所以在进行编译的时候需要依赖产品包进行编译。
➢示例:
将上述示例代码写入到CQuery.java文件中
在命令行中输入以下命令。
javac -classpath ./product.jar CQuery.java
文件也可以不放置在该目录下,只要能够正确引用产品包即可。
即可生成CQuery.class文件。
将CQuery.class放入C节点的classpath目录下,然后重启服务。配置热加载目录,也可以不用重启服务,参考热加载章节。
•测试
创建一个定制数据集后,填写正确的类名,该类名为加载定制数据集类文件名(同文件中的类名)。
刷新数据,预览数据均正常不报错即可。
3.4定制数据集使用参数说明
定制数据集中存在两个位置可以在脚本中引入参数。
•类参数
写在类中的参数,一般用于使用该类的不同定制数据集可以针对自身写一个固定值的方法。
在脚本中需要先声明参数,然后直接使用,如上述代码示例中的param1、param2。
•数据集参数
写在数据集中的参数,一般用于该参数需要通过报告或其他数据集获取而来的参数。
在脚本中需要先定义该数据集需要哪些数据集参数,然后从qContext中获取数据集中的值进行使用,如上述代码示例中的setDataParam1、setDataParam2。
3.5常见问题
•类名与文件名不匹配导致编译时报错
原因:由于类 CQuery 是公共的, 应在名为 CQuery.java 的文件中声明。比如类A被声明为公共的(public),那么必须将类A保存在名为A.java的文件中;
解决:需要将java文件名改为类名.java
•添加行数据时需要添加整行数据,如果没有值写为空,否则改行数据无法添加上去。
比如在qgrid.add添加时当某一行中的某个值为空时如果跳过了不执行,则该数据会导致错乱。
原因:由于一行数据不完整则没有被正常加载或引用下一行的数据拼接上来。
解决:按照示例代码中将没有值的数据替换为null添加。例如:qgrid.add(10, null);
•当脚本中存在中文或特殊字符时,可能由于编码问题导致脚本不可编译。
原因:编译时字符集问题。
解决:尽量不要使用特殊字符放置产品调用报错,或编译时添加字符集参数-encoding UTF-8
javac -encoding UTF-8 -cp product.jar CQuery.java
•特殊情况下存在classes文件夹不存在bi/WEB-INF下,导致类无法找到。
解决:可以通过修改tomcat/bin/setclasspath.bat中CLASSPATH的预定路径来修改引用位置。