CN113360362B - 一种动态sql效率检查方法及插件 - Google Patents

一种动态sql效率检查方法及插件 Download PDF

Info

Publication number
CN113360362B
CN113360362B CN202010138355.2A CN202010138355A CN113360362B CN 113360362 B CN113360362 B CN 113360362B CN 202010138355 A CN202010138355 A CN 202010138355A CN 113360362 B CN113360362 B CN 113360362B
Authority
CN
China
Prior art keywords
sql
dynamic
dynamic sql
memory
parameters
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
Application number
CN202010138355.2A
Other languages
English (en)
Other versions
CN113360362A (zh
Inventor
王书兴
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Wodong Tianjun Information Technology Co Ltd
Original Assignee
Beijing Wodong Tianjun Information Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beijing Wodong Tianjun Information Technology Co Ltd filed Critical Beijing Wodong Tianjun Information Technology Co Ltd
Priority to CN202010138355.2A priority Critical patent/CN113360362B/zh
Publication of CN113360362A publication Critical patent/CN113360362A/zh
Application granted granted Critical
Publication of CN113360362B publication Critical patent/CN113360362B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3676Test management for coverage analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种动态sql效率检查方法及插件,其方法包括:扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警。采用本发明能够随数据更新频率定时进行事实数据查询效率监测,提前预警可能存在性能瓶颈的sql场景。

Description

一种动态sql效率检查方法及插件
技术领域
本发明涉及网络技术,特别涉及一种动态sql效率检查方法及插件。
背景技术
随着大数据的发展和普及,越来越多的业务场景中使用到大数据的即席查询场景,让用户享受大数据产品带来的便利。
目前在数据产品的应用下,提前检验sql执行效率的方式主要是通过测试人员在功能测试和压力测试的场景下通过调用接口的方式检测接口的执行效率和吞吐量,测试工程师根据功能设计测试用例,通过参数集合去进行接口的覆盖测试。
普通的覆盖性测试或者慢sql检测工具都是通过在测试过程中通过测试用例控制入参的形式覆盖动态sql执行的分支,这样的情况很难将所有可能涉及到的sql场景覆盖全面,容易产生覆盖不全、不准,或者过度覆盖;另一方面,在大数据应用场景中,存在大批量数据定时同步的情况,数据会动态变化,普通的测试脚本无法根据实际数据情况动态调整以进行慢sql的检测定位,也具有滞后性。
发明内容
本发明的目的在于提供一种动态sql效率检查方法及插件,能够随数据更新频率定时或不定时进行事实数据查询效率监测,提前预警可能存在性能瓶颈的sql场景。
为实现上述发明目的,本发明提供了一种动态sql效率检查方法,该方法包括:
扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;
对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警。
为实现上述发明目的,本发明还提供了一种动态sql效率检查插件,该插件嵌于数据应用中,该插件包括:
收集模块,扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;
定时校验模块,定时针对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警。
综上所述,本发明实施例通过一个简单的插件,内置在类大数据场景的数据应用中,由于数据应用存在数据量大,查询场景多样,数据批量更新的特点,本插件随应用启动,自动扫描收集全量可能会执行到的sql集合到内存队列,随数据更新频率定时或不定时进行事实数据查询效率监测,提前预警可能存在性能瓶颈的sql场景,提升大数据应用的可用性及效率,避免在测试环节的用例覆盖度不准。
附图说明
图1为本发明实施例动态sql效率检查方法的流程示意图。
图2为本发明实施例动态sql效率检查插件的结构示意图。
图3为本发明具体实施例对动态sql配置文件进行解析的有向图结构示意图。
图4为本发明实施例一种电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明所述方案作进一步地详细说明。
本发明实施例公开了一种动态sql效率检查方法,包括以下步骤,流程示意图如图1所示。
步骤11、扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;
其中,屏蔽掉入参,就是把sql里的具体业务参数都剔除掉,形成一个sql模板,即,把参数空出来,用以自动化的填充其他参数。
本发明中,一般优选地,在数据应用启动后,扫描各个动态sql配置文件。
步骤12、对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警。
其中,所述获取评测效率瓶颈的参数包括:
解析出表名和包含的各字段名,根据表名和包含的各字段名在数据库统计在该表名下具有相同字段值组合的记录数,将记录数最多的字段值组合作为评测效率瓶颈的参数。
优选地,该方法进一步包括:
针对每个动态sql,对每次采集的执行时长进行保存,经过预定时间段的累计保存后,计算得到相应动态sql的执行时长动态阈值;
在再次采集到相应动态sql的执行时长时,判断是否超过相应动态sql的执行时长动态阈值,如果是,则进行预警。
基于同样的发明构思,本发明实施例还提出了一种动态sql效率检查插件,该插件嵌于数据应用中,如图2所示。数据应用启动后,插件可配合调度任务根据目前数据表的情况自动分析确定哪些sql的执行效率超出响应阈值并报警。该插件包括:
收集模块201,扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;
其中,优选地,所述收集模块201在数据应用启动后,扫描各个动态sql配置文件。
定时校验模块202,定时针对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警。
其中,所述定时校验模块202获取评测效率瓶颈的参数,具体用于:
解析出表名和包含的各字段名,根据表名和包含的各字段名在数据库统计在该表名下具有相同字段值组合的记录数,将记录数最多的字段值组合作为评测效率瓶颈的参数。
优选地,该插件进一步包括:
动态阈值获取模块203,针对每个动态sql,对每次采集的执行时长进行保存,经过预定时间段的累计保存后,计算得到相应动态sql的执行时长动态阈值;
所述定时校验模块202,还用于在再次采集到相应动态sql的执行时长时,判断是否超过相应动态sql的执行时长动态阈值,如果是,则进行预警。
上述实施例的模块可以集成于一体,也可以分离部署;可以合并为一个模块,也可以进一步拆分成多个子模块。
另外,本申请实施例中还提供一种电子设备,结构示意图如图3所示,包括存储器301、处理器302及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述序列数据的目标定位方法的步骤。
此外,本申请实施例中还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现所述序列数据的目标定位方法的步骤。
为清楚说明本发明,下面列举具体场景进行说明。
需要说明的是,现有技术中数据应用正常执行的情况下动态sql都是根据实际接口调用时,根据传值对象中的一些实际入参的判断条件拼装出一条可执行的sql,本发明的插件方式是直接屏蔽掉入参,这样就可以形成全量sql模板。
一、收集模块201,在数据应用启动后,即可自动扫描开发人员开发的动态sql配置文件,无需校验的动态sql可以通过配置进行exclude,如mybatis的xml。屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,即,全部可能的sql模板;将各全量sql模板形成全量sql模板集合一次性写入内存,供后续定时校验调用。
以mybatis的一个动态sql举例如下,表1为本发明实施例一个动态sql配置文件。
表1
解析上述的动态sql配置文件为图4有向图结构,根据图4的指示,最终形成一个全量的sql模板如表2所示:
表2
由于本发明中屏蔽掉入参,所以解析完形成的全量sql模板包括多个sql。本发明实施例中该全量sql模板包括8个sql。由于可能扫描到多个动态sql配置文件,所以会得到多个全量sql模板,将多个全量sql模板形成全量sql模板集合一次性写入内存。
二、此后随着数据的批量变化,调度任务可以定时触发定时校验模块202,为了更精准的校验出每个sql的性能瓶颈在哪个场景下,本发明针对每一个sql解析出当前校验的表名,条件里的字段名,选取当前条件涉及的字段组合值最多的一两组作为入参,执行预定sql模板,采集其执行时长。如果某个执行时长超出了初始化设置的阈值,则进行预警。
举例来说,针对表2,
情况一、定时针对内存中的第一个sql“select*fromUseru”,解析出表名为“u”;
将sql“select*from Useru”向数据库执行,采集执行时长为t1。
情况二、定时针对内存中的第二个sql“select*fromUseruwhere u.username=?”解析出表名为“u”,字段名为“username”;
在数据库统计具有相同表名“u”,以及相同字段值的记录数,将记录数最多的字段值作为评测效率瓶颈的参数,例如,表名为“u”,字段值为“xiaowang”的记录数最多,则将“xiaowang”作为评测效率瓶颈的参数;
将字段值“xiaowang”赋值给内存中的sql“select*fromUseruwhere u.username=?”变为“select*from Useru where u.username=xiaowang”;
将sql“select*from Useru where u.username=xiaowang”向数据库执行,采集执行时长为t2。
同理,针对第三个sql“select*from Useru where u.sex=?”,以及第四个sql“select*from Useru where u.birthday=?”,分别采集到执行时长t3和t4。
情况三、定时针对内存中的第八个sql“select*from Useru where u.username=?and u.sex=?andu.birthday=?”解析出表名为“u”,字段名为“username”、“sex”和“birthday”的组合;
在数据库统计具有相同表名“u”,以及相同字段值组合的记录数,将记录数最多的字段值组合作为评测效率瓶颈的参数,例如,表名为“u”,字段值为“xiaowang”、“man”以及“2001.12.12”的记录数最多,则将“xiaowang”、“man”以及“2001.12.12”这一字段值组合作为评测效率瓶颈的参数;
将字段值组合“xiaowang”、“man”以及“2001.12.12”赋值给内存中的sql“select*from Useru where u.username=?and u.sex=?and u.birthday=?”,变为“select*fromUseru where u.username=xiaowang andu.sex=man and u.birthday=2001.12.12”;
将sql“select*from User u where u.username=xiaowang and u.sex=manand u.birthday=2001.12.12”向数据库执行,采集执行时长为t8。
同理,针对第五个sql“select*from Useru where u.username=?and u.sex=?”,第六个sql“select*from Useru where u.username=?andu.birthday=?”,第七个sql“select*from Useru where u.sex=?and u.birthday=?”,分别采集到执行时长t5、t6和t7。
综上,针对表2,对表名、评测效率瓶颈的参数以及相应执行时长进行记录如表3所示。
表3
对于t1-t8,可以为每个sql的执行时长设置相应阈值,在超出阈值时进行预警。
三、本发明中预警的阈值可以是初始化设置的阈值,也可以获取动态阈值。即,通过采用动态阈值获取模块203,经过应用运行一段时间,针对每个动态sql,采集到表、条件组合及执行时长的三维数据集合,通过简单的线性分析方式统计出该sql对应的比较稳定的执行时长,作为不同sql的动态阈值,如果某次超出阈值范围,则进行预警提示。例如,针对表2中第二个sql,调度任务每天触发定时校验模块202,在一个星期内,每天采集到执行时长第一t2,第二t2,第三t2,…,第七t2,针对这些执行时长,通过简单的线性分析方式统计出该sql对应的比较稳定的执行时长,作为第二个sql的动态阈值。
综上,本发明通过屏蔽掉入参解析动态sql片段,通过计算图的路径方式收集全量可能拼装成的sql模板集合,一次性持久到内存队列,供后续不定时调度校验;通过定时校验,比较精准的确定造成sql执行效率瓶颈场景;通过一个阶段收集校验记录,动态预测sql的预警阈值。
因此,本发明技术方案带来的有益效果:
1.本发明通过扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,如此,可以一次性自动化的扫描并收集出大数据应用中可能涉及到会执行的sql情况,避免了在功能测试中用例数据覆盖不全不准的场景;
2.根据所有的sql场景精准的定位到可能会造成每个sql执行效率瓶颈的参数值,并计算执行时长,超时预警,确保开发人员能够提前确定线上可能存在性能瓶颈的场景。
3.通过计算得到相应动态sql的执行时长动态阈值,在动态sql的执行时长超过动态阈值时进行预警,由于动态阈值是实时计算得到,所以可以进行准确地预警。
4.本发明将记录数最多的字段值组合作为评测效率瓶颈的参数。一般来讲,数据表中某个字段按照字段值去重之后的记录数越多,在按照这个字段进行查询聚合过滤等操作时耗费的计算资源和时长会越多,越会在这个场景下产生执行效率不高的慢sql,所以按照这个字段取值的执行时长作为参考标准,如果执行时长超过此次执行的时长,可以触发定时校验模块,提示慢sql或对数据进行优化。
5.能在数据应用启动后,通过扫描sql配置文件,收集并解析出所有可能执行的sql语句,为下一步提前执行校验发现哪些情况是慢sql提供支持。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (8)

1.一种动态sql效率检查方法,其特征在于,该方法包括:
扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;
对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警;
所述获取评测效率瓶颈的参数包括:
解析出表名和包含的各字段名,根据表名和包含的各字段名在数据库统计在该表名下具有相同字段值组合的记录数,将记录数最多的字段值组合作为评测效率瓶颈的参数。
2.如权利要求1所述的方法,其特征在于,该方法进一步包括:
针对每个动态sql,对每次采集的执行时长进行保存,经过预定时间段的累计保存后,计算得到相应动态sql的执行时长动态阈值;
在再次采集到相应动态sql的执行时长时,判断是否超过相应动态sql的执行时长动态阈值,如果是,则进行预警。
3.如权利要求1所述的方法,其特征在于,在数据应用启动后,扫描各个动态sql配置文件。
4.一种动态sql效率检查装置,其特征在于,该装置包括:
收集模块,扫描各个动态sql配置文件,屏蔽掉入参对各动态sql配置文件进行解析,形成各个全量sql模板,将各全量sql模板形成全量sql模板集合写入内存;
定时校验模块,定时针对内存中的每个动态sql,获取评测效率瓶颈的参数,并赋值给内存中的相应动态sql;将赋值后的动态sql向数据库执行,采集执行时长,如果所述执行时长超出阈值,则进行预警;
所述定时校验模块获取评测效率瓶颈的参数,具体用于:
解析出表名和包含的各字段名,根据表名和包含的各字段名在数据库统计在该表名下具有相同字段值组合的记录数,将记录数最多的字段值组合作为评测效率瓶颈的参数。
5.如权利要求4所述的装置,其特征在于,该装置进一步包括:
动态阈值获取模块,针对每个动态sql,对每次采集的执行时长进行保存,经过预定时间段的累计保存后,计算得到相应动态sql的执行时长动态阈值;
所述定时校验模块,还用于在再次采集到相应动态sql的执行时长时,判断是否超过相应动态sql的执行时长动态阈值,如果是,则进行预警。
6.如权利要求4所述的装置,其特征在于,所述收集模块在数据应用启动后,扫描各个动态sql配置文件。
7.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1~3任一项所述的方法。
8.一种计算机可读介质,其上存储有计算机程序,其中,所述程序被处理器执行时实现如权利要求1~3中任一项所述的方法。
CN202010138355.2A 2020-03-03 2020-03-03 一种动态sql效率检查方法及插件 Active CN113360362B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010138355.2A CN113360362B (zh) 2020-03-03 2020-03-03 一种动态sql效率检查方法及插件

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010138355.2A CN113360362B (zh) 2020-03-03 2020-03-03 一种动态sql效率检查方法及插件

Publications (2)

Publication Number Publication Date
CN113360362A CN113360362A (zh) 2021-09-07
CN113360362B true CN113360362B (zh) 2024-06-18

Family

ID=77523300

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010138355.2A Active CN113360362B (zh) 2020-03-03 2020-03-03 一种动态sql效率检查方法及插件

Country Status (1)

Country Link
CN (1) CN113360362B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103810196A (zh) * 2012-11-09 2014-05-21 阿里巴巴集团控股有限公司 基于业务模型进行数据库性能测试的方法
CN105138326A (zh) * 2015-08-11 2015-12-09 北京思特奇信息技术股份有限公司 一种基于ibatis实现sql动态配置的方法及***

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2017049254A1 (en) * 2015-09-18 2017-03-23 Prevoty, Inc. Systems and methods for sql type and/or value evaluation to detect evaluation flaws
CN105760286B (zh) * 2016-02-17 2018-09-07 中国工商银行股份有限公司 应用数据库动态性能检测方法及检测装置
CN105808413A (zh) * 2016-03-02 2016-07-27 上海新炬网络信息技术有限公司 基于业务流程可视化的sql性能监控方法
CN106445795B (zh) * 2016-09-26 2019-03-22 中国工商银行股份有限公司 一种数据库sql效率检测方法及装置
CN110399377A (zh) * 2019-08-30 2019-11-01 北京东软望海科技有限公司 Sql的优化方法、装置、电子设备及计算机可读存储介质

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103810196A (zh) * 2012-11-09 2014-05-21 阿里巴巴集团控股有限公司 基于业务模型进行数据库性能测试的方法
CN105138326A (zh) * 2015-08-11 2015-12-09 北京思特奇信息技术股份有限公司 一种基于ibatis实现sql动态配置的方法及***

Also Published As

Publication number Publication date
CN113360362A (zh) 2021-09-07

Similar Documents

Publication Publication Date Title
CN109388566B (zh) 一种代码覆盖率分析方法、装置、设备及存储介质
US9251046B2 (en) Method and system for generating and processing black box test cases
CN110287109B (zh) 协议接口的测试方法、装置、计算机设备及其存储介质
CN111400186B (zh) 性能测试方法及***
CN106874187B (zh) 代码覆盖率收集方法和装置
US8140911B2 (en) Dynamic software tracing
CN108536598B (zh) 一种技能逻辑测试方法、装置、测试终端及存储介质
CN108459954B (zh) 应用程序漏洞检测方法和装置
CN102722436A (zh) 一种增量覆盖信息的统计方法和装置
CN107220121B (zh) 一种numa架构下沙箱环境测试方法及其***
CN109857631A (zh) 基于人工智能的代码覆盖率统计方法、装置、设备及存储介质
CN111190807A (zh) 一种埋点测试方法及设备
CN112328499A (zh) 一种测试数据生成方法、装置、设备及介质
CN110716866A (zh) 代码质量扫描方法、装置、计算机设备及存储介质
CN112559538A (zh) 关联关系生成方法、装置、计算机设备和存储介质
CN112257032A (zh) 一种确定app责任主体的方法及***
CN112965912B (zh) 接口测试用例生成方法、装置和电子设备
CN111913937B (zh) 数据库运维方法和装置
CN113360362B (zh) 一种动态sql效率检查方法及插件
CN112084108A (zh) 一种测试脚本生成方法、装置及相关组件
CN117493188A (zh) 接口测试方法及装置、电子设备及存储介质
CN104317820B (zh) 报表的统计方法和装置
CN113688134B (zh) 基于多维数据的可视化变量管理方法、***及设备
CN115757174A (zh) 一种数据库的差异检测方法及装置
CN115576831A (zh) 一种测试案例推荐方法、装置、设备及存储介质

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