当前位置:文档之家› 用友NC语义模型红皮书-2011-07

用友NC语义模型红皮书-2011-07

用友软件股份有限公司高级分析平台语义模型红皮书版本:V6.0.0.20100924目录一、前言 (3)1.概念 (3)2.定位 (3)二、结构 (3)1.应用模型 (3)2.语义模型 (4)a) 定义形态 (4)b) 执行流程 (6)c) 数据形态 (7)3.语义提供者 (7)a) 接口 (7)b) 扩展 (10)4.函数 (14)a) 函数解析 (14)b) 函数扩展 (14)5.参数 (17)a) 参数定义 (17)b) 参数引用 (17)c) 参数设置 (18)6.宏变量 (19)7.描述器 (20)8.数据加工 (22)9.物化策略 (24)10.复合语义模型 (25)11.语义上下文 (29)三、语义模型的管理 (32)1.对象管理 (32)2.环境配置 (35)四、功能扩展 (36)1.扩展语义提供者 (37)2.扩展业务函数 (37)3.使用数据加工 (37)4.自定义执行策略 (37)五、附录 (38)1.入门 (38)2.语义模型API (43)3.语义函数 (45)4.其他函数 (45)5.脚本引擎 (47)6.针对查询引擎的改进 (47)一、前言1.概念SMART,即Semantic Modeling for Analysis Report Toolkit, 分析报表语义建模工具。

2.定位二、结构1.应用模型上图为语义模型应用结构图。

语义模型通过语义提供者,可以将多个数据源的数据进行整合。

2.语义模型a)定义形态下图展示了语义模型的内部结构,a)元数据元数据是指描述数据的数据,是为了外界使用数据而对数据本身含义的阐述。

拿我们最常见的二维数据(行列结构)举例来说,如果只有这些行列结构的数据,对我们来说这将毫无意义。

因为我们无法知道哪一列的数据代表什么含义,无法知道如何操作这些数据,更别提由这些数据分析出有用的信息。

反过来,如果针对这些数据指定了元数据,我们就可以了解哪一列代表的业务含义,并且知道该列的数据类型、长度、精度等。

这样,我们就能对这些数据进行加工处理,分析提取出有价值的信息。

同理,语义模型的元数据是对执行语义模型后获取的二维数据的描述。

元数据针对结果数据的每一列都提供了下列信息:数据类型、字段显示名、字段名、备注、长度、精度等。

有了这些信息,我们就能知道在业务应用中该如何使用语义模型。

b)语义提供者语义提供者,表述了一类取数方式,或者说如何提供数据的方式。

在语义模型中,语义提供者负责把一类业务取数过程以语义脚本的形式描述出来。

为了能更好的理解这个概念,我们可以打这样一个比方:NC元数据、数据仓库、报表数据、总账数据等这些可提供数据的对象好比“数据水源”,而语义提供者好比“水泵”,语义模型好比“抽水机”。

每种“数据水源”只支持特定的“水泵”来抽取数据。

我们有了一种语义提供者“水泵”,就能抽取其对应的“数据水源”里的数据。

语义模型中能指定多个语义提供者,就相当于“抽水机”挂接了多个“水泵”,我们就能从多个不同类型的“数据水源”来抽取数据。

语义提供者负责抽取数据,同时对外提供元数据来描述这些数据。

语义提供者的元数据一般是在语义模型内部使用。

更多细节以及语义提供者的扩展说明参见章节《语义提供者》。

c)描述器描述器是指对数据操作的描述,例如:过滤、排序、分页、汇总等。

在语义模型中,描述器表述了对语义提供者抽取的数据的加工处理过程。

更多细节参见章节《描述器》。

d)首选项语义模型中的首选项包括三类数据:参数、宏变量、配置项。

下面将分别介绍:i.参数参数是模型中代表动态信息的元素,用于响应用户的输入。

参数给用户提供了控制模型执行过程的机会。

更多细节参见章节《参数》。

ii.宏变量宏变量与参数类似,区别是,参数在模型执行时需要用户输入值;而宏变量不需要与用户交互,系统后台会根据上下文计算该值。

更多细节参见章节《宏变量》。

iii.配置项配置项用于控制语义模型的执行方式。

b)执行流程语义模型的执行流程如下图所示:语义提供者:NC元数据QDI元数据业务数据语义模型...语义函数:nc_metadata()smart()report()parameter()macro()...语义模型执行过程可分为以下步骤:第一步:语义模型脚本化语义模型中的对象结构将转变为字符串形式的语义脚本。

第二步:脚本对象化通过脚本引擎把语义脚本解析为脚本模型,即把字符串形式的脚本对象化。

第三步:脚本模型翻译为SQL基于脚本模型,处理其中的语义函数,把脚本模型翻译为标准SQL语句。

运行态描述器会在这一步被处理。

第四步:执行sql,把结果集封装为DataSet,返回DataSet。

由于运行态描述器的存在,每次执行语义模型时获取的最终sql都是不同的,但是,语义模型本身对应的脚本模型是相同的。

基于性能考虑,我们可以把语义模型对应的脚本模型缓存起来。

这样一来,只有第一次执行语义模型时,我们需要完整执行上述四个步骤,接下来的每次执行,我们只需取得该缓存的脚本模型,再做第三、四步的处理即可。

c)数据形态语义模型提供的数据可以以两种形态存在:数据集DataSet、数据表DbTable。

从数据流转的角度来说,语义模型代表了一种取数管道,数据可以从管道中抽取出来。

数据集DataSet 代表了内存中的数据,或者说,数据在内存中以数据集DataSet为载体。

数据表DbTable代表了数据库中的数据,或者说,数据在数据库中以数据表DbTable为载体。

语义模型、数据如果把数据集中的当前数据持久化到数据库中,数据就以数据表的形式存在;把数据从数据库中加载到内存中,就完成了数据表到数据集的转换;数据表可以以语义提供者的形式构成语义模型,完成数据从数据表到语义模型的流转;并且,语义模型经由视图化执行,最终的结果集将以数据表的形式呈现。

数据在不同形态间流转时,改变的是数据载体,不变的数据本身的结构,即元数据。

3.语义提供者语义提供者,表述了一类取数方式,或者说如何提供数据的方式。

在语义模型中,语义提供者负责把一类业务取数过程以语义脚本的形式描述出来。

a)接口语义提供者包括NC元数据、DW元数据、以及语义脚本和业务代码扩展提供者。

提供总帐、HR、供应链、报表等业务数据扩展。

其整个体系结构可由下图表示:SQL 的应以提供二维其中,Provider 是语义提供者的接口;SemanticProvider 是基础扩展抽象类,对能把取数过程以脚本形式描述的语义提供者可继承此类;SemanticDataProvider 是语义数据扩展抽象类,对不能以脚本形式描述取数过程,只能提供二维数据的提供者,可继承此类。

SemanticSqlProvider 适用于提供者在运行时根据执行环境context 返回不同取数sql 与SqlProvider 的区别在于:SqlProvider 的sql 结构在定义态已经确定;SemanticSqlProvider 是在运行时,经过一系列业务处理,返回最终取数sql.上述图中,蓝色代表具体实现类。

通过以上的介绍我们可以得知,Provider 定义了语义提供者的接口规范,SemanticProvider 、SemanticDataProvider 、SemanticSqlProvider 则是我们具体实现提供者时要继承的抽象类。

现对这四个类的主要接口做重点介绍。

Provider●SemanticProvider●SemanticDataProviderSemanticSqlProviderb)扩展前面介绍了语义提供者的整个体系结构,现在我们拿一个具体例子来讲解如何实现一个语义提供者。

我们以比较简单的“数据表”这类取数方式来做示例。

扩展语义提供者可分为以下三步:i.实现语义提供者类由前文介绍,我们知道实现一个提供者有三种方式:1.继承SemanticProvider:能把取数过程以脚本形式描述的语义提供者可继承此类我们现以数据表提供者为例来讲解如何以此种方式实现语义提供者。

数据表提供者对应的实现类为:DbTableProvider,该类继承于SemanticProvider,实现了接口provideMetaData(SmartContext context) ,provideScript(SmartContext context)。

数据表提供者,是把NC元数据底层数据模型中的一张表作为操作对象,从中抽取数据。

其在语义模型中的操作是这样的:在上级“模块”目录上选中模块“平台”,展开后在子节点上选中“sm_user”这张表。

在数据表提供者DbTableProvider中,我们只需要存储一条信息:表名。

这些信息可以看做取数过程的业务描述,接下来我们做的就是把这些业务描述转换为以语义模型中的概念来进行描述。

实现provideMetaData(SmartContext context)接口:有了表名信息,我们就可以把其列信息拿到,列Column解析为字段Field,每列对应一个字段,多个列对应的多个字段就组合为元数据MetaData。

实现provideScript(SmartContext context)接口:数据表提供者比较简单,直接返回表名即可。

到此,我们的数据表语义提供者类就实现完毕。

2.继承SemanticDataProvider:不能以脚本形式描述取数过程,只能提供二维数据的提供者,可继承此类例如,供应链中有些查询并不能直接通过一条sql就能查出,中间可能经过一系列复杂的代码运算逻辑来构造这个结果数据,这时我们就可以继承SemanticDataProvider来实现语义提供者。

继承此类只需要实现provideData(SmartContext context)接口:在该方法中,我们编写运算逻辑,构造最终的结果数据DataSet,返回之即可。

在此我们有必要介绍下DataSet的结构。

DataSet主要包含两部分:元数据MetaData,数据容器Object[][](即二维数组)。

Object[][]即是最终的结果数据,MetaData是对数据的描述信息,包含对应字段信息:字段名、数据类型、数据精度等。

3.继承SemanticSqlProvider:应用方式与SemanticDataProvider类似,不同在于,SemanticDataProvider最终返回二维数据,而SemanticSqlProvider返回sql语句。

ii.实现语义提供者设计向导类有了语义提供者类,我们还需要一个设计器来设计语义提供者。

每个设计器都需要实现接口IProviderDesignWizard。

该接口只有一个方法:/***@param parent父窗口。

为ProviderStepPanel,藉此可获得SmartModelWizardShareObject(向导模型,包含向导共享数据)*@param provider待修改的语义提供者*@param context上下文*@return设计完成后的语义提供者*/public Provider design(Container parent,Provider provider, SmartContext context);当设计语义提供者时,会调用此方法,调用完成返回提供者实例。

相关主题