新的起點 新的開始

          快樂生活 !

          翻譯DB4O參考——Query(四)

          NQ

          你不想使用你使用的編程語言來構(gòu)造查詢條件?它是100%類型安全并且100%編譯時檢查和100%可分解.不想通過面向?qū)ο蟮?br />原則來實現(xiàn)查詢? 來吧!進入NQ
          NQ是主要的查詢接口,它被推薦使用在你的應用中查詢數(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是有效的.

          深入的例子


          對于復雜的查詢,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)化。

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

          公告

          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人的英語學習網(wǎng)站

          JAVA站點

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

          官網(wǎng)學習站點

          生活工作站點

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 盐城市| 福州市| 永和县| 大余县| 溧阳市| 钟祥市| 吴堡县| 怀安县| 赤城县| 客服| 北流市| 凤山县| 新野县| 柘城县| 鄂尔多斯市| 鄢陵县| 朝阳市| 师宗县| 涟水县| 健康| 抚州市| 东乡族自治县| 靖州| 固安县| 恩施市| 华阴市| 长白| 郯城县| 大足县| 错那县| 湟中县| 兴城市| 太谷县| 闽清县| 博野县| 壶关县| 定州市| 洛浦县| 吐鲁番市| 兴义市| 惠安县|