一種查詢語(yǔ)句解析與再處理的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)庫(kù)查詢領(lǐng)域,具體而言,涉及一種查詢語(yǔ)句解析與再處理的方法和裝置。
【背景技術(shù)】
[0002]目前市面上各個(gè)大型web (網(wǎng)絡(luò))系統(tǒng)、大型信息化管理系統(tǒng)都普遍存在大型數(shù)據(jù)庫(kù)查詢的需求,過(guò)去在進(jìn)行數(shù)據(jù)庫(kù)查詢時(shí)通常都是寫(xiě)死在各個(gè)功能模塊中。但隨著軟件技術(shù)的發(fā)展,越來(lái)越多的軟件系統(tǒng)都嘗試采用平臺(tái)式開(kāi)發(fā),以期降低整體研發(fā)成本與研發(fā)周期。在這樣一個(gè)整體背景下,各種通用查詢方案孕育而生。在所有通用查詢方案中幾乎都無(wú)法繞過(guò)一個(gè)重要的技術(shù)課題,那就是對(duì)查詢語(yǔ)句的解析,從而實(shí)現(xiàn)對(duì)查詢語(yǔ)句的分頁(yè)、排序、分組功能的處理等等。
[0003]在這樣一個(gè)背景下,各大軟件廠商都提出了各自不同的對(duì)查詢語(yǔ)句的解析與處理的方案與設(shè)計(jì),但這些方案與設(shè)計(jì)普遍存在兩個(gè)方面的問(wèn)題:
[0004]I)過(guò)程過(guò)于復(fù)雜與龐大。大多數(shù)方案都嘗試對(duì)查詢語(yǔ)句的完全解析,而由于查詢語(yǔ)句自身的復(fù)雜與多變,完全解析需要考慮的情況實(shí)在太多,使得這些解決方案陷入了無(wú)法窮解的尷尬境地。查詢語(yǔ)句的解析與處理真的需要對(duì)原有查詢語(yǔ)句進(jìn)行完全解析嗎?處理過(guò)程過(guò)于復(fù)雜必然造成設(shè)計(jì)成本的增加、出錯(cuò)風(fēng)險(xiǎn)的加大與維護(hù)難度的激增。如果客戶需求并不需要這種完全的解析就可以解決問(wèn)題,那么這樣的設(shè)計(jì)必然造成一種浪費(fèi)。因此本方法本著務(wù)實(shí)與精煉的思想,另辟蹊徑提出了新的設(shè)計(jì)思路。
[0005]2)處理過(guò)于簡(jiǎn)單而未考慮性能。許多諸如分頁(yè)、排序、分組等方案,采用了一些過(guò)于簡(jiǎn)單、易于實(shí)現(xiàn)的方式。但這些方式在進(jìn)行數(shù)據(jù)查詢往往會(huì)出現(xiàn)效率低下的問(wèn)題,特別在面對(duì)超大數(shù)據(jù)庫(kù)的狀況下。因此本方法在許多地方的設(shè)計(jì)更加著眼于在面對(duì)超大數(shù)據(jù)庫(kù)的性能問(wèn)題,并在實(shí)際應(yīng)用中獲得了較好的效果。
[0006]3)未著眼于開(kāi)發(fā)人員的使用。這里對(duì)查詢語(yǔ)句的解析與處理,其目的就是要為開(kāi)發(fā)人員提供通用的開(kāi)發(fā)平臺(tái),提供通用的查詢功能。因此,該功能針對(duì)的客戶群是開(kāi)發(fā)人員,在設(shè)計(jì)上應(yīng)當(dāng)更多地考慮開(kāi)發(fā)人員使用的便捷、易用與靈活。因此本方法充分考慮了這些方面的問(wèn)題,并在實(shí)際項(xiàng)目中得到了廣泛的應(yīng)用。
【發(fā)明內(nèi)容】
[0007]本發(fā)明提供一種查詢語(yǔ)句解析與再處理的方法和裝置,通過(guò)對(duì)查詢語(yǔ)句的處理,一方面可以方便開(kāi)發(fā)人員以更加靈活便捷地方式設(shè)計(jì)查詢功能,另一方面為原始的查詢語(yǔ)句提供了高效分頁(yè)查詢、動(dòng)態(tài)排序與分組等功能,為大型管理系統(tǒng)設(shè)計(jì)通用查詢平臺(tái)創(chuàng)造了條件。
[0008]為達(dá)到上述目的,本發(fā)明提供了一種查詢語(yǔ)句解析與再處理的方法,包括以下步驟:
[0009]定義一個(gè)類,所述類包含6項(xiàng)屬性,分別對(duì)應(yīng)標(biāo)準(zhǔn)查詢語(yǔ)句的6個(gè)查詢子句;
[0010]根據(jù)用戶提供的原始查詢語(yǔ)句和查詢參數(shù)集,將所述原始查詢語(yǔ)句的主查詢語(yǔ)句解析為6個(gè)查詢子句,包括select、from、where、group by、having、order by,并用查詢對(duì)象對(duì)應(yīng)的6個(gè)屬性分別將得到的查詢子句進(jìn)行存儲(chǔ),其中所述原查詢語(yǔ)句包含至少一個(gè)查詢子句,對(duì)于所述原查詢語(yǔ)句不包含的查詢子句,所述類對(duì)應(yīng)的屬性為空;
[0011]在查詢對(duì)象中,分別對(duì)解析后的查詢子句進(jìn)行分頁(yè)、分組、排序至少一項(xiàng)的處理。
[0012]根據(jù)所述處理后,重新拼裝進(jìn)而形成新的查詢語(yǔ)句及其查詢參數(shù),執(zhí)行查詢操作。
[0013]進(jìn)一步地,所述標(biāo)準(zhǔn)查詢語(yǔ)句的6個(gè)查詢子句分別為select、from、where、groupby、having、order by,對(duì)應(yīng)于所述類中的 6 項(xiàng)屬性分別為 SqlProxy.select、SqlProxy.from、SqlProxy.where、SqlProxy.groupBy、SqlProxy.having、SqlProxy.0rderBy,對(duì)所述原查詢語(yǔ)句的解析過(guò)程如下:
[0014]找出沒(méi)有包含在任何括號(hào)中的以下關(guān)鍵字:select、from、where、group by、having、order by ;
[0015]將在select與from之間的select子句存儲(chǔ)在SqlProxy.select屬性中;
[0016]from子句位于from與where之間,在檢查時(shí)如果沒(méi)有where關(guān)鍵字則檢查groupby關(guān)鍵字,如果也沒(méi)有則檢查order by關(guān)鍵字,如果還沒(méi)有則從from關(guān)鍵字一直檢查至字符串結(jié)束,將from子句存儲(chǔ)在SqlProxy.from屬性中;
[0017]如果有where關(guān)鍵字,在where與group by之間的是where子句,如果沒(méi)有g(shù)roupby關(guān)鍵字則在where與order by之間,否則一直包含到字符串結(jié)束,將where子句存儲(chǔ)在SqlProxy.where 屬性中;
[0018]如果有g(shù)roup by關(guān)鍵字,同時(shí)有having關(guān)鍵字,則group by與having之間的是group by子句,如果有order by關(guān)鍵字則having與order by之間是having子句,如果沒(méi)有order by關(guān)鍵字則從having到結(jié)尾的是having子句;如果沒(méi)有having關(guān)鍵字,如果有order by關(guān)鍵字則group by與order by之間的是group by子句,如果沒(méi)有order by關(guān)鍵字則從group by到結(jié)尾的是group by子句;將group by子句和having子句分別存儲(chǔ)到 SqlProxy.groupBy 和 SqlProxy.having 屬性中;
[0019]如果有order by關(guān)鍵字,則將該關(guān)鍵字后的字符存儲(chǔ)到SqlProxy.0rderBy屬性中。
[0020]進(jìn)一步地,如果用戶傳遞參數(shù)時(shí)傳遞了變量page與size,則將對(duì)該查詢提供分頁(yè)查詢的功能,使其只查詢變量page對(duì)應(yīng)頁(yè)所需的數(shù)據(jù),其中,在第一次查詢時(shí)計(jì)算出頁(yè)數(shù)與行數(shù)的總數(shù)據(jù)量,并與變量page和size —起計(jì)算出“第η頁(yè)/共m頁(yè)”和“第x條/共I條”信息,其中變量page為第幾頁(yè),變量size為每頁(yè)多少行,n、m、x、y均為自然數(shù)。
[0021]進(jìn)一步地,如果用戶傳遞參數(shù)時(shí)傳遞了變量ordering,則對(duì)原查詢拆分后的orderby子句進(jìn)行替換更新,將更新后的各個(gè)子句重新進(jìn)行拼裝,形成新的查詢語(yǔ)句,執(zhí)行排序查詢。
[0022]進(jìn)一步地,如果用戶傳遞參數(shù)時(shí)傳遞了變量groupBy、having,則對(duì)原查詢拆分后的group by子句進(jìn)行替換更新,將更新后的各個(gè)子句重新進(jìn)行拼裝,形成新的查詢語(yǔ)句,執(zhí)行分組查詢。
[0023]為達(dá)到上述目的,本發(fā)明還提供了一種查詢語(yǔ)句解析與再處理的裝置,包括:
[0024]解析模塊,首先定義一個(gè)類,所述類包含6項(xiàng)屬性,分別對(duì)應(yīng)標(biāo)準(zhǔn)查詢語(yǔ)句的6個(gè)查詢子句;
[0025]根據(jù)用戶提供的原始查詢語(yǔ)句和查詢參數(shù)集,將所述原始查詢語(yǔ)句的主查詢語(yǔ)句解析為6個(gè)查詢子句,包括select、from、where、group by、having、order by,并用查詢對(duì)象對(duì)應(yīng)的6個(gè)屬性分別將得到的查詢子句進(jìn)行存儲(chǔ),其中所述原查詢語(yǔ)句包含至少一個(gè)查詢子句,對(duì)于所述原查詢語(yǔ)句不包含的查詢子句,所述類對(duì)應(yīng)的屬性為空;
[0026]處理模塊,在查詢對(duì)象中,分別對(duì)解析后的查詢子句進(jìn)行分頁(yè)、分組、排序至少一項(xiàng)的處理。
[0027]根據(jù)所述處理后,重新拼裝進(jìn)而形成新的查詢語(yǔ)句及其查詢參數(shù),執(zhí)行查詢操作。
[0028]進(jìn)一步地,所述標(biāo)準(zhǔn)查詢語(yǔ)句的6個(gè)查詢子句分別為select、from、where、groupby、having、order by,對(duì)應(yīng)于所述類中的 6 項(xiàng)屬性分別為 SqlProxy.select、SqlProxy.from、SqlProxy.where、SqlPro