新的起點 新的開始

          快樂生活 !

          翻譯DB4O參考——Query(四)

          NQ

          你不想使用你使用的編程語言來構(gòu)造查詢條件?它是100%類型安全并且100%編譯時檢查和100%可分解.不想通過面向?qū)ο蟮?br />原則來實現(xiàn)查詢? 來吧!進(jìn)入NQ
          NQ是主要的查詢接口,它被推薦使用在你的應(yīng)用中查詢數(shù)據(jù)庫,因為它采用你使用的編程語言的語法,它是完美的標(biāo)準(zhǔn),對于
          將來也是安全的選擇.
          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表達(dá)式返回真,標(biāo)記指定的實例作為查詢的結(jié)果集的一部分,
          db4o試圖優(yōu)化NQ表達(dá)式,通過索引而不是真實的實例.
          簡單的例子:
          讓我們看看采用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按照習(xí)慣工作.一個繼承Predicate類的對象有一個返回布爾值方法match()或者M(jìn)atch()
          這個方法有一個參數(shù).
          Java: boolean match(Pilot candidate);
          當(dāng)你使用NQ時,別忘記用先進(jìn)IDE來輸入NQ表達(dá)式.如果你使用了模板和自動完成功能.
          下面是如何在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
          這些簡單的功能在許多先進(jìn)的IDE是有效的.

          深入的例子


          對于復(fù)雜的查詢,NQ語法是非常準(zhǔn)確并且便于很快的書寫.讓我們比較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表達(dá)式,并把它們轉(zhuǎn)化為SODA,這對于所有的查詢時不可能的.對于某些
          查詢,這種分析將是非常困難,如何這樣,db4o將不得不實例化一些持久對象來執(zhí)行NQ代碼.db4o將試圖分析部分NQ表達(dá)式
          來保證對象實例盡量的少.
          db4o社區(qū)有對NQ優(yōu)化團(tuán)隊,你可以把你的結(jié)果和反饋給db4o組織。當(dāng)前優(yōu)化細(xì)節(jié)在NQ Optimization 章節(jié)。
          對于當(dāng)前的實現(xiàn),上面除了隨意的查詢外,其他的都進(jìn)行了優(yōu)化。

          posted on 2007-03-13 15:52 advincenting 閱讀(526) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫相關(guān)

          公告

          Locations of visitors to this pageBlogJava
        1. 首頁
        2. 新隨筆
        3. 聯(lián)系
        4. 聚合
        5. 管理
        6. <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計

          常用鏈接

          留言簿(13)

          隨筆分類(71)

          隨筆檔案(179)

          文章檔案(13)

          新聞分類

          IT人的英語學(xué)習(xí)網(wǎng)站

          JAVA站點

          優(yōu)秀個人博客鏈接

          官網(wǎng)學(xué)習(xí)站點

          生活工作站點

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 万山特区| 丹东市| 关岭| 秦安县| 南漳县| 北京市| 永修县| 水城县| 苗栗县| 含山县| 洛阳市| 上蔡县| 九龙县| 武冈市| 四会市| 连城县| 奉化市| 同江市| 唐山市| 桑植县| 安宁市| 友谊县| 那曲县| 卫辉市| 嘉峪关市| 郧西县| 镇原县| 永定县| 蓝山县| 当雄县| 阜平县| 海盐县| 瑞昌市| 莱阳市| 云龙县| 玉门市| 彭州市| 荆门市| 扬州市| 图们市| 阿拉善盟|