NQ
你不想使用你使用的編程語言來構(gòu)造查詢條件?它是100%類型安全并且100%編譯時檢查和100%可分解.不想通過面向?qū)ο蟮?br />原則來實現(xiàn)查詢? 來吧!進入NQ
NQ是主要的查詢接口,它被推薦使用在你的應(yīng)用中查詢數(shù)據(jù)庫,因為它采用你使用的編程語言的語法,它是完美的標準,對于
將來也是安全的選擇.
NQ支持所有平臺.
觀念
NQ的感念來自下面的兩篇文章:
Cook/Rosenberger, Native Queries for Persistent Objects, A Design White Paper
Cook/Rai, Safe Query Objects: Statically Typed Objects as Remotely Executable Queries
原則
NQ通過運行一行或者多行代碼而不是一個對象的所有實例.NQ表達式返回真,標記指定的實例作為查詢的結(jié)果集的一部分,
db4o試圖優(yōu)化NQ表達式,通過索引而不是真實的實例.
簡單的例子:
讓我們看看采用db4o所支持的編程語言,用NQ是多么的簡單.
Java5:
PrimitiveExample.java: primitiveQuery
public static void primitiveQuery(ObjectContainer db)...{
??? List pilots = db.query(new Predicate() ...{
??????? public boolean match(Pilot pilot) ...{
??????????? return pilot.getPoints() == 100;
??????? }
??? });
? }
Java1.2-1.4:
NQExample.java: primitiveQuery
public static void primitiveQuery(ObjectContainer db)...{
????? List <Pilot> pilots = db.query(new Predicate<Pilot>() ...{
????????? public boolean match(Pilot pilot) ...{
????????????? return pilot.getPoints() == 100;
????????? }
????? });?
??? }
Java1.1:
PrimitiveExample.java: primitiveQuery1
public static void primitiveQuery1(ObjectContainer db)...{
??? List pilots = db.query(new PilotHundredPoints());
? }
PilotHundredPoints.java
/**//* Copyright (C) 2004 - 2006 db4objects Inc.
http://www.db4o.com
*/
import com.db4o.query.Predicate;
public class PilotHundredPoints extends Predicate ...{
??? public boolean match(Pilot pilot) ...{
??????? return pilot.getPoints() == 100;
??? }
}
順便提醒一下上邊的語法:
對于所有的方言不支持通用類型,NQ按照習慣工作.一個繼承Predicate類的對象有一個返回布爾值方法match()或者Match()
這個方法有一個參數(shù).
Java: boolean match(Pilot candidate);
當你使用NQ時,別忘記用先進IDE來輸入NQ表達式.如果你使用了模板和自動完成功能.
下面是如何在Eclipse3.1中配置:
1.打開菜單,選擇 Window + Preferences + Java + Editor + Templates + New
名字為np,確保選擇java在context中,拷貝下面內(nèi)容到Pattern field中:
List <${extent}> list = db.query(new Predicate <${extent}> () {
public boolean match(${extent} candidate){
return true;
}
});
現(xiàn)在,你可以創(chuàng)建NQ查詢通過n + q + Control-Space
這些簡單的功能在許多先進的IDE是有效的.
深入的例子
對于復(fù)雜的查詢,NQ語法是非常準確并且便于很快的書寫.讓我們比較SODA查詢給定名字或者給定成績區(qū)間的pilot.
存儲:
NQExample.java: storePilots
public static void storePilots(ObjectContainer db) ...{
?????? db.set(new Pilot("Michael Schumacher",100));
?????? db.set(new Pilot("Rubens Barrichello",99));
??? }
通過SODA查詢:
NQExample.java: retrieveComplexSODA
public static void retrieveComplexSODA(ObjectContainer db) ...{
??????? Query query=db.query();
??????? query.constrain(Pilot.class);
??????? Query pointQuery=query.descend("points");
??????? query.descend("name").constrain("Rubens Barrichello")
????????? .or(pointQuery.constrain(new Integer(99)).greater()
????????????? .and(pointQuery.constrain(new Integer(199)).smaller()));
??????? ObjectSet result=query.execute();
??????? listResult(result);
??? }
下面是通過NQ語法實現(xiàn)相同的查詢.它是跟容易自動完成可分解等其他IDE特性,并且還是運行期檢查.
NQExample.java: advancedQuery
public static void advancedQuery(ObjectContainer db)...{
????? List <Pilot> result = db.query(new Predicate<Pilot>() ...{
????????? public boolean match(Pilot pilot) ...{
????????????? return pilot.getPoints() > 99
????????????????? && pilot.getPoints() < 199
???????????????? || pilot.getName().equals("Rubens Barrichello");
???????? }
????? });?
?? }
隨意的查詢
.
基本而言,你可以有效地使用NQ,原則上,你可以運行使用NQ任意隨意的查詢,你僅僅要考慮其他的影響,特別是
可能影響持久化的對象.
讓我們運行一個例子來包括更多的有效語言特性:
NQExample.java: retrieveArbitraryCodeNQ
public static void retrieveArbitraryCodeNQ(ObjectContainer db) ...{
????? final int[] points=...{1,100};
??????? ObjectSet result=db.query(new Predicate<Pilot>() ...{
????????? public boolean match(Pilot pilot) ...{
??????????? for(int i=0;i<points.length;i++) ...{
????????????? if(pilot.getPoints()==points[i]) ...{
??????????????? return true;
????????????? }
??????????? }
??????????? return pilot.getName().startsWith("Rubens");
????? }
??????? });
??????? listResult(result);
??? }
NQ 性能
對于NQ的一個缺點必須要指出:NO引擎試圖分析NQ表達式,并把它們轉(zhuǎn)化為SODA,這對于所有的查詢時不可能的.對于某些
查詢,這種分析將是非常困難,如何這樣,db4o將不得不實例化一些持久對象來執(zhí)行NQ代碼.db4o將試圖分析部分NQ表達式
來保證對象實例盡量的少.
db4o社區(qū)有對NQ優(yōu)化團隊,你可以把你的結(jié)果和反饋給db4o組織。當前優(yōu)化細節(jié)在NQ Optimization 章節(jié)。
對于當前的實現(xiàn),上面除了隨意的查詢外,其他的都進行了優(yōu)化。