CN107203640B - 通过数据库运行记录建立物理模型的方法及系统 - Google Patents
通过数据库运行记录建立物理模型的方法及系统 Download PDFInfo
- Publication number
- CN107203640B CN107203640B CN201710448752.8A CN201710448752A CN107203640B CN 107203640 B CN107203640 B CN 107203640B CN 201710448752 A CN201710448752 A CN 201710448752A CN 107203640 B CN107203640 B CN 107203640B
- Authority
- CN
- China
- Prior art keywords
- query
- database
- physical model
- map array
- statement
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2358—Change logging, detection, and notification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
- G06F16/288—Entity relationship models
Abstract
本发明公开了通过数据库运行记录建立物理模型的方法及系统,涉及物理模型建立领域。通过数据库运行记录建立物理模型的方法及系统,它包括:查询语句获取模块、查询主体提取模块、源表获取模块、关联信息获取模块和数组整合模块;并且包括以下步骤:获取查询语句;提取查询主体;获取源表;获取关联信息,并分别输出关联关系的map数组;得到单次解析的最终关联信息。本发明通过对查询语句的解析提取查询主体,获得关联关系,利用元数据建立了可靠的物理模型,能够在血缘分析中明确数据处理结果并能追溯来源。
Description
技术领域
本发明涉及物理模型建立领域,尤其是通过数据库运行记录建立物理模型的方法及系统。
背景技术
目前,数据库设计有较为规范的设计流程,即需求分析、概念结构设计、逻辑结构设计和物理结构设计。元建模技术应用于数据库设计后,改变了这种传统设计流程,新设计流程分为元建模、领域建模、生成器设计和物理数据库生成。数据库元建模和生成器设计由精通计算机的专业人员来完成,领域建模和物理数据库生成主要由领域专家负责。由于领域专家精通领域业务并熟知需求,所以,新设计流程可以省去传统设计流程中的需求分析环节。领域建模相当于传统设计流程中的概念结构设计,由于有了生成器,逻辑结构设计和物理结构设计可以自动完成。
在血缘分析中需要明确数据处理结果并能追溯来源,这些依赖于可靠的数据库物理模型,目前的大多数的解析物理模型需要在数据库系统中存在强关联的外键关系才能进行解析,而在真正的生产环境中,大多数的表关系都是逻辑关联,无法只通过元数据建立物理模型。
发明内容
本发明的目的在于克服现有技术的不足,提供通过数据库运行记录建立物理模型的方法及系统实现了,对查询语句的解析并获得关联关系,通过元数据建立模型。
本发明的目的是通过以下技术方案来实现的:通过数据库运行记录建立物理模型的方法,其特征在于,具体包括如下步骤:
S001获取查询语句:从数据库访问记录,以及从数据库日志获取查询语句;
S002提取查询主体:依据sql解析的步骤策略,避开干扰,从复杂的sql语句中提取中查询的主体语句;
S003获取源表:找到from后面的源表以及子查询中的涉及的表;
S004获取关联信息,并分别输出关联关系的map数组;
S005得到单次解析的最终关联信息。
进一步限定,所述的提取查询主体,具体包括如下子步骤:
S201去除不能直接反映表与表之间的弱关联关系;
S202去掉不能反映表与表之间的关系的无关从句;
S203去掉查询语句中的IN或NOT IN部分;
S204将查询语句中的union或union all拆散为多个语句;
S205将查询语句中where子句中的常值去掉。
进一步限定,所述的提取查询主体,可以同时对至少一个sql语句进行查询主体的提取。
进一步限定,所述的获取源表,通过SELECT FROM配对,解析每个SELECT FROM所在的层次,分层次进行解析并分别得到不同层次的表。
进一步限定,所述的获取源表,还包括将不同层次的表的集用数据结构进行再处理。
进一步限定,所述的获取关联信息,包括:
获取每个表的表字段关系,输出关联关系的第一map数组。
获取元数据信息里的强关联信息和主外键关系,输出关联关系的第二map数组。
进一步限定,所述的获取每个表的表字段关系是根据实际数据库来进行寻找。
进一步限定,所述的得到单次解析的最终关联信息具体包括:
S501将第一map数组、第二map数组进行踢重整合得到单次关联关系的map数组;
S502将通过多线程同步解析sql语句得到的map数组添加到上述map数组中得到最终的MAP数组;
S503解析该MAP数组,得到表的关联关系;
S504结合元数据,补全字段,得到最终的物理模型。
进一步限定,数据库运行需要的元数据信息与数据库访问记录;所述的数据库访问记录具体包括增、删、改和查这四种逻辑;解析这四种逻辑的步骤方法一致。
通过数据库运行记录建立物理模型的系统,其特征在于,它包括:查询语句获取模块、查询主体提取模块、源表获取模块、关联信息获取模块和数组整合模块;
所述的查询语句获取模块从数据库访问记录,以及从数据库日志获取查询语句;
所述的查询主体提取模块依据sql解析的步骤策略,避开干扰,从复杂的sql语句中提取中查询的主体语句;
所述的源表获取模块找到from后面的源表以及子查询中的涉及的表;
所述的关联信息获取模块获取关联信息,并分别输出关联关系的map数组;
所述的数组整合模块将第一map数组、第二map数组进行踢重整合得到单次关联关系的map数组,将通过多线程同步解析sql语句得到的map数组添加到上述map数组中得到最终的MAP数组
本发明的有益效果是:本发明通过对查询语句的解析提取查询主体,获得关联关系,利用元数据建立了可靠的物理模型,能够在血缘分析中明确数据处理结果并能追溯来源。
附图说明
图1为通过数据库运行记录建立物理模型的方法流程图;
图2为通过数据库运行记录建立物理模型的系统框架图。
具体实施方式
下面结合附图进一步详细描述本发明的技术方案,但本发明的保护范围不局限于以下所述。
在物理模型中最主要的参数是表,字段,以及表字段的关联关系。
数据库运行记录主要包括两方面的记录:
(1)数据库运行需要的元数据信息,具体包括:元数据信息包含了表信息,字段信息,主外键关系信息。
(2)数据库访问记录,具体包括:增(INSERT)、删(DELETE)、改(UPDATE)和查(SELECT)这些记录反映了业务逻辑关系。
解析增(INSERT)删(DELETE)改(UPDATE)查(SELECT)的逻辑基本一致,主要以解析访问的表和条件关系为主。
实施例1:对查(SELECT)语句进行解析;
如图1所示,具体的过数据库运行记录建立物理模型的方法包括:
S001获取查询语句:从数据库访问记录,以及从数据库日志获取查询语句。
S002提取查询主体:依据sql解析的步骤策略,从复杂的sql语句中提取中查询的主体语句,避开干扰,该步骤为该方法的核心,基于的是对SQL引擎解析原理的理解;
查询主体是类似如下结构:
SELECT COLUMN1,COLUMN2…FROM TABLE1,TABLE2,…TABLEN WHERE TABLE1.
COLUMN1=TABLE2.COLUMN2AND TABLE2.COLUMN2=TABLE3.COLUMN3…
优选的,COLUMN可以是具体的字段,也可以是一个半连接;
优选的,TABLE可以是某个具体的表,也可以是一段子查询结果;
S201去掉弱关联关系:>、>=、<、<=、between and,这些关系并不能直接反映表与表之间的关系,对提炼关系无直接用处,为了简明解析流程,直接去掉。
S202去掉与关系无关的从句:ORDER BY、LIMIT、GROUP BY、HAVING等,这些关系同样不能反映表与表之间的关系,更多的是逻辑处理,直接去掉。
S203去掉IN/NOT IN对查询主体的影响:这部分可能有价值,但是为了达到最好的解析,去掉此部分。
S204拆解union/union all为多个语句,union/union all实际上是多个查询结果的组合,每个组合对象有自己独立的业务逻辑。
S205去掉where子句中的常值:=某个具体的值,这种关系在解析关联关系时没有任何意义,并会对解析造成干扰,直接去掉。
S003获取源表:找到from后面的源表以及子查询中的涉及的表。
通过SELECT FROM配对,解析每个SELECT FROM所在的层次,分层次解析:
S301得到的层次一的表这其中并不包含子查询,具体为:
Customer、customer_address、customer_demographics、(select hd_demo_skfrom household demographics)、income_band、store_returns;
S302得到层次二的表,具体为:
household_demographics;
将上述的表的集通过如表1所示的数据结构处理,其中LEVEL代表层次,TABLE_ID唯一标识符,PARENT_ID代表继承的子查,TABLE_NAME表名,TABLE_TYPE表类型(源表1or子查询2);
表1
S004获取每个表的表字段关系,具体为:
S401由于每种数据库存储元数据的表都不同,此步骤是根据实际数据库来寻找。如表2所示,COLUMN_NAME列名,以mysql为例,表名来自information_schema.`TABLES`,字段名来自表information_schema.`COLUMNS`
表2
如表3所示,以等号为例找到where后面的所有关联条件以及子查询的所有关联条件。为避免重复解析,关联关系直接解析where后面的关联关系,顺序则是从左向右依次解析,并输出关联关系的第一map数组。
表3
S402获取元数据信息里的强关联信息,主外键关系,具体为:
如表4所示,COLUMN_NAME代表字段名称,REFRE_TABLE_NAME代表:关联表名称,REF_COLUMN_NAME代表关联表字段名称;由于每种数据库存储元数据的表都不同,根据实际数据库来寻找。以MYSQL为例,为innodb_sys_foreign_cols,假设我们找到customer的c_current_cdemo_sk和customer_demographics的cd_demo_sk存在强关联关系,输出关联关系的第二map数组。
TABLE_NAME | COLUMN_NAME | REFRE_TABLE_NAME | REF_COLUMN_NAME |
customer | c_current_cdemo_sk | customer_demographics | cd_demo_sk |
表4
S005集合上述的输出关联信息,进行踢重整合,得到单次解析的最终关联信息,通过多线程同步解析查询语句后,将解析得到的map关系添加到到上述map关系中,具体如表5所示。UPDATE,DELETE,INSERT与INSERT基本一致,旨在解析WHERE条件以及FROM的表。当所有的语句解析后,将得到一个最终的MAP数组,解析该MAP数组,可以得到相关表的关联关系。结合元数据,补全字段,可以得到最终的物理模型。
表5
如图2所示,通过数据库运行记录建立物理模型的系统,它包括:查询语句获取模块、查询主体提取模块、源表获取模块、关联信息获取模块和数组整合模块;
所述的查询语句获取模块从数据库访问记录,以及从数据库日志获取查询语句;
所述的查询主体提取模块依据sql解析的步骤策略,避开干扰,从复杂的sql语句中提取中查询的主体语句;
所述的源表获取模块找到from后面的源表以及子查询中的涉及的表;
所述的关联信息获取模块获取关联信息,并分别输出关联关系的map数组;
所述的数组整合模块将第一map数组、第二map数组进行踢重整合得到单次关联关系的map数组,将通过多线程同步解析sql语句得到的map数组添加到上述map数组中得到最终的MAP数组。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的方法、系统和模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本发明所揭露的方法、系统和模块,可以通过其它的方式实现。例如,以上所描述的实施例仅是示意性的,例如,所述模块的划分,可以仅仅是一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以说通过一些接口,系统或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述分立部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例的方案目的。
另外,在本发明各个实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、制度存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。
Claims (6)
1.通过数据库运行记录建立物理模型的方法,其特征在于,具体包括如下步骤:
S001获取查询语句:从数据库访问记录,以及从数据库日志获取查询语句;
S002提取查询主体:依据sql解析的步骤策略,避开干扰,从复杂的sql语句中提取中查询的主体语句;
S003获取源表:找到from后面的源表以及子查询中的涉及的表;
S004获取关联信息,并分别输出关联关系的map数组;
S005得到单次解析的最终关联信息;
所述的提取查询主体,具体包括如下子步骤:
S201去除不能直接反映表与表之间的弱关联关系;
S202去掉不能反映表与表之间的关系的无关从句;
S203去掉查询语句中的IN或NOT IN部分;
S204将查询语句中的union或union all拆散为多个语句;
S205将查询语句中where子句中的常值去掉;
所述的得到单次解析的最终关联信息具体包括:
S501将第一map数组、第二map数组进行剔重整合得到单次关联关系的map数组;
S502将通过多线程同步解析sql语句得到的map数组添加到上述map数组中得到最终的MAP数组;
S503解析该MAP数组,得到表的关联关系;
S504结合元数据,补全字段,得到最终的物理模型;
所述的获取关联信息,包括:
获取每个表的表字段关系,输出关联关系的第一map数组;
获取元数据信息里的强关联信息和主外键关系,输出关联关系的第二map数组;
所述的获取每个表的表字段关系是根据实际数据库来进行寻找。
2.根据权利要求1所述的通过数据库运行记录建立物理模型的方法,其特征在于:所述的提取查询主体,可以同时对至少一个sql语句进行查询主体的提取。
3.根据权利要求1所述的通过数据库运行记录建立物理模型的方法,其特征在于:所述的获取源表,通过SELECT FROM配对,解析每个SELECT FROM 所在的层次,分层次进行解析并分别得到不同层次的表。
4.根据权利要求3所述的通过数据库运行记录建立物理模型的方法,其特征在于:所述的获取源表,还包括将不同层次的表的集用数据结构进行再处理。
5.根据权利要求1所述的通过数据库运行记录建立物理模型的方法,数据库运行记录包括:数据库运行需要的元数据信息与数据库访问记录;所述的数据库访问记录具体包括增、删、改和查这四种逻辑;其特征在于:解析这四种逻辑的步骤方法一致。
6.根据权利要求1-5任意一项所述方法的通过数据库运行记录建立物理模型的系统,其特征在于,它包括:查询语句获取模块、查询主体提取模块、源表获取模块、关联信息获取模块和数组整合模块;
所述的查询语句获取模块从数据库访问记录,以及从数据库日志获取查询语句;
所述的查询主体提取模块依据sql解析的步骤策略,避开干扰,从复杂的sql语句中提取中查询的主体语句;
所述的源表获取模块找到from后面的源表以及子查询中的涉及的表;
所述的关联信息获取模块获取关联信息,并分别输出关联关系的map数组;
所述的数组整合模块将第一map数组、第二map数组进行剔重整合得到单次关联关系的map数组,将通过多线程同步解析sql语句得到的map数组添加到上述map数组中得到最终的MAP数组。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710448752.8A CN107203640B (zh) | 2017-06-14 | 2017-06-14 | 通过数据库运行记录建立物理模型的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710448752.8A CN107203640B (zh) | 2017-06-14 | 2017-06-14 | 通过数据库运行记录建立物理模型的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107203640A CN107203640A (zh) | 2017-09-26 |
CN107203640B true CN107203640B (zh) | 2019-12-31 |
Family
ID=59907292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710448752.8A Active CN107203640B (zh) | 2017-06-14 | 2017-06-14 | 通过数据库运行记录建立物理模型的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107203640B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108984698B (zh) * | 2018-07-05 | 2023-06-27 | 福建星瑞格软件有限公司 | 一种数据库业务行为的建模方法 |
CN108920664B (zh) * | 2018-07-05 | 2022-04-15 | 福建星瑞格软件有限公司 | 一种基于索引价值的数据库智能索引实现方法 |
EP3850559A4 (en) * | 2018-09-20 | 2021-11-10 | Huawei Technologies Co., Ltd. | SYSTEMS AND METHODS FOR GRAPH-BASED QUERY ANALYSIS |
CN111984667A (zh) * | 2019-05-24 | 2020-11-24 | 上海擎感智能科技有限公司 | 一种关系性数据库元数据导出方法及系统 |
CN110781520A (zh) * | 2019-10-30 | 2020-02-11 | 上海观安信息技术股份有限公司 | 一种敏感表群体发现方法及系统 |
CN110955662A (zh) * | 2019-11-29 | 2020-04-03 | 车智互联(北京)科技有限公司 | 一种维护数据表关联关系的方法、计算设备及存储介质 |
CN111078729B (zh) * | 2019-12-19 | 2023-04-28 | 医渡云(北京)技术有限公司 | 医疗数据溯源方法、装置、系统、存储介质以及电子设备 |
CN111813799B (zh) * | 2020-07-23 | 2024-01-19 | 德清云岫科技有限公司 | 数据库查询语句生成方法、装置、计算机设备和存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102402615A (zh) * | 2011-12-22 | 2012-04-04 | 哈尔滨工程大学 | 一种基于结构化查询语言语句的源信息追踪方法 |
CN103714062A (zh) * | 2012-09-28 | 2014-04-09 | 国际商业机器公司 | 基于依赖关系导入实体-联系模型数据的方法和系统 |
CN104216888A (zh) * | 2013-05-30 | 2014-12-17 | 中国电信股份有限公司 | 数据处理任务关系设置方法及系统 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102402522A (zh) * | 2010-09-09 | 2012-04-04 | 中国移动通信集团上海有限公司 | 数据查询系统及方法 |
GB201517732D0 (en) * | 2015-10-07 | 2015-11-18 | Ibm | Processing sql statement in alternating modes |
CN105912595B (zh) * | 2016-04-01 | 2019-03-05 | 华南理工大学 | 一种关系数据库的数据起源收集方法 |
-
2017
- 2017-06-14 CN CN201710448752.8A patent/CN107203640B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102402615A (zh) * | 2011-12-22 | 2012-04-04 | 哈尔滨工程大学 | 一种基于结构化查询语言语句的源信息追踪方法 |
CN103714062A (zh) * | 2012-09-28 | 2014-04-09 | 国际商业机器公司 | 基于依赖关系导入实体-联系模型数据的方法和系统 |
CN104216888A (zh) * | 2013-05-30 | 2014-12-17 | 中国电信股份有限公司 | 数据处理任务关系设置方法及系统 |
Non-Patent Citations (1)
Title |
---|
《SQL常用命令实例详解》;wolenski;《https://blog.csdn.net/wolenski/article/details/7980537》;20120914;第1-10页 * |
Also Published As
Publication number | Publication date |
---|---|
CN107203640A (zh) | 2017-09-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107203640B (zh) | 通过数据库运行记录建立物理模型的方法及系统 | |
CN110019218B (zh) | 数据存储与查询方法及设备 | |
CN106202207B (zh) | 一种基于HBase-ORM的索引及检索系统 | |
EP2912578B1 (en) | Systems and methods for intelligent parallel searching | |
US20230177078A1 (en) | Conversational Database Analysis | |
JP6964384B2 (ja) | 異種データソース混在環境におけるフィールド間の関係性の自動的発見のための方法、プログラム、および、システム | |
CN109508339B (zh) | 一种数据查询方法、装置、终端设备和存储介质 | |
CN104504001B (zh) | 面向海量分布式关系数据库的游标构造方法 | |
WO2017096892A1 (zh) | 索引构建方法、查询方法及对应装置、设备、计算机存储介质 | |
US10878000B2 (en) | Extracting graph topology from distributed databases | |
CN106326429A (zh) | 一种基于solr的Hbase秒级查询方案 | |
CN110019384B (zh) | 一种血缘数据的获取方法、提供血缘数据的方法及装置 | |
CN103970902A (zh) | 一种大量数据情况下的可靠即时检索方法及系统 | |
CN111221791A (zh) | 一种多源异构数据导入数据湖的方法 | |
WO2021259217A1 (zh) | 数据的关联查询方法、装置、设备及存储介质 | |
JP6159908B1 (ja) | 異種データソース混在環境におけるフィールド間の関係性の自動的発見のための方法、プログラム、および、システム | |
CN112434027A (zh) | 多维度数据的索引方法、装置、计算机设备和存储介质 | |
JPWO2017170459A6 (ja) | 異種データソース混在環境におけるフィールド間の関係性の自動的発見のための方法、プログラム、および、システム | |
CN113918605A (zh) | 数据查询方法、装置、设备以及计算机存储介质 | |
CN104408128A (zh) | 一种基于b+树异步更新索引的读优化方法 | |
EP3407206B1 (en) | Reconciled data storage system | |
CN107430633B (zh) | 用于数据存储的系统及方法和计算机可读介质 | |
CN111125216A (zh) | 数据导入Phoenix的方法及装置 | |
CN115658680A (zh) | 数据存储方法、数据查询方法和相关装置 | |
US11334571B2 (en) | Artificial intelligence-enabled search for a storage system |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |