00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <config.h>
00023
00024 #include <xapian.h>
00025
00026 #include "cputimer.h"
00027 #include "str.h"
00028 #include "stringutils.h"
00029 #include "utils.h"
00030
00031 #include <cmath>
00032 #include <iostream>
00033 #include <string>
00034 #include <vector>
00035
00036 #include <stdlib.h>
00037
00038 using namespace std;
00039
00040 #define TESTCASE(S) {#S, test_##S}
00041 #define END_OF_TESTCASES {0, 0}
00042
00043 #include "testsuite.h"
00044 #include "testutils.h"
00045
00046 struct test {
00047 const char *query;
00048 const char *expect;
00049 };
00050
00051 static const test test_or_queries[] = {
00052 { "simple-example", "(simple:(pos=1) PHRASE 2 example:(pos=2))" },
00053 { "time_t", "Ztime_t:(pos=1)" },
00054 { "stock -cooking", "(Zstock:(pos=1) AND_NOT Zcook:(pos=2))" },
00055 { "foo -baz bar", "((Zfoo:(pos=1) OR Zbar:(pos=3)) AND_NOT Zbaz:(pos=2))" },
00056 { "d- school report", "(Zd:(pos=1) OR Zschool:(pos=2) OR Zreport:(pos=3))" },
00057 { "gtk+ -gnome", "(Zgtk+:(pos=1) AND_NOT Zgnome:(pos=2))" },
00058 { "c++ -d--", "(Zc++:(pos=1) AND_NOT Zd:(pos=2))" },
00059 { "Mg2+ Cl-", "(mg2+:(pos=1) OR cl:(pos=2))" },
00060 { "\"c++ library\"", "(c++:(pos=1) PHRASE 2 library:(pos=2))" },
00061 { "A&L A&RMCO AD&D", "(a&l:(pos=1) OR a&rmco:(pos=2) OR ad&d:(pos=3))" },
00062 { "C# vs C++", "(c#:(pos=1) OR Zvs:(pos=2) OR c++:(pos=3))" },
00063 { "j##", "Zj##:(pos=1)" },
00064 { "a#b", "(Za:(pos=1) OR Zb:(pos=2))" },
00065 { "O.K. U.N.C.L.E XY.Z.", "(ok:(pos=1) OR uncle:(pos=2) OR (xy:(pos=3) PHRASE 2 z:(pos=4)))" },
00066 { "author:orwell animal farm", "(ZAorwel:(pos=1) OR Zanim:(pos=2) OR Zfarm:(pos=3))" },
00067 { "author:Orwell Animal Farm", "(Aorwell:(pos=1) OR animal:(pos=2) OR farm:(pos=3))" },
00068
00069 { "author:\"orwell\" title:\"animal\"", "(Aorwell:(pos=1) OR XTanimal:(pos=2))" },
00070
00071 { "author:(orwell) title:(animal)", "(ZAorwel:(pos=1) OR ZXTanim:(pos=2))" },
00072
00073 { "author:\"milne, a.a.\"", "(Amilne:(pos=1) PHRASE 3 Aa:(pos=2) PHRASE 3 Aa:(pos=3))" },
00074 { "author:\"milne a.a.\"", "(Amilne:(pos=1) PHRASE 3 Aa:(pos=2) PHRASE 3 Aa:(pos=3))" },
00075
00076 { "site:/path/name", "0 * H/path/name" },
00077
00078 { "author:/path/name", "(Apath:(pos=1) PHRASE 2 Aname:(pos=2))" },
00079
00080 { "author:/path", "ZApath:(pos=1)" },
00081 { "author:-Foo", "Afoo:(pos=1)" },
00082 { "author:/", "Zauthor:(pos=1)" },
00083 { "author::", "Zauthor:(pos=1)" },
00084 { "author:/ foo", "(Zauthor:(pos=1) OR Zfoo:(pos=2))" },
00085 { "author:: foo", "(Zauthor:(pos=1) OR Zfoo:(pos=2))" },
00086 { "author::foo", "(author:(pos=1) PHRASE 2 foo:(pos=2))" },
00087 { "author:/ AND foo", "(Zauthor:(pos=1) AND Zfoo:(pos=2))" },
00088 { "author:: AND foo", "(Zauthor:(pos=1) AND Zfoo:(pos=2))" },
00089 { "foo AND author:/", "(Zfoo:(pos=1) AND Zauthor:(pos=2))" },
00090 { "foo AND author::", "(Zfoo:(pos=1) AND Zauthor:(pos=2))" },
00091
00092 { "author:(title::case)", "(Atitle:(pos=1) PHRASE 2 Acase:(pos=2))" },
00093
00094
00095 { "\"hello world\" +python", "(Zpython:(pos=3) AND_MAYBE (hello:(pos=1) PHRASE 2 world:(pos=2)))" },
00096
00097 { "\xd8\xa7\xd9\x84\xd8\xb1\xd9\x91\xd8\xad\xd9\x85\xd9\x86", "Z\xd8\xa7\xd9\x84\xd8\xb1\xd9\x91\xd8\xad\xd9\x85\xd9\x86:(pos=1)" },
00098
00099
00100 { "\xe1\x80\x9d\xe1\x80\xae\xe2\x80\x8b\xe1\x80\x80\xe1\x80\xae\xe2\x80\x8b\xe1\x80\x95\xe1\x80\xad\xe2\x80\x8b\xe1\x80\x9e\xe1\x80\xaf\xe1\x80\xb6\xe1\x80\xb8\xe2\x80\x8b\xe1\x80\x85\xe1\x80\xbd\xe1\x80\xb2\xe2\x80\x8b\xe1\x80\x9e\xe1\x80\xb0\xe2\x80\x8b\xe1\x80\x99\xe1\x80\xbb\xe1\x80\xac\xe1\x80\xb8\xe1\x80\x80", "Z\xe1\x80\x9d\xe1\x80\xae\xe1\x80\x80\xe1\x80\xae\xe1\x80\x95\xe1\x80\xad\xe1\x80\x9e\xe1\x80\xaf\xe1\x80\xb6\xe1\x80\xb8\xe1\x80\x85\xe1\x80\xbd\xe1\x80\xb2\xe1\x80\x9e\xe1\x80\xb0\xe1\x80\x99\xe1\x80\xbb\xe1\x80\xac\xe1\x80\xb8\xe1\x80\x80:(pos=1)" },
00101 { "unmatched\"", "unmatched:(pos=1)" },
00102 { "unmatched \" \" ", "Zunmatch:(pos=1)" },
00103 { "hyphen-ated\" ", "(hyphen:(pos=1) PHRASE 2 ated:(pos=2))" },
00104 { "hyphen-ated\" \"", "(hyphen:(pos=1) PHRASE 2 ated:(pos=2))" },
00105 { "\"1.4\"", "1.4:(pos=1)" },
00106 { "\"1.\"", "1:(pos=1)" },
00107 { "\"A#.B.\"", "(a#:(pos=1) PHRASE 2 b:(pos=2))" },
00108 { "\" Xapian QueryParser\" parses queries", "((xapian:(pos=1) PHRASE 2 queryparser:(pos=2)) OR Zpars:(pos=3) OR Zqueri:(pos=4))" },
00109 { "\" xapian queryParser\" parses queries", "((xapian:(pos=1) PHRASE 2 queryparser:(pos=2)) OR Zpars:(pos=3) OR Zqueri:(pos=4))" },
00110 { "h\xc3\xb6hle", "Zh\xc3\xb6hle:(pos=1)" },
00111 { "one +two three", "(Ztwo:(pos=2) AND_MAYBE (Zone:(pos=1) OR Zthree:(pos=3)))" },
00112 { "subject:test other", "(ZXTtest:(pos=1) OR Zother:(pos=2))" },
00113 { "subject:\"space flight\"", "(XTspace:(pos=1) PHRASE 2 XTflight:(pos=2))" },
00114 { "author:(twain OR poe) OR flight", "(ZAtwain:(pos=1) OR ZApoe:(pos=2) OR Zflight:(pos=3))" },
00115 { "author:(twain OR title:pit OR poe)", "(ZAtwain:(pos=1) OR ZXTpit:(pos=2) OR ZApoe:(pos=3))" },
00116 { "title:2001 title:space", "(XT2001:(pos=1) OR ZXTspace:(pos=2))" },
00117 { "(title:help)", "ZXThelp:(pos=1)" },
00118 { "beer NOT \"orange juice\"", "(Zbeer:(pos=1) AND_NOT (orange:(pos=2) PHRASE 2 juice:(pos=3)))" },
00119 { "beer AND NOT lager", "(Zbeer:(pos=1) AND_NOT Zlager:(pos=2))" },
00120 { "beer AND -lager", "(Zbeer:(pos=1) AND_NOT Zlager:(pos=2))" },
00121 { "beer AND +lager", "(Zbeer:(pos=1) AND Zlager:(pos=2))" },
00122 { "A OR B NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
00123 { "A OR B AND NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
00124 { "A OR B AND -C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
00125 { "A OR B AND +C", "(a:(pos=1) OR (b:(pos=2) AND c:(pos=3)))" },
00126 { "A OR B XOR C", "(a:(pos=1) OR (b:(pos=2) XOR c:(pos=3)))" },
00127 { "A XOR B NOT C", "(a:(pos=1) XOR (b:(pos=2) AND_NOT c:(pos=3)))" },
00128 { "one AND two", "(Zone:(pos=1) AND Ztwo:(pos=2))" },
00129 { "one A.N.D. two", "(Zone:(pos=1) OR and:(pos=2) OR Ztwo:(pos=3))" },
00130 { "one \xc3\x81ND two", "(Zone:(pos=1) OR \xc3\xa1nd:(pos=2) OR Ztwo:(pos=3))" },
00131 { "one author:AND two", "(Zone:(pos=1) OR Aand:(pos=2) OR Ztwo:(pos=3))" },
00132 { "author:hyphen-ated", "(Ahyphen:(pos=1) PHRASE 2 Aated:(pos=2))" },
00133 { "cvs site:xapian.org", "(Zcvs:(pos=1) FILTER Hxapian.org)" },
00134 { "cvs -site:xapian.org", "(Zcvs:(pos=1) AND_NOT Hxapian.org)" },
00135 { "foo -site:xapian.org bar", "((Zfoo:(pos=1) OR Zbar:(pos=2)) AND_NOT Hxapian.org)" },
00136 { "site:xapian.org mail", "(Zmail:(pos=1) FILTER Hxapian.org)" },
00137 { "-site:xapian.org mail", "(Zmail:(pos=1) AND_NOT Hxapian.org)" },
00138 { "mail AND -site:xapian.org", "(Zmail:(pos=1) AND_NOT 0 * Hxapian.org)" },
00139 { "-Wredundant-decls", "(wredundant:(pos=1) PHRASE 2 decls:(pos=2))" },
00140 { "site:xapian.org", "0 * Hxapian.org" },
00141 { "mug +site:xapian.org -site:cvs.xapian.org", "((Zmug:(pos=1) FILTER Hxapian.org) AND_NOT Hcvs.xapian.org)" },
00142 { "mug -site:cvs.xapian.org +site:xapian.org", "((Zmug:(pos=1) FILTER Hxapian.org) AND_NOT Hcvs.xapian.org)" },
00143 { "mug +site:xapian.org AND -site:cvs.xapian.org", "((Zmug:(pos=1) FILTER Hxapian.org) AND_NOT 0 * Hcvs.xapian.org)" },
00144 { "mug site:xapian.org AND -site:cvs.xapian.org", "((Zmug:(pos=1) FILTER Hxapian.org) AND_NOT 0 * Hcvs.xapian.org)" },
00145 { "mug site:xapian.org AND +site:cvs.xapian.org", "((Zmug:(pos=1) FILTER Hxapian.org) AND 0 * Hcvs.xapian.org)" },
00146 { "NOT windows", "Syntax: <expression> NOT <expression>" },
00147 { "a AND (NOT b)", "Syntax: <expression> NOT <expression>" },
00148 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
00149 { "AND -windows", "Syntax: <expression> AND <expression>" },
00150 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
00151 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
00152 { "gordian AND -", "Syntax: <expression> AND <expression>" },
00153 { "foo OR (something AND)", "Syntax: <expression> AND <expression>" },
00154 { "OR foo", "Syntax: <expression> OR <expression>" },
00155 { "XOR", "Syntax: <expression> XOR <expression>" },
00156 { "hard\xa0space", "(Zhard:(pos=1) OR Zspace:(pos=2))" },
00157 { " white\r\nspace\ttest ", "(Zwhite:(pos=1) OR Zspace:(pos=2) OR Ztest:(pos=3))" },
00158 { "one AND two three", "(Zone:(pos=1) AND (Ztwo:(pos=2) OR Zthree:(pos=3)))" },
00159 { "one two AND three", "((Zone:(pos=1) OR Ztwo:(pos=2)) AND Zthree:(pos=3))" },
00160 { "one AND two/three", "(Zone:(pos=1) AND (two:(pos=2) PHRASE 2 three:(pos=3)))" },
00161 { "one AND /two/three", "(Zone:(pos=1) AND (two:(pos=2) PHRASE 2 three:(pos=3)))" },
00162 { "one AND/two/three", "(Zone:(pos=1) AND (two:(pos=2) PHRASE 2 three:(pos=3)))" },
00163 { "one +/two/three", "((two:(pos=2) PHRASE 2 three:(pos=3)) AND_MAYBE Zone:(pos=1))" },
00164 { "one//two", "(one:(pos=1) PHRASE 2 two:(pos=2))" },
00165 { "\"missing quote", "(missing:(pos=1) PHRASE 2 quote:(pos=2))" },
00166 { "DVD+RW", "(dvd:(pos=1) OR rw:(pos=2))" },
00167 { "+\"must have\" optional", "((must:(pos=1) PHRASE 2 have:(pos=2)) AND_MAYBE Zoption:(pos=3))" },
00168 { "one NEAR two NEAR three", "(one:(pos=1) NEAR 12 two:(pos=2) NEAR 12 three:(pos=3))" },
00169 { "something NEAR/3 else", "(something:(pos=1) NEAR 4 else:(pos=2))" },
00170 { "a NEAR/6 b NEAR c", "(a:(pos=1) NEAR 8 b:(pos=2) NEAR 8 c:(pos=3))" },
00171 { "something ADJ else", "(something:(pos=1) PHRASE 11 else:(pos=2))" },
00172 { "something ADJ/3 else", "(something:(pos=1) PHRASE 4 else:(pos=2))" },
00173 { "a ADJ/6 b ADJ c", "(a:(pos=1) PHRASE 8 b:(pos=2) PHRASE 8 c:(pos=3))" },
00174
00175
00176
00177 { "a NEAR/\xc4\xb5 b", "(Za:(pos=1) OR (near:(pos=2) PHRASE 2 \xc4\xb5:(pos=3)) OR Zb:(pos=4))" },
00178 { "a ADJ/\xc4\xb5 b", "(Za:(pos=1) OR (adj:(pos=2) PHRASE 2 \xc4\xb5:(pos=3)) OR Zb:(pos=4))" },
00179
00180
00181 { "a NEAR/b", "(Za:(pos=1) OR (near:(pos=2) PHRASE 2 b:(pos=3)))" },
00182 { "a ADJ/b", "(Za:(pos=1) OR (adj:(pos=2) PHRASE 2 b:(pos=3)))" },
00183 { "a NEAR/b c", "(Za:(pos=1) OR (near:(pos=2) PHRASE 2 b:(pos=3)) OR Zc:(pos=4))" },
00184 { "a ADJ/b c", "(Za:(pos=1) OR (adj:(pos=2) PHRASE 2 b:(pos=3)) OR Zc:(pos=4))" },
00185
00186
00187 { "+(one two) three", "((Zone:(pos=1) OR Ztwo:(pos=2)) AND_MAYBE Zthree:(pos=3))" },
00188 { "zero -(one two)", "(Zzero:(pos=1) AND_NOT (Zone:(pos=2) OR Ztwo:(pos=3)))" },
00189
00190 { "category:Foo", "0 * XCAT:Foo" },
00191 { "category:foo", "0 * XCATfoo" },
00192 { "category:\xc3\x96oo", "0 * XCAT\xc3\x96oo" },
00193
00194 { "category:\"Hello world\"", "0 * XCAT:Hello world" },
00195 { "category:\"literal \"\"\"", "0 * XCATliteral \"" },
00196 { "category:\"(unterminated)", "0 * XCAT(unterminated)" },
00197
00198 { "Call to undefined function: imagecreate()", "(call:(pos=1) OR Zto:(pos=2) OR Zundefin:(pos=3) OR Zfunction:(pos=4) OR imagecreate:(pos=5))" },
00199 { "mysql_fetch_row(): supplied argument is not a valid MySQL result resource", "(mysql_fetch_row:(pos=1) OR Zsuppli:(pos=2) OR Zargument:(pos=3) OR Zis:(pos=4) OR Znot:(pos=5) OR Za:(pos=6) OR Zvalid:(pos=7) OR mysql:(pos=8) OR Zresult:(pos=9) OR Zresourc:(pos=10))" },
00200 { "php date() nedelands", "(Zphp:(pos=1) OR date:(pos=2) OR Znedeland:(pos=3))" },
00201 { "wget domein --http-user", "(Zwget:(pos=1) OR Zdomein:(pos=2) OR (http:(pos=3) PHRASE 2 user:(pos=4)))" },
00202 { "@home problemen", "(Zhome:(pos=1) OR Zproblemen:(pos=2))" },
00203 { "'ipacsum'", "Zipacsum:(pos=1)" },
00204 { "canal + ", "Zcanal:(pos=1)" },
00205 { "/var/run/mysqld/mysqld.sock", "(var:(pos=1) PHRASE 5 run:(pos=2) PHRASE 5 mysqld:(pos=3) PHRASE 5 mysqld:(pos=4) PHRASE 5 sock:(pos=5))" },
00206 { "\"QSI-161 drivers\"", "(qsi:(pos=1) PHRASE 3 161:(pos=2) PHRASE 3 drivers:(pos=3))" },
00207 { "\"e-cube\" barebone", "((e:(pos=1) PHRASE 2 cube:(pos=2)) OR Zbarebon:(pos=3))" },
00208 { "\"./httpd: symbol not found: dlopen\"", "(httpd:(pos=1) PHRASE 5 symbol:(pos=2) PHRASE 5 not:(pos=3) PHRASE 5 found:(pos=4) PHRASE 5 dlopen:(pos=5))" },
00209 { "ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)", "(error:(pos=1) OR 2003:(pos=2) OR can't:(pos=3) OR Zconnect:(pos=4) OR Zto:(pos=5) OR mysql:(pos=6) OR Zserver:(pos=7) OR Zon:(pos=8) OR Zlocalhost:(pos=9) OR 10061:(pos=10))" },
00210 { "location.href = \"\"", "(location:(pos=1) PHRASE 2 href:(pos=2))" },
00211 { "method=\"post\" action=\"\">", "(method:(pos=1) OR post:(pos=2) OR action:(pos=3))" },
00212 { "behuizing 19\" inch", "(Zbehuiz:(pos=1) OR 19:(pos=2) OR inch:(pos=3))" },
00213 { "19\" rack", "(19:(pos=1) OR rack:(pos=2))" },
00214 { "3,5\" mainboard", "(3,5:(pos=1) OR mainboard:(pos=2))" },
00215 { "553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)", "(553:(pos=1) OR Zsorri:(pos=2) OR Zthat:(pos=3) OR Zdomain:(pos=4) OR Zisn't:(pos=5) OR Zin:(pos=6) OR Zmy:(pos=7) OR Zlist:(pos=8) OR Zof:(pos=9) OR Zallow:(pos=10) OR Zrcpthost:(pos=11) OR 5.7.1:(pos=12))" },
00216 { "data error (clic redundancy check)", "(Zdata:(pos=1) OR Zerror:(pos=2) OR Zclic:(pos=3) OR Zredund:(pos=4) OR Zcheck:(pos=5))" },
00217 { "? mediaplayer 9\"", "(Zmediaplay:(pos=1) OR 9:(pos=2))" },
00218 { "date(\"w\")", "(date:(pos=1) OR w:(pos=2))" },
00219 { "Syntaxisfout (operator ontbreekt ASP", "(syntaxisfout:(pos=1) OR Zoper:(pos=2) OR Zontbreekt:(pos=3) OR asp:(pos=4))" },
00220 { "Request.ServerVariables(\"logon_user\")", "((request:(pos=1) PHRASE 2 servervariables:(pos=2)) OR logon_user:(pos=3))" },
00221 { "ASP \"request.form\" van \\\"enctype=\"MULTIPART/FORM-DATA\"\\\"", "(asp:(pos=1) OR (request:(pos=2) PHRASE 2 form:(pos=3)) OR Zvan:(pos=4) OR enctype:(pos=5) OR (multipart:(pos=6) PHRASE 3 form:(pos=7) PHRASE 3 data:(pos=8)))" },
00222 { "USER ftp (Login failed): Invalid shell: /sbin/nologin", "(user:(pos=1) OR Zftp:(pos=2) OR login:(pos=3) OR Zfail:(pos=4) OR invalid:(pos=5) OR Zshell:(pos=6) OR (sbin:(pos=7) PHRASE 2 nologin:(pos=8)))" },
00223 { "ip_masq_new(proto=TCP)", "(ip_masq_new:(pos=1) OR proto:(pos=2) OR tcp:(pos=3))" },
00224 { "\"document.write(\"", "(document:(pos=1) PHRASE 2 write:(pos=2))" },
00225 { "ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)", "(error:(pos=1) OR 1045:(pos=2) OR access:(pos=3) OR Zdeni:(pos=4) OR Zfor:(pos=5) OR Zuser:(pos=6) OR (root:(pos=7) PHRASE 2 localhost:(pos=8)) OR using:(pos=9) OR Zpassword:(pos=10) OR no:(pos=11))" },
00226 { "TIP !! subtitles op TV-out (via DVD max g400)", "(tip:(pos=1) OR Zsubtitl:(pos=2) OR Zop:(pos=3) OR (tv:(pos=4) PHRASE 2 out:(pos=5)) OR Zvia:(pos=6) OR dvd:(pos=7) OR Zmax:(pos=8) OR Zg400:(pos=9))" },
00227 { "Gigabyte 8PE667 (de Ultra versie) of Asus A7N8X Deluxe", "(gigabyte:(pos=1) OR 8pe667:(pos=2) OR Zde:(pos=3) OR ultra:(pos=4) OR Zversi:(pos=5) OR Zof:(pos=6) OR asus:(pos=7) OR a7n8x:(pos=8) OR deluxe:(pos=9))" },
00228 { "\"1) Ze testen 8x AF op de GFFX tegen \"", "(1:(pos=1) PHRASE 9 ze:(pos=2) PHRASE 9 testen:(pos=3) PHRASE 9 8x:(pos=4) PHRASE 9 af:(pos=5) PHRASE 9 op:(pos=6) PHRASE 9 de:(pos=7) PHRASE 9 gffx:(pos=8) PHRASE 9 tegen:(pos=9))" },
00229 { "\") Ze houden geen rekening met de kwaliteit van AF. Als ze dat gedaan hadden dan waren ze tot de conclusie gekomen dat Performance AF (dus Bilinear AF) op de 9700Pro goed te vergelijken is met Balanced AF op de GFFX. En dan hadden ze ook gezien dat de GFFX niet kan tippen aan de Quality AF van de 9700Pro.\"", "(ze:(pos=1) PHRASE 59 houden:(pos=2) PHRASE 59 geen:(pos=3) PHRASE 59 rekening:(pos=4) PHRASE 59 met:(pos=5) PHRASE 59 de:(pos=6) PHRASE 59 kwaliteit:(pos=7) PHRASE 59 van:(pos=8) PHRASE 59 af:(pos=9) PHRASE 59 als:(pos=10) PHRASE 59 ze:(pos=11) PHRASE 59 dat:(pos=12) PHRASE 59 gedaan:(pos=13) PHRASE 59 hadden:(pos=14) PHRASE 59 dan:(pos=15) PHRASE 59 waren:(pos=16) PHRASE 59 ze:(pos=17) PHRASE 59 tot:(pos=18) PHRASE 59 de:(pos=19) PHRASE 59 conclusie:(pos=20) PHRASE 59 gekomen:(pos=21) PHRASE 59 dat:(pos=22) PHRASE 59 performance:(pos=23) PHRASE 59 af:(pos=24) PHRASE 59 dus:(pos=25) PHRASE 59 bilinear:(pos=26) PHRASE 59 af:(pos=27) PHRASE 59 op:(pos=28) PHRASE 59 de:(pos=29) PHRASE 59 9700pro:(pos=30) PHRASE 59 goed:(pos=31) PHRASE 59 te:(pos=32) PHRASE 59 vergelijken:(pos=33) PHRASE 59 is:(pos=34) PHRASE 59 met:(pos=35) PHRASE 59 balanced:(pos=36) PHRASE 59 af:(pos=37) PHRASE 59 op:(pos=38) PHRASE 59 de:(pos=39) PHRASE 59 gffx:(pos=40) PHRASE 59 en:(pos=41) PHRASE 59 dan:(pos=42) PHRASE 59 hadden:(pos=43) PHRASE 59 ze:(pos=44) PHRASE 59 ook:(pos=45) PHRASE 59 gezien:(pos=46) PHRASE 59 dat:(pos=47) PHRASE 59 de:(pos=48) PHRASE 59 gffx:(pos=49) PHRASE 59 niet:(pos=50) PHRASE 59 kan:(pos=51) PHRASE 59 tippen:(pos=52) PHRASE 59 aan:(pos=53) PHRASE 59 de:(pos=54) PHRASE 59 quality:(pos=55) PHRASE 59 af:(pos=56) PHRASE 59 van:(pos=57) PHRASE 59 de:(pos=58) PHRASE 59 9700pro:(pos=59))" },
00230 { "\"Ze houden geen rekening met de kwaliteit van AF. Als ze dat gedaan hadden dan waren ze tot de conclusie gekomen dat Performance AF (dus Bilinear AF) op de 9700Pro goed te vergelijken is met Balanced AF op de GFFX. En dan hadden ze ook gezien dat de GFFX niet kan tippen aan de Quality AF van de 9700Pro.\"", "(ze:(pos=1) PHRASE 59 houden:(pos=2) PHRASE 59 geen:(pos=3) PHRASE 59 rekening:(pos=4) PHRASE 59 met:(pos=5) PHRASE 59 de:(pos=6) PHRASE 59 kwaliteit:(pos=7) PHRASE 59 van:(pos=8) PHRASE 59 af:(pos=9) PHRASE 59 als:(pos=10) PHRASE 59 ze:(pos=11) PHRASE 59 dat:(pos=12) PHRASE 59 gedaan:(pos=13) PHRASE 59 hadden:(pos=14) PHRASE 59 dan:(pos=15) PHRASE 59 waren:(pos=16) PHRASE 59 ze:(pos=17) PHRASE 59 tot:(pos=18) PHRASE 59 de:(pos=19) PHRASE 59 conclusie:(pos=20) PHRASE 59 gekomen:(pos=21) PHRASE 59 dat:(pos=22) PHRASE 59 performance:(pos=23) PHRASE 59 af:(pos=24) PHRASE 59 dus:(pos=25) PHRASE 59 bilinear:(pos=26) PHRASE 59 af:(pos=27) PHRASE 59 op:(pos=28) PHRASE 59 de:(pos=29) PHRASE 59 9700pro:(pos=30) PHRASE 59 goed:(pos=31) PHRASE 59 te:(pos=32) PHRASE 59 vergelijken:(pos=33) PHRASE 59 is:(pos=34) PHRASE 59 met:(pos=35) PHRASE 59 balanced:(pos=36) PHRASE 59 af:(pos=37) PHRASE 59 op:(pos=38) PHRASE 59 de:(pos=39) PHRASE 59 gffx:(pos=40) PHRASE 59 en:(pos=41) PHRASE 59 dan:(pos=42) PHRASE 59 hadden:(pos=43) PHRASE 59 ze:(pos=44) PHRASE 59 ook:(pos=45) PHRASE 59 gezien:(pos=46) PHRASE 59 dat:(pos=47) PHRASE 59 de:(pos=48) PHRASE 59 gffx:(pos=49) PHRASE 59 niet:(pos=50) PHRASE 59 kan:(pos=51) PHRASE 59 tippen:(pos=52) PHRASE 59 aan:(pos=53) PHRASE 59 de:(pos=54) PHRASE 59 quality:(pos=55) PHRASE 59 af:(pos=56) PHRASE 59 van:(pos=57) PHRASE 59 de:(pos=58) PHRASE 59 9700pro:(pos=59))" },
00231 { "$structure = imap_header($mbox, $tt);", "(Zstructur:(pos=1) OR imap_header:(pos=2) OR Zmbox:(pos=3) OR Ztt:(pos=4))" },
00232 { "\"ifup: Could not get a valid interface name: -> skipped\"", "(ifup:(pos=1) PHRASE 9 could:(pos=2) PHRASE 9 not:(pos=3) PHRASE 9 get:(pos=4) PHRASE 9 a:(pos=5) PHRASE 9 valid:(pos=6) PHRASE 9 interface:(pos=7) PHRASE 9 name:(pos=8) PHRASE 9 skipped:(pos=9))" },
00233 { "Er kan geen combinatie van filters worden gevonden om de gegevensstroom te genereren. (Error=80040218)", "(er:(pos=1) OR Zkan:(pos=2) OR Zgeen:(pos=3) OR Zcombinati:(pos=4) OR Zvan:(pos=5) OR Zfilter:(pos=6) OR Zworden:(pos=7) OR Zgevonden:(pos=8) OR Zom:(pos=9) OR Zde:(pos=10) OR Zgegevensstroom:(pos=11) OR Zte:(pos=12) OR Zgenereren:(pos=13) OR error:(pos=14) OR 80040218:(pos=15))" },
00234 { "ereg_replace(\"\\\\\",\"\\/\"", "ereg_replace:(pos=1)" },
00235 { "\\\\\"divx+geen+geluid\\\\\"", "(divx:(pos=1) PHRASE 3 geen:(pos=2) PHRASE 3 geluid:(pos=3))" },
00236 { "lcase(\"string\")", "(lcase:(pos=1) OR string:(pos=2))" },
00237 { "isEmpty( ) functie in visual basic", "(isempty:(pos=1) OR Zfuncti:(pos=2) OR Zin:(pos=3) OR Zvisual:(pos=4) OR Zbasic:(pos=5))" },
00238 { "*** stop: 0x0000001E (0xC0000005,0x00000000,0x00000000,0x00000000)", "(Zstop:(pos=1) OR 0x0000001e:(pos=2) OR 0xc0000005,0x00000000,0x00000000,0x00000000:(pos=3))" },
00239 { "\"ctrl+v+c+a fout\"", "(ctrl:(pos=1) PHRASE 5 v:(pos=2) PHRASE 5 c:(pos=3) PHRASE 5 a:(pos=4) PHRASE 5 fout:(pos=5))" },
00240 { "Server.CreateObject(\"ADODB.connection\")", "((server:(pos=1) PHRASE 2 createobject:(pos=2)) OR (adodb:(pos=3) PHRASE 2 connection:(pos=4)))" },
00241 { "Presario 6277EA-XP model P4/28 GHz-120GB-DVD-CDRW (512MBWXP) (470048-012)", "(presario:(pos=1) OR (6277ea:(pos=2) PHRASE 2 xp:(pos=3)) OR Zmodel:(pos=4) OR (p4:(pos=5) PHRASE 2 28:(pos=6)) OR (ghz:(pos=7) PHRASE 4 120gb:(pos=8) PHRASE 4 dvd:(pos=9) PHRASE 4 cdrw:(pos=10)) OR 512mbwxp:(pos=11) OR (470048:(pos=12) PHRASE 2 012:(pos=13)))" },
00242 { "Failed to connect agent. (AGENT=dbaxchg2, EC=UserId =NUll)", "(failed:(pos=1) OR Zto:(pos=2) OR Zconnect:(pos=3) OR Zagent:(pos=4) OR agent:(pos=5) OR Zdbaxchg2:(pos=6) OR ec:(pos=7) OR userid:(pos=8) OR null:(pos=9))" },
00243 { "delphi CreateOleObject(\"MSXML2.DomDocument\")", "(Zdelphi:(pos=1) OR createoleobject:(pos=2) OR (msxml2:(pos=3) PHRASE 2 domdocument:(pos=4)))" },
00244 { "Unhandled exeption in IEXPLORE.EXE (FTAPP.DLL)", "(unhandled:(pos=1) OR Zexept:(pos=2) OR Zin:(pos=3) OR (iexplore:(pos=4) PHRASE 2 exe:(pos=5)) OR (ftapp:(pos=6) PHRASE 2 dll:(pos=7)))" },
00245 { "IBM High Rate Wireless LAN PCI Adapter (Low Profile Enabled)", "(ibm:(pos=1) OR high:(pos=2) OR rate:(pos=3) OR wireless:(pos=4) OR lan:(pos=5) OR pci:(pos=6) OR adapter:(pos=7) OR low:(pos=8) OR profile:(pos=9) OR enabled:(pos=10))" },
00246 { "asp ' en \"", "(Zasp:(pos=1) OR Zen:(pos=2))" },
00247 { "Hercules 3D Prophet 8500 LE 64MB (OEM, Radeon 8500 LE)", "(hercules:(pos=1) OR 3d:(pos=2) OR prophet:(pos=3) OR 8500:(pos=4) OR le:(pos=5) OR 64mb:(pos=6) OR oem:(pos=7) OR radeon:(pos=8) OR 8500:(pos=9) OR le:(pos=10))" },
00248 { "session_set_cookie_params(echo \"hoi\")", "(session_set_cookie_params:(pos=1) OR Zecho:(pos=2) OR hoi:(pos=3))" },
00249 { "windows update werkt niet (windows se", "(Zwindow:(pos=1) OR Zupdat:(pos=2) OR Zwerkt:(pos=3) OR Zniet:(pos=4) OR Zwindow:(pos=5) OR Zse:(pos=6))" },
00250 { "De statuscode van de fout is ( 0 x 4 , 0 , 0 , 0 )", "(de:(pos=1) OR Zstatuscod:(pos=2) OR Zvan:(pos=3) OR Zde:(pos=4) OR Zfout:(pos=5) OR Zis:(pos=6) OR 0:(pos=7) OR Zx:(pos=8) OR 4:(pos=9) OR 0:(pos=10) OR 0:(pos=11) OR 0:(pos=12))" },
00251 { "sony +(u20 u-20)", "((Zu20:(pos=2) OR (u:(pos=3) PHRASE 2 20:(pos=4))) AND_MAYBE Zsoni:(pos=1))" },
00252 { "[crit] (17)File exists: unable to create scoreboard (name-based shared memory failure)", "(Zcrit:(pos=1) OR 17:(pos=2) OR file:(pos=3) OR Zexist:(pos=4) OR Zunabl:(pos=5) OR Zto:(pos=6) OR Zcreat:(pos=7) OR Zscoreboard:(pos=8) OR (name:(pos=9) PHRASE 2 based:(pos=10)) OR Zshare:(pos=11) OR Zmemori:(pos=12) OR Zfailur:(pos=13))" },
00253 { "directories lokaal php (uitlezen OR inladen)", "(Zdirectori:(pos=1) OR Zlokaal:(pos=2) OR Zphp:(pos=3) OR Zuitlezen:(pos=4) OR Zinladen:(pos=5))" },
00254 { "(multi pc modem)+ (line sync)", "(Zmulti:(pos=1) OR Zpc:(pos=2) OR Zmodem:(pos=3) OR Zline:(pos=4) OR Zsync:(pos=5))" },
00255 { "xp 5.1.2600.0 (xpclient.010817-1148)", "(Zxp:(pos=1) OR 5.1.2600.0:(pos=2) OR (xpclient:(pos=3) PHRASE 3 010817:(pos=4) PHRASE 3 1148:(pos=5)))" },
00256 { "DirectDraw test results: Failure at step 5 (User verification of rectangles): HRESULT = 0x00000000 (error code) Direct3D 7 test results: Failure at step 32 (User verification of Direct3D rendering): HRESULT = 0x00000000 (error code) Direct3D 8 test results: Failure at step 32 (User verification of Direct3D rendering): HRESULT = 0x00000000 (error code) Direct3D 9 test results: Failure at step 32 (User verification of Direct3D rendering): HRESULT = 0x00000000 (error code)", "(directdraw:(pos=1) OR Ztest:(pos=2) OR Zresult:(pos=3) OR failure:(pos=4) OR Zat:(pos=5) OR Zstep:(pos=6) OR 5:(pos=7) OR user:(pos=8) OR Zverif:(pos=9) OR Zof:(pos=10) OR Zrectangl:(pos=11) OR hresult:(pos=12) OR 0x00000000:(pos=13) OR Zerror:(pos=14) OR Zcode:(pos=15) OR direct3d:(pos=16) OR 7:(pos=17) OR Ztest:(pos=18) OR Zresult:(pos=19) OR failure:(pos=20) OR Zat:(pos=21) OR Zstep:(pos=22) OR 32:(pos=23) OR user:(pos=24) OR Zverif:(pos=25) OR Zof:(pos=26) OR direct3d:(pos=27) OR Zrender:(pos=28) OR hresult:(pos=29) OR 0x00000000:(pos=30) OR Zerror:(pos=31) OR Zcode:(pos=32) OR direct3d:(pos=33) OR 8:(pos=34) OR Ztest:(pos=35) OR Zresult:(pos=36) OR failure:(pos=37) OR Zat:(pos=38) OR Zstep:(pos=39) OR 32:(pos=40) OR user:(pos=41) OR Zverif:(pos=42) OR Zof:(pos=43) OR direct3d:(pos=44) OR Zrender:(pos=45) OR hresult:(pos=46) OR 0x00000000:(pos=47) OR Zerror:(pos=48) OR Zcode:(pos=49) OR direct3d:(pos=50) OR 9:(pos=51) OR Ztest:(pos=52) OR Zresult:(pos=53) OR failure:(pos=54) OR Zat:(pos=55) OR Zstep:(pos=56) OR 32:(pos=57) OR user:(pos=58) OR Zverif:(pos=59) OR Zof:(pos=60) OR direct3d:(pos=61) OR Zrender:(pos=62) OR hresult:(pos=63) OR 0x00000000:(pos=64) OR Zerror:(pos=65) OR Zcode:(pos=66))" },
00257 { "Thermaltake Aquarius II waterkoeling (kompleet voor P4 en XP)", "(thermaltake:(pos=1) OR aquarius:(pos=2) OR ii:(pos=3) OR Zwaterkoel:(pos=4) OR Zkompleet:(pos=5) OR Zvoor:(pos=6) OR p4:(pos=7) OR Zen:(pos=8) OR xp:(pos=9))" },
00258 { "E3501 unable to add job to database (EC=-2005)", "(e3501:(pos=1) OR Zunabl:(pos=2) OR Zto:(pos=3) OR Zadd:(pos=4) OR Zjob:(pos=5) OR Zto:(pos=6) OR Zdatabas:(pos=7) OR ec:(pos=8) OR 2005:(pos=9))" },
00259 { "\"arp -s\" ip veranderen", "((arp:(pos=1) PHRASE 2 s:(pos=2)) OR Zip:(pos=3) OR Zveranderen:(pos=4))" },
00260 { "header(\"content-type: application/octet-stream\");", "(header:(pos=1) OR (content:(pos=2) PHRASE 2 type:(pos=3)) OR (application:(pos=4) PHRASE 3 octet:(pos=5) PHRASE 3 stream:(pos=6)))" },
00261 { "$datum = date(\"d-m-Y\");", "(Zdatum:(pos=1) OR date:(pos=2) OR (d:(pos=3) PHRASE 3 m:(pos=4) PHRASE 3 y:(pos=5)))" },
00262 { "\"'\" +asp", "Zasp:(pos=1)" },
00263 { "+session +[", "Zsession:(pos=1)" },
00264 { "Dit apparaat kan niet starten. (Code 10)", "(dit:(pos=1) OR Zapparaat:(pos=2) OR Zkan:(pos=3) OR Zniet:(pos=4) OR Zstarten:(pos=5) OR code:(pos=6) OR 10:(pos=7))" },
00265 { "\"You cannot use the Administration program while the Domino Server is running. Either shut down the Domino Server (but keep the file server running) or choose the ican labeled 'Lotus Notes' instead.\"", "(you:(pos=1) PHRASE 32 cannot:(pos=2) PHRASE 32 use:(pos=3) PHRASE 32 the:(pos=4) PHRASE 32 administration:(pos=5) PHRASE 32 program:(pos=6) PHRASE 32 while:(pos=7) PHRASE 32 the:(pos=8) PHRASE 32 domino:(pos=9) PHRASE 32 server:(pos=10) PHRASE 32 is:(pos=11) PHRASE 32 running:(pos=12) PHRASE 32 either:(pos=13) PHRASE 32 shut:(pos=14) PHRASE 32 down:(pos=15) PHRASE 32 the:(pos=16) PHRASE 32 domino:(pos=17) PHRASE 32 server:(pos=18) PHRASE 32 but:(pos=19) PHRASE 32 keep:(pos=20) PHRASE 32 the:(pos=21) PHRASE 32 file:(pos=22) PHRASE 32 server:(pos=23) PHRASE 32 running:(pos=24) PHRASE 32 or:(pos=25) PHRASE 32 choose:(pos=26) PHRASE 32 the:(pos=27) PHRASE 32 ican:(pos=28) PHRASE 32 labeled:(pos=29) PHRASE 32 lotus:(pos=30) PHRASE 32 notes:(pos=31) PHRASE 32 instead:(pos=32))" },
00266 { "\"+irq +veranderen +xp\"", "(irq:(pos=1) PHRASE 3 veranderen:(pos=2) PHRASE 3 xp:(pos=3))" },
00267 { "\"is not a member of 'operator``global namespace''' + c++", "(is:(pos=1) PHRASE 9 not:(pos=2) PHRASE 9 a:(pos=3) PHRASE 9 member:(pos=4) PHRASE 9 of:(pos=5) PHRASE 9 operator:(pos=6) PHRASE 9 global:(pos=7) PHRASE 9 namespace:(pos=8) PHRASE 9 c++:(pos=9))" },
00268 { "mkdir() failed (File exists) php", "(mkdir:(pos=1) OR Zfail:(pos=2) OR file:(pos=3) OR Zexist:(pos=4) OR Zphp:(pos=5))" },
00269 { "laatsteIndex(int n)", "(laatsteindex:(pos=1) OR Zint:(pos=2) OR Zn:(pos=3))" },
00270 { "\"line+in\" OR \"c8783\"", "((line:(pos=1) PHRASE 2 in:(pos=2)) OR c8783:(pos=3))" },
00271 { "if ($_POST['Submit'])", "(Zif:(pos=1) OR _post:(pos=2) OR submit:(pos=3))" },
00272 { "NEC DVD+-RW ND-1300A", "(nec:(pos=1) OR (dvd+:(pos=2) PHRASE 2 rw:(pos=3)) OR (nd:(pos=4) PHRASE 2 1300a:(pos=5)))" },
00273 { "*String not found* (*String not found*.)", "(string:(pos=1) OR Znot:(pos=2) OR found:(pos=3) OR string:(pos=4) OR Znot:(pos=5) OR found:(pos=6))" },
00274 { "MSI G4Ti4200-TD 128MB (GeForce4 Ti4200)", "(msi:(pos=1) OR (g4ti4200:(pos=2) PHRASE 2 td:(pos=3)) OR 128mb:(pos=4) OR geforce4:(pos=5) OR ti4200:(pos=6))" },
00275 { "href=\"#\"", "href:(pos=1)" },
00276 { "Request.ServerVariables(\"REMOTE_USER\") javascript", "((request:(pos=1) PHRASE 2 servervariables:(pos=2)) OR remote_user:(pos=3) OR Zjavascript:(pos=4))" },
00277 { "XF86Config(-4) waar", "(xf86config:(pos=1) OR 4:(pos=2) OR Zwaar:(pos=3))" },
00278 { "Unknown (tag 2000)", "(unknown:(pos=1) OR Ztag:(pos=2) OR 2000:(pos=3))" },
00279 { "KT4V(MS-6712)", "(kt4v:(pos=1) OR (ms:(pos=2) PHRASE 2 6712:(pos=3)))" },
00280 { "scheduled+AND+nieuwsgroepen+AND+updaten", "(Zschedul:(pos=1) AND Znieuwsgroepen:(pos=2) AND Zupdaten:(pos=3))" },
00281 { "137(netbios-ns)", "(137:(pos=1) OR (netbios:(pos=2) PHRASE 2 ns:(pos=3)))" },
00282 { "HARWARE ERROR, TRACKING SERVO (4:0X09:0X01)", "(harware:(pos=1) OR error:(pos=2) OR tracking:(pos=3) OR servo:(pos=4) OR (4:(pos=5) PHRASE 3 0x09:(pos=6) PHRASE 3 0x01:(pos=7)))" },
00283 { "Chr(10) wat is code van \" teken", "(chr:(pos=1) OR 10:(pos=2) OR Zwat:(pos=3) OR Zis:(pos=4) OR Zcode:(pos=5) OR Zvan:(pos=6) OR Zteken:(pos=7))" },
00284 { "wat is code van \" teken", "(Zwat:(pos=1) OR Zis:(pos=2) OR Zcode:(pos=3) OR Zvan:(pos=4) OR teken:(pos=5))" },
00285 { "The Jet VBA file (VBAJET.dll for 16-bit version, VBAJET32.dll version", "(the:(pos=1) OR jet:(pos=2) OR vba:(pos=3) OR Zfile:(pos=4) OR (vbajet:(pos=5) PHRASE 2 dll:(pos=6)) OR Zfor:(pos=7) OR (16:(pos=8) PHRASE 2 bit:(pos=9)) OR Zversion:(pos=10) OR (vbajet32:(pos=11) PHRASE 2 dll:(pos=12)) OR Zversion:(pos=13))" },
00286 { "Permission denied (publickey,password,keyboard-interactive).", "(permission:(pos=1) OR Zdeni:(pos=2) OR Zpublickey:(pos=3) OR Zpassword:(pos=4) OR (keyboard:(pos=5) PHRASE 2 interactive:(pos=6)))" },
00287 { "De lees- of schrijfbewerking (\"written\") op het geheugen is mislukt", "(de:(pos=1) OR Zlee:(pos=2) OR Zof:(pos=3) OR Zschrijfbewerk:(pos=4) OR written:(pos=5) OR Zop:(pos=6) OR Zhet:(pos=7) OR Zgeheugen:(pos=8) OR Zis:(pos=9) OR Zmislukt:(pos=10))" },
00288 { "Primary IDE channel no 80 conductor cable installed\"", "(primary:(pos=1) OR ide:(pos=2) OR Zchannel:(pos=3) OR Zno:(pos=4) OR 80:(pos=5) OR Zconductor:(pos=6) OR Zcabl:(pos=7) OR installed:(pos=8))" },
00289 { "\"2020 NEAR zoom\"", "(2020:(pos=1) PHRASE 3 near:(pos=2) PHRASE 3 zoom:(pos=3))" },
00290 { "setcookie(\"naam\",\"$user\");", "(setcookie:(pos=1) OR naam:(pos=2) OR user:(pos=3))" },
00291 { "MSI 645 Ultra (MS-6547) Ver1", "(msi:(pos=1) OR 645:(pos=2) OR ultra:(pos=3) OR (ms:(pos=4) PHRASE 2 6547:(pos=5)) OR ver1:(pos=6))" },
00292 { "if ($HTTP", "(Zif:(pos=1) OR http:(pos=2))" },
00293 { "data error(cyclic redundancy check)", "(Zdata:(pos=1) OR error:(pos=2) OR Zcyclic:(pos=3) OR Zredund:(pos=4) OR Zcheck:(pos=5))" },
00294 { "UObject::StaticAllocateObject <- (NULL None) <- UObject::StaticConstructObject <- InitEngine", "((uobject:(pos=1) PHRASE 2 staticallocateobject:(pos=2)) OR null:(pos=3) OR none:(pos=4) OR (uobject:(pos=5) PHRASE 2 staticconstructobject:(pos=6)) OR initengine:(pos=7))" },
00295 { "Failure at step 8 (Creating 3D Device)", "(failure:(pos=1) OR Zat:(pos=2) OR Zstep:(pos=3) OR 8:(pos=4) OR creating:(pos=5) OR 3d:(pos=6) OR device:(pos=7))" },
00296 { "Call Shell(\"notepad.exe\",", "(call:(pos=1) OR shell:(pos=2) OR (notepad:(pos=3) PHRASE 2 exe:(pos=4)))" },
00297 { "2.5\" harddisk converter", "(2.5:(pos=1) OR (harddisk:(pos=2) PHRASE 2 converter:(pos=3)))" },
00298 { "creative labs \"dvd+rw\"", "(Zcreativ:(pos=1) OR Zlab:(pos=2) OR (dvd:(pos=3) PHRASE 2 rw:(pos=4)))" },
00299 { "\"het beleid van deze computer staat u niet toe interactief", "(het:(pos=1) PHRASE 10 beleid:(pos=2) PHRASE 10 van:(pos=3) PHRASE 10 deze:(pos=4) PHRASE 10 computer:(pos=5) PHRASE 10 staat:(pos=6) PHRASE 10 u:(pos=7) PHRASE 10 niet:(pos=8) PHRASE 10 toe:(pos=9) PHRASE 10 interactief:(pos=10))" },
00300 { "ati radeon \"driver cleaner", "(Zati:(pos=1) OR Zradeon:(pos=2) OR (driver:(pos=3) PHRASE 2 cleaner:(pos=4)))" },
00301 { "\"../\" path", "Zpath:(pos=1)" },
00302 { "(novell client) workstation only", "(Znovel:(pos=1) OR Zclient:(pos=2) OR Zworkstat:(pos=3) OR Zonli:(pos=4))" },
00303 { "Unable to find libgd.(a|so) anywhere", "(unable:(pos=1) OR Zto:(pos=2) OR Zfind:(pos=3) OR Zlibgd:(pos=4) OR Za:(pos=5) OR Zso:(pos=6) OR Zanywher:(pos=7))" },
00304 { "\"libstdc++-libc6.1-1.so.2\"", "(libstdc++:(pos=1) PHRASE 5 libc6.1:(pos=2) PHRASE 5 1:(pos=3) PHRASE 5 so:(pos=4) PHRASE 5 2:(pos=5))" },
00305 { "ipsec_setup (/etc/ipsec.conf, line 1) cannot open configuration file \"/etc/ipsec.conf\" -- `' aborted", "(Zipsec_setup:(pos=1) OR (etc:(pos=2) PHRASE 3 ipsec:(pos=3) PHRASE 3 conf:(pos=4)) OR Zline:(pos=5) OR 1:(pos=6) OR Zcannot:(pos=7) OR Zopen:(pos=8) OR Zconfigur:(pos=9) OR Zfile:(pos=10) OR (etc:(pos=11) PHRASE 3 ipsec:(pos=12) PHRASE 3 conf:(pos=13)) OR Zabort:(pos=14))" },
00306 { "Forwarden van domeinnaam (naar HTTP adres)", "(forwarden:(pos=1) OR Zvan:(pos=2) OR Zdomeinnaam:(pos=3) OR Znaar:(pos=4) OR http:(pos=5) OR Zadr:(pos=6))" },
00307 { "Compaq HP, 146.8 GB (MPN-286716-B22) Hard Drives", "(compaq:(pos=1) OR hp:(pos=2) OR 146.8:(pos=3) OR gb:(pos=4) OR (mpn:(pos=5) PHRASE 3 286716:(pos=6) PHRASE 3 b22:(pos=7)) OR hard:(pos=8) OR drives:(pos=9))" },
00308 { "httpd (no pid file) not running", "(Zhttpd:(pos=1) OR Zno:(pos=2) OR Zpid:(pos=3) OR Zfile:(pos=4) OR Znot:(pos=5) OR Zrun:(pos=6))" },
00309 { "apache httpd (pid file) not running", "(Zapach:(pos=1) OR Zhttpd:(pos=2) OR Zpid:(pos=3) OR Zfile:(pos=4) OR Znot:(pos=5) OR Zrun:(pos=6))" },
00310 { "Klasse is niet geregistreerd (Fout=80040154).", "(klasse:(pos=1) OR Zis:(pos=2) OR Zniet:(pos=3) OR Zgeregistreerd:(pos=4) OR fout:(pos=5) OR 80040154:(pos=6))" },
00311 { "\"dvd+r\" \"dvd-r\"", "((dvd:(pos=1) PHRASE 2 r:(pos=2)) OR (dvd:(pos=3) PHRASE 2 r:(pos=4)))" },
00312 { "\"=\" tekens uit csvfile", "(Zteken:(pos=1) OR Zuit:(pos=2) OR Zcsvfile:(pos=3))" },
00313 { "libc.so.6(GLIBC_2.3)", "((libc:(pos=1) PHRASE 3 so:(pos=2) PHRASE 3 6:(pos=3)) OR glibc_2.3:(pos=4))" },
00314 { "Sitecom Broadband xDSL / Cable Router 4S (DC-202)", "(sitecom:(pos=1) OR broadband:(pos=2) OR Zxdsl:(pos=3) OR cable:(pos=4) OR router:(pos=5) OR 4s:(pos=6) OR (dc:(pos=7) PHRASE 2 202:(pos=8)))" },
00315 { "(t-mobile) bereik", "((t:(pos=1) PHRASE 2 mobile:(pos=2)) OR Zbereik:(pos=3))" },
00316 { "error LNK2001: unresolved external symbol \"public", "(Zerror:(pos=1) OR lnk2001:(pos=2) OR Zunresolv:(pos=3) OR Zextern:(pos=4) OR Zsymbol:(pos=5) OR public:(pos=6))" },
00317 { "patch linux exploit -p)", "(Zpatch:(pos=1) OR Zlinux:(pos=2) OR Zexploit:(pos=3) OR Zp:(pos=4))" },
00318 { "MYD not found (Errcode: 2)", "(myd:(pos=1) OR Znot:(pos=2) OR Zfound:(pos=3) OR errcode:(pos=4) OR 2:(pos=5))" },
00319 { "ob_start(\"ob_gzhandler\"); file download", "(ob_start:(pos=1) OR ob_gzhandler:(pos=2) OR Zfile:(pos=3) OR Zdownload:(pos=4))" },
00320 { "ECS Elitegroup K7VZA (VIA VT8363/VT8363A)", "(ecs:(pos=1) OR elitegroup:(pos=2) OR k7vza:(pos=3) OR via:(pos=4) OR (vt8363:(pos=5) PHRASE 2 vt8363a:(pos=6)))" },
00321 { "ASUS A7V8X (LAN + Serial-ATA + Firewire + Raid + Audio)", "(asus:(pos=1) OR a7v8x:(pos=2) OR lan:(pos=3) OR (serial:(pos=4) PHRASE 2 ata:(pos=5)) OR firewire:(pos=6) OR raid:(pos=7) OR audio:(pos=8))" },
00322 { "Javascript:history.go(-1)", "((javascript:(pos=1) PHRASE 3 history:(pos=2) PHRASE 3 go:(pos=3)) OR 1:(pos=4))" },
00323 { "java :) als icon", "(Zjava:(pos=1) OR Zal:(pos=2) OR Zicon:(pos=3))" },
00324 { "onmouseover=setPointer(this", "(onmouseover:(pos=1) OR setpointer:(pos=2) OR Zthis:(pos=3))" },
00325 { "\" in vbscript", "(in:(pos=1) PHRASE 2 vbscript:(pos=2))" },
00326 { "IRC (FAQ OR (hulp NEAR bij))", "(irc:(pos=1) OR faq:(pos=2) OR (hulp:(pos=3) NEAR 11 bij:(pos=4)))" },
00327 { "setProperty(\"McSquare\"+i, _xscale, _xscale++);", "(setproperty:(pos=1) OR mcsquare:(pos=2) OR Zi:(pos=3) OR _xscale:(pos=4) OR _xscale++:(pos=5))" },
00328 { "[warn] Apache does not support line-end comments. Consider using quotes around argument: \"#-1\"", "(Zwarn:(pos=1) OR apache:(pos=2) OR Zdoe:(pos=3) OR Znot:(pos=4) OR Zsupport:(pos=5) OR (line:(pos=6) PHRASE 2 end:(pos=7)) OR Zcomment:(pos=8) OR consider:(pos=9) OR Zuse:(pos=10) OR Zquot:(pos=11) OR Zaround:(pos=12) OR Zargument:(pos=13) OR 1:(pos=14))" },
00329 { "(php.ini) (memory_limit)", "((php:(pos=1) PHRASE 2 ini:(pos=2)) OR Zmemory_limit:(pos=3))" },
00330 { "line 8: syntax error near unexpected token `kernel_thread(f'", "(Zline:(pos=1) OR 8:(pos=2) OR Zsyntax:(pos=3) OR Zerror:(pos=4) OR Znear:(pos=5) OR Zunexpect:(pos=6) OR Ztoken:(pos=7) OR kernel_thread:(pos=8) OR Zf:(pos=9))" },
00331 { "VXD NAVEX()@)", "(vxd:(pos=1) OR navex:(pos=2))" },
00332 { "\"Iiyama AS4314UT 17\" \"", "(iiyama:(pos=1) PHRASE 3 as4314ut:(pos=2) PHRASE 3 17:(pos=3))" },
00333 { "include (\"$id.html\");", "(Zinclud:(pos=1) OR (id:(pos=2) PHRASE 2 html:(pos=3)))" },
00334 { "include id.Today's date is: <? print (date (\"M d, Y\")); ?>hp", "(Zinclud:(pos=1) OR (id:(pos=2) PHRASE 2 today's:(pos=3)) OR Zdate:(pos=4) OR Zis:(pos=5) OR Zprint:(pos=6) OR Zdate:(pos=7) OR (m:(pos=8) PHRASE 3 d:(pos=9) PHRASE 3 y:(pos=10)) OR Zhp:(pos=11))" },
00335 { "(program files\\common) opstarten", "(Zprogram:(pos=1) OR (files:(pos=2) PHRASE 2 common:(pos=3)) OR Zopstarten:(pos=4))" },
00336 { "java \" string", "(Zjava:(pos=1) OR string:(pos=2))" },
00337 { "+=", "" },
00338 { "php +=", "Zphp:(pos=1)" },
00339 { "[php] ereg_replace(\".\"", "(Zphp:(pos=1) OR ereg_replace:(pos=2))" },
00340 { "\"echo -e\" kleur", "((echo:(pos=1) PHRASE 2 e:(pos=2)) OR Zkleur:(pos=3))" },
00341 { "adobe premiere \"-1\"", "(Zadob:(pos=1) OR Zpremier:(pos=2) OR 1:(pos=3))" },
00342 { "DVD brander \"+\" en \"-\"", "(dvd:(pos=1) OR Zbrander:(pos=2) OR Zen:(pos=3))" },
00343 { "inspirion \"dvd+R\"", "(Zinspirion:(pos=1) OR (dvd:(pos=2) PHRASE 2 r:(pos=3)))" },
00344 { "asp 0x80040E14)", "(Zasp:(pos=1) OR 0x80040e14:(pos=2))" },
00345 { "\"e-tech motorola router", "(e:(pos=1) PHRASE 4 tech:(pos=2) PHRASE 4 motorola:(pos=3) PHRASE 4 router:(pos=4))" },
00346 { "bluetooth '1.3.2.19\"", "(Zbluetooth:(pos=1) OR 1.3.2.19:(pos=2))" },
00347 { "ms +-connect", "(Zms:(pos=1) OR Zconnect:(pos=2))" },
00348 { "php+print+\"", "(Zphp:(pos=1) OR print+:(pos=2))" },
00349 { "athlon 1400 :welke videokaart\"", "(Zathlon:(pos=1) OR 1400:(pos=2) OR Zwelk:(pos=3) OR videokaart:(pos=4))" },
00350 { "+-dvd", "Zdvd:(pos=1)" },
00351 { "glftpd \"-new-\"", "(Zglftpd:(pos=1) OR new:(pos=2))" },
00352 { "\"scandisk + dos5.0", "(scandisk:(pos=1) PHRASE 2 dos5.0:(pos=2))" },
00353 { "socket\\(\\)", "socket:(pos=1)" },
00354 { "msn (e-tech) router", "(Zmsn:(pos=1) OR (e:(pos=2) PHRASE 2 tech:(pos=3)) OR Zrouter:(pos=4))" },
00355 { "Het grote Epox 8k3a+ ervaring/prob topic\"", "(het:(pos=1) OR Zgrote:(pos=2) OR epox:(pos=3) OR 8k3a+:(pos=4) OR (ervaring:(pos=5) PHRASE 2 prob:(pos=6)) OR topic:(pos=7))" },
00356 { "\"CF+bluetooth\"", "(cf:(pos=1) PHRASE 2 bluetooth:(pos=2))" },
00357 { "kwaliteit (s-video) composite verschil tv out", "(Zkwaliteit:(pos=1) OR (s:(pos=2) PHRASE 2 video:(pos=3)) OR Zcomposit:(pos=4) OR Zverschil:(pos=5) OR Ztv:(pos=6) OR Zout:(pos=7))" },
00358 { "Wie kan deze oude hardware nog gebruiken\" Deel", "(wie:(pos=1) OR Zkan:(pos=2) OR Zdeze:(pos=3) OR Zoud:(pos=4) OR Zhardwar:(pos=5) OR Znog:(pos=6) OR gebruiken:(pos=7) OR deel:(pos=8))" },
00359 { "Public Declare Sub Sleep Lib \"kernel32\" (ByVal dwMilliseconds As Long)", "(public:(pos=1) OR declare:(pos=2) OR sub:(pos=3) OR sleep:(pos=4) OR lib:(pos=5) OR kernel32:(pos=6) OR byval:(pos=7) OR Zdwmillisecond:(pos=8) OR as:(pos=9) OR long:(pos=10))" },
00360 { "for inclusion (include_path='.:/usr/share/php')", "(Zfor:(pos=1) OR Zinclus:(pos=2) OR include_path:(pos=3) OR (usr:(pos=4) PHRASE 3 share:(pos=5) PHRASE 3 php:(pos=6)))" },
00361 { "\"muziek 2x zo snel\"\"", "(muziek:(pos=1) PHRASE 4 2x:(pos=2) PHRASE 4 zo:(pos=3) PHRASE 4 snel:(pos=4))" },
00362 { "execCommand('inserthorizontalrule'", "(execcommand:(pos=1) OR Zinserthorizontalrul:(pos=2))" },
00363 { "specs: IBM PS/2, Intel 8086 @ 25 mhz!!, 2 mb intern, 50 mb hd, 5.5\" floppy drive, toetsenbord en geen muis", "(Zspec:(pos=1) OR ibm:(pos=2) OR (ps:(pos=3) PHRASE 2 2:(pos=4)) OR intel:(pos=5) OR 8086:(pos=6) OR 25:(pos=7) OR Zmhz:(pos=8) OR 2:(pos=9) OR Zmb:(pos=10) OR Zintern:(pos=11) OR 50:(pos=12) OR Zmb:(pos=13) OR Zhd:(pos=14) OR 5.5:(pos=15) OR (floppy:(pos=16) PHRASE 6 drive:(pos=17) PHRASE 6 toetsenbord:(pos=18) PHRASE 6 en:(pos=19) PHRASE 6 geen:(pos=20) PHRASE 6 muis:(pos=21)))" },
00364 { "History: GetEventTool <- GetMusicManager <- GetMusicScript <- DMCallRoutine <- AMusicScriptEvent::execCallRoutine <- UObject::execClassContext <- (U2GameInfo M08A1.U2GameInfo0 @ Function U2.U2GameInfo.NotifyLevelChangeEnd : 0075 line 744) <- UObject::ProcessEvent <- (U2GameInfo M08A1.U2GameInfo0, Function U2.U2GameInfo.NotifyLevelChangeEnd) <- UGameEngine::LoadMap <- LocalMapURL <- UGameEngine::Browse <- ServerTravel <- UGameEngine::Tick <- UpdateWorld <- MainLoop", "(history:(pos=1) OR geteventtool:(pos=2) OR getmusicmanager:(pos=3) OR getmusicscript:(pos=4) OR dmcallroutine:(pos=5) OR (amusicscriptevent:(pos=6) PHRASE 2 execcallroutine:(pos=7)) OR (uobject:(pos=8) PHRASE 2 execclasscontext:(pos=9)) OR u2gameinfo:(pos=10) OR (m08a1:(pos=11) PHRASE 2 u2gameinfo0:(pos=12)) OR function:(pos=13) OR (u2:(pos=14) PHRASE 3 u2gameinfo:(pos=15) PHRASE 3 notifylevelchangeend:(pos=16)) OR 0075:(pos=17) OR Zline:(pos=18) OR 744:(pos=19) OR (uobject:(pos=20) PHRASE 2 processevent:(pos=21)) OR u2gameinfo:(pos=22) OR (m08a1:(pos=23) PHRASE 2 u2gameinfo0:(pos=24)) OR function:(pos=25) OR (u2:(pos=26) PHRASE 3 u2gameinfo:(pos=27) PHRASE 3 notifylevelchangeend:(pos=28)) OR (ugameengine:(pos=29) PHRASE 2 loadmap:(pos=30)) OR localmapurl:(pos=31) OR (ugameengine:(pos=32) PHRASE 2 browse:(pos=33)) OR servertravel:(pos=34) OR (ugameengine:(pos=35) PHRASE 2 tick:(pos=36)) OR updateworld:(pos=37) OR mainloop:(pos=38))" },
00365 { "Support AMD XP 2400+ & 2600+ (K7T Turbo2 only)", "(support:(pos=1) OR amd:(pos=2) OR xp:(pos=3) OR 2400+:(pos=4) OR 2600+:(pos=5) OR k7t:(pos=6) OR turbo2:(pos=7) OR Zonli:(pos=8))" },
00366 { "'\"><br>bla</br>", "(br:(pos=1) PHRASE 3 bla:(pos=2) PHRASE 3 br:(pos=3))" },
00367 { "The instruction at \"0x30053409\" referenced memory at \"0x06460504\". The memory could not be \"read'. Click OK to terminate the application.", "(the:(pos=1) OR Zinstruct:(pos=2) OR Zat:(pos=3) OR 0x30053409:(pos=4) OR Zreferenc:(pos=5) OR Zmemori:(pos=6) OR Zat:(pos=7) OR 0x06460504:(pos=8) OR the:(pos=9) OR Zmemori:(pos=10) OR Zcould:(pos=11) OR Znot:(pos=12) OR Zbe:(pos=13) OR (read:(pos=14) PHRASE 7 click:(pos=15) PHRASE 7 ok:(pos=16) PHRASE 7 to:(pos=17) PHRASE 7 terminate:(pos=18) PHRASE 7 the:(pos=19) PHRASE 7 application:(pos=20)))" },
00368 { "\"(P5A-b)\"", "(p5a:(pos=1) PHRASE 2 b:(pos=2))" },
00369 { "(13,5 > 13) == no-go!", "(13,5:(pos=1) OR 13:(pos=2) OR (no:(pos=3) PHRASE 2 go:(pos=4)))" },
00370 { "eth not found \"ifconfig -a\"", "(Zeth:(pos=1) OR Znot:(pos=2) OR Zfound:(pos=3) OR (ifconfig:(pos=4) PHRASE 2 a:(pos=5)))" },
00371 { "<META NAME=\"ROBOTS", "(meta:(pos=1) OR name:(pos=2) OR robots:(pos=3))" },
00372 { "lp0: using parport0 (interrupt-driven)", "(Zlp0:(pos=1) OR Zuse:(pos=2) OR Zparport0:(pos=3) OR (interrupt:(pos=4) PHRASE 2 driven:(pos=5)))" },
00373 { "ULTRA PC-TUNING, COOLING & MODDING (4,6)", "(ultra:(pos=1) OR (pc:(pos=2) PHRASE 2 tuning:(pos=3)) OR cooling:(pos=4) OR modding:(pos=5) OR 4,6:(pos=6))" },
00374 { "512MB PC2700 DDR SDRAM Rood (Dane-Elec)", "(512mb:(pos=1) OR pc2700:(pos=2) OR ddr:(pos=3) OR sdram:(pos=4) OR rood:(pos=5) OR (dane:(pos=6) PHRASE 2 elec:(pos=7)))" },
00375 { "header(\"Content Type: text/html\");", "(header:(pos=1) OR content:(pos=2) OR type:(pos=3) OR (text:(pos=4) PHRASE 2 html:(pos=5)))" },
00376 { "\"-RW\" \"+RW\"", "(rw:(pos=1) OR rw:(pos=2))" },
00377 { "\"cresta digital answering machine", "(cresta:(pos=1) PHRASE 4 digital:(pos=2) PHRASE 4 answering:(pos=3) PHRASE 4 machine:(pos=4))" },
00378 { "Arctic Super Silent PRO TC (Athlon/P3 - 2,3 GHz)", "(arctic:(pos=1) OR super:(pos=2) OR silent:(pos=3) OR pro:(pos=4) OR tc:(pos=5) OR (athlon:(pos=6) PHRASE 2 p3:(pos=7)) OR 2,3:(pos=8) OR ghz:(pos=9))" },
00379 { "c++ fopen \"r+t\"", "(Zc++:(pos=1) OR Zfopen:(pos=2) OR (r:(pos=3) PHRASE 2 t:(pos=4)))" },
00380 { "c++ fopen (r+t)", "(Zc++:(pos=1) OR Zfopen:(pos=2) OR Zr:(pos=3) OR Zt:(pos=4))" },
00381 { "\"DVD+R\"", "(dvd:(pos=1) PHRASE 2 r:(pos=2))" },
00382 { "Class.forName(\"jdbc.odbc.JdbcOdbcDriver\");", "((class:(pos=1) PHRASE 2 forname:(pos=2)) OR (jdbc:(pos=3) PHRASE 3 odbc:(pos=4) PHRASE 3 jdbcodbcdriver:(pos=5)))" },
00383 { "perl(find.pl)", "(perl:(pos=1) OR (find:(pos=2) PHRASE 2 pl:(pos=3)))" },
00384 { "\"-5v\" voeding", "(5v:(pos=1) OR Zvoed:(pos=2))" },
00385 { "\"-5v\" power supply", "(5v:(pos=1) OR Zpower:(pos=2) OR Zsuppli:(pos=3))" },
00386 { "An Error occurred whie attempting to initialize the Borland Database Engine (error $2108)", "(an:(pos=1) OR error:(pos=2) OR Zoccur:(pos=3) OR Zwhie:(pos=4) OR Zattempt:(pos=5) OR Zto:(pos=6) OR Ziniti:(pos=7) OR Zthe:(pos=8) OR borland:(pos=9) OR database:(pos=10) OR engine:(pos=11) OR Zerror:(pos=12) OR 2108:(pos=13))" },
00387 { "(error $2108) Borland", "(Zerror:(pos=1) OR 2108:(pos=2) OR borland:(pos=3))" },
00388 { "On Friday 04 April 2003 09:32, Edwin van Eersel wrote: > ik voel me eigenlijk wel behoorlijk kut :)", "(on:(pos=1) OR friday:(pos=2) OR 04:(pos=3) OR april:(pos=4) OR 2003:(pos=5) OR (09:(pos=6) PHRASE 2 32:(pos=7)) OR edwin:(pos=8) OR Zvan:(pos=9) OR eersel:(pos=10) OR Zwrote:(pos=11) OR Zik:(pos=12) OR Zvoel:(pos=13) OR Zme:(pos=14) OR Zeigenlijk:(pos=15) OR Zwel:(pos=16) OR Zbehoorlijk:(pos=17) OR Zkut:(pos=18))" },
00389 { "Elektrotechniek + \"hoe bevalt het?\"\"", "(elektrotechniek:(pos=1) OR (hoe:(pos=2) PHRASE 3 bevalt:(pos=3) PHRASE 3 het:(pos=4)))" },
00390 { "Shortcuts in menu (java", "(shortcuts:(pos=1) OR Zin:(pos=2) OR Zmenu:(pos=3) OR Zjava:(pos=4))" },
00391 { "detonator+settings\"", "(Zdeton:(pos=1) OR settings:(pos=2))" },
00392 { "(ez-bios) convert", "((ez:(pos=1) PHRASE 2 bios:(pos=2)) OR Zconvert:(pos=3))" },
00393 { "Sparkle 7100M4 64MB (GeForce4 MX440)", "(sparkle:(pos=1) OR 7100m4:(pos=2) OR 64mb:(pos=3) OR geforce4:(pos=4) OR mx440:(pos=5))" },
00394 { "freebsd \"boek OR newbie\"", "(Zfreebsd:(pos=1) OR (boek:(pos=2) PHRASE 3 or:(pos=3) PHRASE 3 newbie:(pos=4)))" },
00395 { "for (;;) c++", "(Zfor:(pos=1) OR Zc++:(pos=2))" },
00396 { "1700+-2100+", "(1700+:(pos=1) PHRASE 2 2100+:(pos=2))" },
00397 { "PHP Warning: Invalid library (maybe not a PHP library) 'libmysqlclient.so'", "(php:(pos=1) OR warning:(pos=2) OR invalid:(pos=3) OR Zlibrari:(pos=4) OR Zmayb:(pos=5) OR Znot:(pos=6) OR Za:(pos=7) OR php:(pos=8) OR Zlibrari:(pos=9) OR (libmysqlclient:(pos=10) PHRASE 2 so:(pos=11)))" },
00398 { "NEC DV-5800B (Bul", "(nec:(pos=1) OR (dv:(pos=2) PHRASE 2 5800b:(pos=3)) OR bul:(pos=4))" },
00399 { "org.jdom.input.SAXBuilder.<init>(SAXBuilder.java)", "((org:(pos=1) PHRASE 4 jdom:(pos=2) PHRASE 4 input:(pos=3) PHRASE 4 saxbuilder:(pos=4)) OR init:(pos=5) OR (saxbuilder:(pos=6) PHRASE 2 java:(pos=7)))" },
00400 { "AMD Athlon XP 2500+ (1,83GHz, 512KB)", "(amd:(pos=1) OR athlon:(pos=2) OR xp:(pos=3) OR 2500+:(pos=4) OR 1,83ghz:(pos=5) OR 512kb:(pos=6))" },
00401 { "'q ben\"", "(Zq:(pos=1) OR ben:(pos=2))" },
00402 { "getsmbfilepwent: malformed password entry (uid not number)", "(Zgetsmbfilepw:(pos=1) OR Zmalform:(pos=2) OR Zpassword:(pos=3) OR Zentri:(pos=4) OR Zuid:(pos=5) OR Znot:(pos=6) OR Znumber:(pos=7))" },
00403 { "\xc3\xb6ude onderdelen\"", "(Z\xc3\xb6ude:(pos=1) OR onderdelen:(pos=2))" },
00404 { "Heeft iemand enig idee waarom de pioneer (zelf met originele firmware van pioneer) bij mij niet wil flashen ?" "?", "(heeft:(pos=1) OR Ziemand:(pos=2) OR Zenig:(pos=3) OR Zide:(pos=4) OR Zwaarom:(pos=5) OR Zde:(pos=6) OR Zpioneer:(pos=7) OR Zzelf:(pos=8) OR Zmet:(pos=9) OR Zoriginel:(pos=10) OR Zfirmwar:(pos=11) OR Zvan:(pos=12) OR Zpioneer:(pos=13) OR Zbij:(pos=14) OR Zmij:(pos=15) OR Zniet:(pos=16) OR Zwil:(pos=17) OR Zflashen:(pos=18))" },
00405 { "asus a7v266 bios nieuw -(a7v266-e)", "((Zasus:(pos=1) OR Za7v266:(pos=2) OR Zbio:(pos=3) OR Znieuw:(pos=4)) AND_NOT (a7v266:(pos=5) PHRASE 2 e:(pos=6)))" },
00406 { "cybercom \"dvd+r\"", "(Zcybercom:(pos=1) OR (dvd:(pos=2) PHRASE 2 r:(pos=3)))" },
00407 { "AMD PCNET Family Ethernet Adapter (PCI-ISA)", "(amd:(pos=1) OR pcnet:(pos=2) OR family:(pos=3) OR ethernet:(pos=4) OR adapter:(pos=5) OR (pci:(pos=6) PHRASE 2 isa:(pos=7)))" },
00408 { "relais +/-", "Zrelai:(pos=1)" },
00409 { "formules (slepen OR doortrekken) excel", "(Zformul:(pos=1) OR Zslepen:(pos=2) OR Zdoortrekken:(pos=3) OR Zexcel:(pos=4))" },
00410 { "\"%English", "english:(pos=1)" },
00411 { "select max( mysql", "(Zselect:(pos=1) OR max:(pos=2) OR Zmysql:(pos=3))" },
00412 { "leejow(saait", "(leejow:(pos=1) OR Zsaait:(pos=2))" },
00413 { "'Windows 2000 Advanced Server\" netwerkverbinding valt steeds weg", "(windows:(pos=1) OR 2000:(pos=2) OR advanced:(pos=3) OR server:(pos=4) OR (netwerkverbinding:(pos=5) PHRASE 4 valt:(pos=6) PHRASE 4 steeds:(pos=7) PHRASE 4 weg:(pos=8)))" },
00414 { "K7T Turbo 2 (MS-6330)", "(k7t:(pos=1) OR turbo:(pos=2) OR 2:(pos=3) OR (ms:(pos=4) PHRASE 2 6330:(pos=5)))" },
00415 { "failed to receive data from the client agent. (ec=1)", "(Zfail:(pos=1) OR Zto:(pos=2) OR Zreceiv:(pos=3) OR Zdata:(pos=4) OR Zfrom:(pos=5) OR Zthe:(pos=6) OR Zclient:(pos=7) OR Zagent:(pos=8) OR ec:(pos=9) OR 1:(pos=10))" },
00416 { "\"cannot find -lz\"", "(cannot:(pos=1) PHRASE 3 find:(pos=2) PHRASE 3 lz:(pos=3))" },
00417 { "undefined reference to `mysql_drop_db'\"", "(Zundefin:(pos=1) OR Zrefer:(pos=2) OR Zto:(pos=3) OR Zmysql_drop_db:(pos=4))" },
00418 { "search form asp \"%'", "(Zsearch:(pos=1) OR Zform:(pos=2) OR Zasp:(pos=3))" },
00419 { "(dvd+r) kwaliteit", "(Zdvd:(pos=1) OR Zr:(pos=2) OR Zkwaliteit:(pos=3))" },
00420 { "Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes)", "(fatal:(pos=1) OR Zerror:(pos=2) OR allowed:(pos=3) OR Zmemori:(pos=4) OR Zsize:(pos=5) OR Zof:(pos=6) OR 8388608:(pos=7) OR Zbyte:(pos=8) OR Zexhaust:(pos=9) OR Ztri:(pos=10) OR Zto:(pos=11) OR Zalloc:(pos=12) OR 35:(pos=13) OR Zbyte:(pos=14))" },
00421 { "geluid (schokt OR hapert)", "(Zgeluid:(pos=1) OR Zschokt:(pos=2) OR Zhapert:(pos=3))" },
00422 { "Het wordt pas echt leuk als het hard staat!! >:)", "(het:(pos=1) OR Zwordt:(pos=2) OR Zpas:(pos=3) OR Zecht:(pos=4) OR Zleuk:(pos=5) OR Zal:(pos=6) OR Zhet:(pos=7) OR Zhard:(pos=8) OR Zstaat:(pos=9))" },
00423 { "Uw configuratie bestand bevat instellingen (root zonder wachtwoord) die betrekking hebben tot de standaard MySQL account. Uw MySQL server draait met deze standaard waardes, en is open voor ongewilde toegang, het wordt dus aangeraden dit op te lossen", "(uw:(pos=1) OR Zconfigurati:(pos=2) OR Zbestand:(pos=3) OR Zbevat:(pos=4) OR Zinstellingen:(pos=5) OR Zroot:(pos=6) OR Zzonder:(pos=7) OR Zwachtwoord:(pos=8) OR Zdie:(pos=9) OR Zbetrekk:(pos=10) OR Zhebben:(pos=11) OR Ztot:(pos=12) OR Zde:(pos=13) OR Zstandaard:(pos=14) OR mysql:(pos=15) OR Zaccount:(pos=16) OR uw:(pos=17) OR mysql:(pos=18) OR Zserver:(pos=19) OR Zdraait:(pos=20) OR Zmet:(pos=21) OR Zdeze:(pos=22) OR Zstandaard:(pos=23) OR Zwaard:(pos=24) OR Zen:(pos=25) OR Zis:(pos=26) OR Zopen:(pos=27) OR Zvoor:(pos=28) OR Zongewild:(pos=29) OR Ztoegang:(pos=30) OR Zhet:(pos=31) OR Zwordt:(pos=32) OR Zdus:(pos=33) OR Zaangeraden:(pos=34) OR Zdit:(pos=35) OR Zop:(pos=36) OR Zte:(pos=37) OR Zlossen:(pos=38))" },
00424 { "(library qt-mt) not found", "(Zlibrari:(pos=1) OR (qt:(pos=2) PHRASE 2 mt:(pos=3)) OR Znot:(pos=4) OR Zfound:(pos=5))" },
00425 { "Qt (>= Qt 3.0.3) (library qt-mt) not found", "(qt:(pos=1) OR qt:(pos=2) OR 3.0.3:(pos=3) OR Zlibrari:(pos=4) OR (qt:(pos=5) PHRASE 2 mt:(pos=6)) OR Znot:(pos=7) OR Zfound:(pos=8))" },
00426 { "setup was unable to find (or could not read) the language specific setup resource dll, unable to continue. Please reboot and try again.", "(Zsetup:(pos=1) OR Zwas:(pos=2) OR Zunabl:(pos=3) OR Zto:(pos=4) OR Zfind:(pos=5) OR Zor:(pos=6) OR Zcould:(pos=7) OR Znot:(pos=8) OR Zread:(pos=9) OR Zthe:(pos=10) OR Zlanguag:(pos=11) OR Zspecif:(pos=12) OR Zsetup:(pos=13) OR Zresourc:(pos=14) OR Zdll:(pos=15) OR Zunabl:(pos=16) OR Zto:(pos=17) OR Zcontinu:(pos=18) OR please:(pos=19) OR Zreboot:(pos=20) OR Zand:(pos=21) OR Ztri:(pos=22) OR Zagain:(pos=23))" },
00427 { "Titan TTC-D5TB(4/CU35)", "(titan:(pos=1) OR (ttc:(pos=2) PHRASE 2 d5tb:(pos=3)) OR (4:(pos=4) PHRASE 2 cu35:(pos=5)))" },
00428 { "[php] date( min", "(Zphp:(pos=1) OR date:(pos=2) OR Zmin:(pos=3))" },
00429 { "EPOX EP-8RDA+ (nForce2 SPP+MCP-T) Rev. 1.1", "(epox:(pos=1) OR (ep:(pos=2) PHRASE 2 8rda+:(pos=3)) OR Znforce2:(pos=4) OR spp:(pos=5) OR (mcp:(pos=6) PHRASE 2 t:(pos=7)) OR rev:(pos=8) OR 1.1:(pos=9))" },
00430 { "554 5.4.6 Too many hops 53 (25 max)", "(554:(pos=1) OR 5.4.6:(pos=2) OR too:(pos=3) OR Zmani:(pos=4) OR Zhop:(pos=5) OR 53:(pos=6) OR 25:(pos=7) OR Zmax:(pos=8))" },
00431 { "ik had toch nog een vraagje: er zijn nu eigenlijk alleen maar schijfjes van 4.7GB alleen straks zullen er vast schijfjes van meer dan 4.7GB komen. Zal deze brander dit wel kunnen schijven?" "?(na bijvoorbeeld een firmware update?) ben erg benieuwd", "(Zik:(pos=1) OR Zhad:(pos=2) OR Ztoch:(pos=3) OR Znog:(pos=4) OR Zeen:(pos=5) OR Zvraagj:(pos=6) OR Zer:(pos=7) OR Zzijn:(pos=8) OR Znu:(pos=9) OR Zeigenlijk:(pos=10) OR Zalleen:(pos=11) OR Zmaar:(pos=12) OR Zschijfj:(pos=13) OR Zvan:(pos=14) OR 4.7gb:(pos=15) OR Zalleen:(pos=16) OR Zstrak:(pos=17) OR Zzullen:(pos=18) OR Zer:(pos=19) OR Zvast:(pos=20) OR Zschijfj:(pos=21) OR Zvan:(pos=22) OR Zmeer:(pos=23) OR Zdan:(pos=24) OR 4.7gb:(pos=25) OR Zkomen:(pos=26) OR zal:(pos=27) OR Zdeze:(pos=28) OR Zbrander:(pos=29) OR Zdit:(pos=30) OR Zwel:(pos=31) OR Zkunnen:(pos=32) OR Zschijven:(pos=33) OR Zna:(pos=34) OR Zbijvoorbeeld:(pos=35) OR Zeen:(pos=36) OR Zfirmwar:(pos=37) OR Zupdat:(pos=38) OR Zben:(pos=39) OR Zerg:(pos=40) OR Zbenieuwd:(pos=41))" },
00432 { "ati linux drivers (4.3.0)", "(Zati:(pos=1) OR Zlinux:(pos=2) OR Zdriver:(pos=3) OR 4.3.0:(pos=4))" },
00433 { "ENCAPSED_AND_WHITESPACE", "encapsed_and_whitespace:(pos=1)" },
00434 { "lpadmin: add-printer (set device) failed: client-error-not-possible", "(Zlpadmin:(pos=1) OR (add:(pos=2) PHRASE 2 printer:(pos=3)) OR Zset:(pos=4) OR Zdevic:(pos=5) OR Zfail:(pos=6) OR (client:(pos=7) PHRASE 4 error:(pos=8) PHRASE 4 not:(pos=9) PHRASE 4 possible:(pos=10)))" },
00435 { "welke dvd \"+r\" media", "(Zwelk:(pos=1) OR Zdvd:(pos=2) OR r:(pos=3) OR Zmedia:(pos=4))" },
00436 { "Warning: stat failed for fotos(errno=2 - No such file or directory)", "(warning:(pos=1) OR Zstat:(pos=2) OR Zfail:(pos=3) OR Zfor:(pos=4) OR fotos:(pos=5) OR errno:(pos=6) OR 2:(pos=7) OR no:(pos=8) OR Zsuch:(pos=9) OR Zfile:(pos=10) OR Zor:(pos=11) OR Zdirectori:(pos=12))" },
00437 { "dvd +/-", "Zdvd:(pos=1)" },
00438 { "7vaxp +voltage mod\"", "(Zvoltag:(pos=2) AND_MAYBE (7vaxp:(pos=1) OR mod:(pos=3)))" },
00439 { "lpt port (SPP/EPP) is enabled", "(Zlpt:(pos=1) OR Zport:(pos=2) OR (spp:(pos=3) PHRASE 2 epp:(pos=4)) OR Zis:(pos=5) OR Zenabl:(pos=6))" },
00440 { "getenv(\"HTTP_REFERER\")", "(getenv:(pos=1) OR http_referer:(pos=2))" },
00441 { "Error setting display mode: CreateDevice failed (D3DERR_DRIVERINTERNALERROR)", "(error:(pos=1) OR Zset:(pos=2) OR Zdisplay:(pos=3) OR Zmode:(pos=4) OR createdevice:(pos=5) OR Zfail:(pos=6) OR d3derr_driverinternalerror:(pos=7))" },
00442 { "Exception number: c0000005 (access violation)", "(exception:(pos=1) OR Znumber:(pos=2) OR Zc0000005:(pos=3) OR Zaccess:(pos=4) OR Zviolat:(pos=5))" },
00443 { "header(\"Content-type:application/octetstream\");", "(header:(pos=1) OR (content:(pos=2) PHRASE 4 type:(pos=3) PHRASE 4 application:(pos=4) PHRASE 4 octetstream:(pos=5)))" },
00444 { "java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.jdbc.odbc)", "((java:(pos=1) PHRASE 3 security:(pos=2) PHRASE 3 accesscontrolexception:(pos=3)) OR Zaccess:(pos=4) OR Zdeni:(pos=5) OR (java:(pos=6) PHRASE 3 lang:(pos=7) PHRASE 3 runtimepermission:(pos=8)) OR (accessclassinpackage:(pos=9) PHRASE 4 sun:(pos=10) PHRASE 4 jdbc:(pos=11) PHRASE 4 odbc:(pos=12)))" },
00445 { "(001.part.met", "(001:(pos=1) PHRASE 3 part:(pos=2) PHRASE 3 met:(pos=3))" },
00446 { "Warning: mail(): Use the -f option (5th param) to include valid reply-to address ! in /usr/home/vdb/www/mail.php on line 79", "(warning:(pos=1) OR mail:(pos=2) OR use:(pos=3) OR Zthe:(pos=4) OR Zf:(pos=5) OR Zoption:(pos=6) OR 5th:(pos=7) OR Zparam:(pos=8) OR Zto:(pos=9) OR Zinclud:(pos=10) OR Zvalid:(pos=11) OR (reply:(pos=12) PHRASE 2 to:(pos=13)) OR Zaddress:(pos=14) OR Zin:(pos=15) OR (usr:(pos=16) PHRASE 6 home:(pos=17) PHRASE 6 vdb:(pos=18) PHRASE 6 www:(pos=19) PHRASE 6 mail:(pos=20) PHRASE 6 php:(pos=21)) OR Zon:(pos=22) OR Zline:(pos=23) OR 79:(pos=24))" },
00447 { "PHP Use the -f option (5th param)", "((php:(pos=1) OR use:(pos=2) OR Zthe:(pos=3) OR Zoption:(pos=5) OR 5th:(pos=6) OR Zparam:(pos=7)) AND_NOT Zf:(pos=4))" },
00448 { "dvd \"+\" \"-\"", "Zdvd:(pos=1)" },
00449 { "bericht ( %)", "Zbericht:(pos=1)" },
00450 { "2500+ of 2600+ (niett OC)", "(2500+:(pos=1) OR Zof:(pos=2) OR 2600+:(pos=3) OR Zniett:(pos=4) OR oc:(pos=5))" },
00451 { "maxtor windows xp werkt The drivers for this device are not installed. (Code 28)", "(Zmaxtor:(pos=1) OR Zwindow:(pos=2) OR Zxp:(pos=3) OR Zwerkt:(pos=4) OR the:(pos=5) OR Zdriver:(pos=6) OR Zfor:(pos=7) OR Zthis:(pos=8) OR Zdevic:(pos=9) OR Zare:(pos=10) OR Znot:(pos=11) OR Zinstal:(pos=12) OR code:(pos=13) OR 28:(pos=14))" },
00452 { "Warning: stat failed for /mnt/web/react/got/react/board/non-www/headlines/tnet-headlines.txt (errno=2 - No such file or directory) in /mnt/web/react/got/react/global/non-www/templates/got/functions.inc.php on line 303", "(warning:(pos=1) OR Zstat:(pos=2) OR Zfail:(pos=3) OR Zfor:(pos=4) OR (mnt:(pos=5) PHRASE 12 web:(pos=6) PHRASE 12 react:(pos=7) PHRASE 12 got:(pos=8) PHRASE 12 react:(pos=9) PHRASE 12 board:(pos=10) PHRASE 12 non:(pos=11) PHRASE 12 www:(pos=12) PHRASE 12 headlines:(pos=13) PHRASE 12 tnet:(pos=14) PHRASE 12 headlines:(pos=15) PHRASE 12 txt:(pos=16)) OR errno:(pos=17) OR 2:(pos=18) OR no:(pos=19) OR Zsuch:(pos=20) OR Zfile:(pos=21) OR Zor:(pos=22) OR Zdirectori:(pos=23) OR Zin:(pos=24) OR (mnt:(pos=25) PHRASE 13 web:(pos=26) PHRASE 13 react:(pos=27) PHRASE 13 got:(pos=28) PHRASE 13 react:(pos=29) PHRASE 13 global:(pos=30) PHRASE 13 non:(pos=31) PHRASE 13 www:(pos=32) PHRASE 13 templates:(pos=33) PHRASE 13 got:(pos=34) PHRASE 13 functions:(pos=35) PHRASE 13 inc:(pos=36) PHRASE 13 php:(pos=37)) OR Zon:(pos=38) OR Zline:(pos=39) OR 303:(pos=40))" },
00453 { "apm: BIOS version 1.2 Flags 0x03 (Driver version 1.16)", "(Zapm:(pos=1) OR bios:(pos=2) OR Zversion:(pos=3) OR 1.2:(pos=4) OR flags:(pos=5) OR 0x03:(pos=6) OR driver:(pos=7) OR Zversion:(pos=8) OR 1.16:(pos=9))" },
00454 { "GA-8IHXP(3.0)", "((ga:(pos=1) PHRASE 2 8ihxp:(pos=2)) OR 3.0:(pos=3))" },
00455 { "8IHXP(3.0)", "(8ihxp:(pos=1) OR 3.0:(pos=2))" },
00456 { "na\xc2\xb7si (de ~ (m.))", "(Zna\xc2\xb7si:(pos=1) OR Zde:(pos=2) OR Zm:(pos=3))" },
00457 { "header(\"Content-Disposition: attachment;", "(header:(pos=1) OR (content:(pos=2) PHRASE 3 disposition:(pos=3) PHRASE 3 attachment:(pos=4)))" },
00458 { "\"header(\"Content-Disposition: attachment;\"", "(header:(pos=1) OR (content:(pos=2) PHRASE 2 disposition:(pos=3)) OR Zattach:(pos=4))" },
00459 { "\"Beep -f\"", "(beep:(pos=1) PHRASE 2 f:(pos=2))" },
00460 { "kraan NEAR (Elektrisch OR Electrisch)", "(Zkraan:(pos=1) OR near:(pos=2) OR elektrisch:(pos=3) OR or:(pos=4) OR electrisch:(pos=5))" },
00461 { "checking for Qt... configure: error: Qt (>= Qt 3.0.2) (headers and libraries) not found. Please check your installation!", "(Zcheck:(pos=1) OR Zfor:(pos=2) OR qt:(pos=3) OR Zconfigur:(pos=4) OR Zerror:(pos=5) OR qt:(pos=6) OR qt:(pos=7) OR 3.0.2:(pos=8) OR Zheader:(pos=9) OR Zand:(pos=10) OR Zlibrari:(pos=11) OR Znot:(pos=12) OR Zfound:(pos=13) OR please:(pos=14) OR Zcheck:(pos=15) OR Zyour:(pos=16) OR Zinstal:(pos=17))" },
00462 { "parse error, unexpected '\\\"', expecting T_STRING or T_VARIABLE or T_NUM_STRING", "(Zpars:(pos=1) OR Zerror:(pos=2) OR Zunexpect:(pos=3) OR (expecting:(pos=4) PHRASE 6 t_string:(pos=5) PHRASE 6 or:(pos=6) PHRASE 6 t_variable:(pos=7) PHRASE 6 or:(pos=8) PHRASE 6 t_num_string:(pos=9)))" },
00463 { "ac3 (0x2000) \"Dolby Laboratories,", "(Zac3:(pos=1) OR 0x2000:(pos=2) OR (dolby:(pos=3) PHRASE 2 laboratories:(pos=4)))" },
00464 { "Movie.FileName=(\"../../../~animations/\"+lesson1.recordset.fields('column3')+\"Intro.avi\")", "((movie:(pos=1) PHRASE 2 filename:(pos=2)) OR animations:(pos=3) OR (lesson1:(pos=4) PHRASE 3 recordset:(pos=5) PHRASE 3 fields:(pos=6)) OR Zcolumn3:(pos=7) OR (intro:(pos=8) PHRASE 2 avi:(pos=9)))" },
00465 { "502 Permission Denied - Permission Denied - news.chello.nl -- http://www.chello.nl/ (Typhoon v1.2.3)", "(502:(pos=1) OR permission:(pos=2) OR denied:(pos=3) OR permission:(pos=4) OR denied:(pos=5) OR (news:(pos=6) PHRASE 3 chello:(pos=7) PHRASE 3 nl:(pos=8)) OR (http:(pos=9) PHRASE 4 www:(pos=10) PHRASE 4 chello:(pos=11) PHRASE 4 nl:(pos=12)) OR typhoon:(pos=13) OR Zv1.2.3:(pos=14))" },
00466 { "Motion JPEG (MJPEG codec)", "(motion:(pos=1) OR jpeg:(pos=2) OR mjpeg:(pos=3) OR Zcodec:(pos=4))" },
00467 { ": zoomtext\"", "zoomtext:(pos=1)" },
00468 { "Your SORT command does not seem to support the \"-r -n -k 7\"", "(your:(pos=1) OR sort:(pos=2) OR Zcommand:(pos=3) OR Zdoe:(pos=4) OR Znot:(pos=5) OR Zseem:(pos=6) OR Zto:(pos=7) OR Zsupport:(pos=8) OR Zthe:(pos=9) OR (r:(pos=10) PHRASE 4 n:(pos=11) PHRASE 4 k:(pos=12) PHRASE 4 7:(pos=13)))" },
00469 { "Geef de naam van de MSDOS prompt op C:\\\\WINDOWS.COM\\\"", "(geef:(pos=1) OR Zde:(pos=2) OR Znaam:(pos=3) OR Zvan:(pos=4) OR Zde:(pos=5) OR msdos:(pos=6) OR Zprompt:(pos=7) OR Zop:(pos=8) OR (c:(pos=9) PHRASE 3 windows:(pos=10) PHRASE 3 com:(pos=11)))" },
00470 { "\"\"wa is fase\"", "(Zwa:(pos=1) OR Zis:(pos=2) OR fase:(pos=3))" },
00471 { "<v:imagedata src=\"", "((v:(pos=1) PHRASE 2 imagedata:(pos=2)) OR src:(pos=3))" },
00472 { "system(play ringin.wav); ?>", "(system:(pos=1) OR Zplay:(pos=2) OR (ringin:(pos=3) PHRASE 2 wav:(pos=4)))" },
00473 { "\"perfect NEAR systems\"", "(perfect:(pos=1) PHRASE 3 near:(pos=2) PHRASE 3 systems:(pos=3))" },
00474 { "LoadLibrary(\"mainta/gamex86.dll\") failed", "(loadlibrary:(pos=1) OR (mainta:(pos=2) PHRASE 3 gamex86:(pos=3) PHRASE 3 dll:(pos=4)) OR Zfail:(pos=5))" },
00475 { "DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');", "(date_format:(pos=1) OR (1997:(pos=2) PHRASE 3 10:(pos=3) PHRASE 3 04:(pos=4)) OR (22:(pos=5) PHRASE 3 23:(pos=6) PHRASE 3 00:(pos=7)) OR w:(pos=8) OR m:(pos=9) OR y:(pos=10))" },
00476 { "secundaire IDE-controller (dubbele fifo)", "(Zsecundair:(pos=1) OR (ide:(pos=2) PHRASE 2 controller:(pos=3)) OR Zdubbel:(pos=4) OR Zfifo:(pos=5))" },
00477 { "\"Postal2+Explorer.exe\"", "(postal2:(pos=1) PHRASE 3 explorer:(pos=2) PHRASE 3 exe:(pos=3))" },
00478 { "COUNT(*)", "count:(pos=1)" },
00479 { "Nuttige Windows progs (1/11)", "(nuttige:(pos=1) OR windows:(pos=2) OR Zprog:(pos=3) OR (1:(pos=4) PHRASE 2 11:(pos=5)))" },
00480 { "if(usercode==passcode==)", "(if:(pos=1) OR usercode:(pos=2) OR passcode:(pos=3))" },
00481 { "lg 8160b (dvd+r)", "(Zlg:(pos=1) OR 8160b:(pos=2) OR Zdvd:(pos=3) OR Zr:(pos=4))" },
00482 { "iPAQ Pocket PC 2002 End User Update (EUU - Service Pack)", "(Zipaq:(pos=1) OR pocket:(pos=2) OR pc:(pos=3) OR 2002:(pos=4) OR end:(pos=5) OR user:(pos=6) OR update:(pos=7) OR euu:(pos=8) OR service:(pos=9) OR pack:(pos=10))" },
00483 { "'ipod pakt tags niet\"", "(Zipod:(pos=1) OR Zpakt:(pos=2) OR Ztag:(pos=3) OR niet:(pos=4))" },
00484 { "\"DVD+/-R\"", "(dvd+:(pos=1) PHRASE 2 r:(pos=2))" },
00485 { "\"DVD+R DVD-R\"", "(dvd:(pos=1) PHRASE 4 r:(pos=2) PHRASE 4 dvd:(pos=3) PHRASE 4 r:(pos=4))" },
00486 { "php ;) in een array zetten", "(Zphp:(pos=1) OR Zin:(pos=2) OR Zeen:(pos=3) OR Zarray:(pos=4) OR Zzetten:(pos=5))" },
00487 { "De inhoud van uw advertentie is niet geschikt voor plaatsing op marktplaats! (001", "(de:(pos=1) OR Zinhoud:(pos=2) OR Zvan:(pos=3) OR Zuw:(pos=4) OR Zadvertenti:(pos=5) OR Zis:(pos=6) OR Zniet:(pos=7) OR Zgeschikt:(pos=8) OR Zvoor:(pos=9) OR Zplaats:(pos=10) OR Zop:(pos=11) OR Zmarktplaat:(pos=12) OR 001:(pos=13))" },
00488 { "creative (soundblaster OR sb) 128", "(Zcreativ:(pos=1) OR Zsoundblast:(pos=2) OR Zsb:(pos=3) OR 128:(pos=4))" },
00489 { "Can't open file: (errno: 145)", "(can't:(pos=1) OR Zopen:(pos=2) OR Zfile:(pos=3) OR Zerrno:(pos=4) OR 145:(pos=5))" },
00490 { "Formateren lukt niet(98,XP)", "(formateren:(pos=1) OR Zlukt:(pos=2) OR niet:(pos=3) OR 98:(pos=4) OR xp:(pos=5))" },
00491 { "access denied (java.io.", "(Zaccess:(pos=1) OR Zdeni:(pos=2) OR (java:(pos=3) PHRASE 2 io:(pos=4)))" },
00492 { "(access denied (java.io.)", "(Zaccess:(pos=1) OR Zdeni:(pos=2) OR (java:(pos=3) PHRASE 2 io:(pos=4)))" },
00493 { "wil niet installeren ( crc fouten)", "(Zwil:(pos=1) OR Zniet:(pos=2) OR Zinstalleren:(pos=3) OR Zcrc:(pos=4) OR Zfouten:(pos=5))" },
00494 { "(DVD+RW) brandsoftware meerdere", "(dvd:(pos=1) OR rw:(pos=2) OR Zbrandsoftwar:(pos=3) OR Zmeerder:(pos=4))" },
00495 { "(database OF databases) EN geheugen", "(Zdatabas:(pos=1) OR of:(pos=2) OR Zdatabas:(pos=3) OR en:(pos=4) OR Zgeheugen:(pos=5))" },
00496 { "(server 2003) winroute", "(Zserver:(pos=1) OR 2003:(pos=2) OR Zwinrout:(pos=3))" },
00497 { "54MHz (kanaal 2 VHF) tot tenminste 806 MHz (kanaal 69 UHF)", "(54mhz:(pos=1) OR Zkanaal:(pos=2) OR 2:(pos=3) OR vhf:(pos=4) OR Ztot:(pos=5) OR Ztenminst:(pos=6) OR 806:(pos=7) OR mhz:(pos=8) OR Zkanaal:(pos=9) OR 69:(pos=10) OR uhf:(pos=11))" },
00498 { "(draadloos OR wireless) netwerk", "(Zdraadloo:(pos=1) OR Zwireless:(pos=2) OR Znetwerk:(pos=3))" },
00499 { "localtime(time(NULL));", "(localtime:(pos=1) OR time:(pos=2) OR null:(pos=3))" },
00500 { "ob_start(\"ob_gzhandler\");", "(ob_start:(pos=1) OR ob_gzhandler:(pos=2))" },
00501 { "PPP Closed : LCP Time-out (VPN-0)", "(ppp:(pos=1) OR closed:(pos=2) OR lcp:(pos=3) OR (time:(pos=4) PHRASE 2 out:(pos=5)) OR (vpn:(pos=6) PHRASE 2 0:(pos=7)))" },
00502 { "COM+-gebeurtenissysteem", "(com+:(pos=1) PHRASE 2 gebeurtenissysteem:(pos=2))" },
00503 { "rcpthosts (#5.7.1)", "(Zrcpthost:(pos=1) OR 5.7.1:(pos=2))" },
00504 { "Dit apparaat werkt niet goed omdat Windows de voor dit apparaat vereiste stuurprogramma's niet kan laden. (Code 31)", "(dit:(pos=1) OR Zapparaat:(pos=2) OR Zwerkt:(pos=3) OR Zniet:(pos=4) OR Zgo:(pos=5) OR Zomdat:(pos=6) OR windows:(pos=7) OR Zde:(pos=8) OR Zvoor:(pos=9) OR Zdit:(pos=10) OR Zapparaat:(pos=11) OR Zvereist:(pos=12) OR Zstuurprogramma:(pos=13) OR Zniet:(pos=14) OR Zkan:(pos=15) OR Zladen:(pos=16) OR code:(pos=17) OR 31:(pos=18))" },
00505 { "window.open( scrollbar", "((window:(pos=1) PHRASE 2 open:(pos=2)) OR Zscrollbar:(pos=3))" },
00506 { "T68i truc ->", "(t68i:(pos=1) OR Ztruc:(pos=2))" },
00507 { "T68i ->", "t68i:(pos=1)" },
00508 { "\"de lijn is bezet\"\"", "(de:(pos=1) PHRASE 4 lijn:(pos=2) PHRASE 4 is:(pos=3) PHRASE 4 bezet:(pos=4))" },
00509 { "if (eregi(\"", "(Zif:(pos=1) OR eregi:(pos=2))" },
00510 { "This device is not working properly because Windows cannot load the drivers required for this device. (Code 31)", "(this:(pos=1) OR Zdevic:(pos=2) OR Zis:(pos=3) OR Znot:(pos=4) OR Zwork:(pos=5) OR Zproper:(pos=6) OR Zbecaus:(pos=7) OR windows:(pos=8) OR Zcannot:(pos=9) OR Zload:(pos=10) OR Zthe:(pos=11) OR Zdriver:(pos=12) OR Zrequir:(pos=13) OR Zfor:(pos=14) OR Zthis:(pos=15) OR Zdevic:(pos=16) OR code:(pos=17) OR 31:(pos=18))" },
00511 { "execCommand(\"Paste\");", "(execcommand:(pos=1) OR paste:(pos=2))" },
00512 { "\"-1 unread\"", "(1:(pos=1) PHRASE 2 unread:(pos=2))" },
00513 { "\"www.historical-fire-engines", "(www:(pos=1) PHRASE 4 historical:(pos=2) PHRASE 4 fire:(pos=3) PHRASE 4 engines:(pos=4))" },
00514 { "\"DVD+RW\" erase", "((dvd:(pos=1) PHRASE 2 rw:(pos=2)) OR Zeras:(pos=3))" },
00515 { "[showjekamer)", "Zshowjekam:(pos=1)" },
00516 { "The description for Event ID 1 in Source True Vector Engine ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURC", "(the:(pos=1) OR Zdescript:(pos=2) OR Zfor:(pos=3) OR event:(pos=4) OR id:(pos=5) OR 1:(pos=6) OR Zin:(pos=7) OR source:(pos=8) OR true:(pos=9) OR vector:(pos=10) OR engine:(pos=11) OR Zcannot:(pos=12) OR Zbe:(pos=13) OR Zfound:(pos=14) OR the:(pos=15) OR Zlocal:(pos=16) OR Zcomput:(pos=17) OR Zmay:(pos=18) OR Znot:(pos=19) OR Zhave:(pos=20) OR Zthe:(pos=21) OR Znecessari:(pos=22) OR Zregistri:(pos=23) OR Zinform:(pos=24) OR Zor:(pos=25) OR Zmessag:(pos=26) OR dll:(pos=27) OR Zfile:(pos=28) OR Zto:(pos=29) OR Zdisplay:(pos=30) OR Zmessag:(pos=31) OR Zfrom:(pos=32) OR Za:(pos=33) OR Zremot:(pos=34) OR Zcomput:(pos=35) OR you:(pos=36) OR Zmay:(pos=37) OR Zbe:(pos=38) OR Zabl:(pos=39) OR Zto:(pos=40) OR Zuse:(pos=41) OR Zthe:(pos=42) OR auxsourc:(pos=43))" },
00517 { "org.apache.jasper.JasperException: This absolute uri (http://java.sun.com/jstl/core) cannot be resolved in either web.xml or the jar files deployed with this application", "((org:(pos=1) PHRASE 4 apache:(pos=2) PHRASE 4 jasper:(pos=3) PHRASE 4 jasperexception:(pos=4)) OR this:(pos=5) OR Zabsolut:(pos=6) OR Zuri:(pos=7) OR (http:(pos=8) PHRASE 6 java:(pos=9) PHRASE 6 sun:(pos=10) PHRASE 6 com:(pos=11) PHRASE 6 jstl:(pos=12) PHRASE 6 core:(pos=13)) OR Zcannot:(pos=14) OR Zbe:(pos=15) OR Zresolv:(pos=16) OR Zin:(pos=17) OR Zeither:(pos=18) OR (web:(pos=19) PHRASE 2 xml:(pos=20)) OR Zor:(pos=21) OR Zthe:(pos=22) OR Zjar:(pos=23) OR Zfile:(pos=24) OR Zdeploy:(pos=25) OR Zwith:(pos=26) OR Zthis:(pos=27) OR Zapplic:(pos=28))" },
00518 { "This absolute uri (http://java.sun.com/jstl/core) cannot be resolved in either web.xml or the jar files deployed with this application", "(this:(pos=1) OR Zabsolut:(pos=2) OR Zuri:(pos=3) OR (http:(pos=4) PHRASE 6 java:(pos=5) PHRASE 6 sun:(pos=6) PHRASE 6 com:(pos=7) PHRASE 6 jstl:(pos=8) PHRASE 6 core:(pos=9)) OR Zcannot:(pos=10) OR Zbe:(pos=11) OR Zresolv:(pos=12) OR Zin:(pos=13) OR Zeither:(pos=14) OR (web:(pos=15) PHRASE 2 xml:(pos=16)) OR Zor:(pos=17) OR Zthe:(pos=18) OR Zjar:(pos=19) OR Zfile:(pos=20) OR Zdeploy:(pos=21) OR Zwith:(pos=22) OR Zthis:(pos=23) OR Zapplic:(pos=24))" },
00519 { "vervangen # \"/", "Zvervangen:(pos=1)" },
00520 { "vervangen # /\"", "Zvervangen:(pos=1)" },
00521 { "while(list($key, $val) = each($HTTP_POST_VARS))", "(while:(pos=1) OR list:(pos=2) OR Zkey:(pos=3) OR Zval:(pos=4) OR each:(pos=5) OR http_post_vars:(pos=6))" },
00522 { "PowerDVD does not support the current display mode. (DDraw Overlay mode is recommended)", "(powerdvd:(pos=1) OR Zdoe:(pos=2) OR Znot:(pos=3) OR Zsupport:(pos=4) OR Zthe:(pos=5) OR Zcurrent:(pos=6) OR Zdisplay:(pos=7) OR Zmode:(pos=8) OR ddraw:(pos=9) OR overlay:(pos=10) OR Zmode:(pos=11) OR Zis:(pos=12) OR Zrecommend:(pos=13))" },
00523 { "Warning: Unexpected character in input: '' (ASCII=92) state=1 highlight", "(warning:(pos=1) OR unexpected:(pos=2) OR Zcharact:(pos=3) OR Zin:(pos=4) OR Zinput:(pos=5) OR ascii:(pos=6) OR 92:(pos=7) OR state:(pos=8) OR 1:(pos=9) OR Zhighlight:(pos=10))" },
00524 { "error: Qt-1.4 (headers and libraries) not found. Please check your installation!", "(Zerror:(pos=1) OR (qt:(pos=2) PHRASE 2 1.4:(pos=3)) OR Zheader:(pos=4) OR Zand:(pos=5) OR Zlibrari:(pos=6) OR Znot:(pos=7) OR Zfound:(pos=8) OR please:(pos=9) OR Zcheck:(pos=10) OR Zyour:(pos=11) OR Zinstal:(pos=12))" },
00525 { "Error while initializing the sound driver: device /dev/dsp can't be opened (No such device) The sound server will continue, using the null output device.", "(error:(pos=1) OR Zwhile:(pos=2) OR Ziniti:(pos=3) OR Zthe:(pos=4) OR Zsound:(pos=5) OR Zdriver:(pos=6) OR Zdevic:(pos=7) OR (dev:(pos=8) PHRASE 2 dsp:(pos=9)) OR Zcan't:(pos=10) OR Zbe:(pos=11) OR Zopen:(pos=12) OR no:(pos=13) OR Zsuch:(pos=14) OR Zdevic:(pos=15) OR the:(pos=16) OR Zsound:(pos=17) OR Zserver:(pos=18) OR Zwill:(pos=19) OR Zcontinu:(pos=20) OR Zuse:(pos=21) OR Zthe:(pos=22) OR Znull:(pos=23) OR Zoutput:(pos=24) OR Zdevic:(pos=25))" },
00526 { "mag mijn waarschuwing nu weg ? ;)", "(Zmag:(pos=1) OR Zmijn:(pos=2) OR Zwaarschuw:(pos=3) OR Znu:(pos=4) OR Zweg:(pos=5))" },
00527 { "Abit NF7-S (nForce 2 Chipset) Rev 2.0", "(abit:(pos=1) OR (nf7:(pos=2) PHRASE 2 s:(pos=3)) OR Znforc:(pos=4) OR 2:(pos=5) OR chipset:(pos=6) OR rev:(pos=7) OR 2.0:(pos=8))" },
00528 { "Setup Could Not Verify the Integrity of the File\" Error Message Occurs When You Try to Install Windows XP Service Pack 1", "(setup:(pos=1) OR could:(pos=2) OR not:(pos=3) OR verify:(pos=4) OR Zthe:(pos=5) OR integrity:(pos=6) OR Zof:(pos=7) OR Zthe:(pos=8) OR file:(pos=9) OR (error:(pos=10) PHRASE 13 message:(pos=11) PHRASE 13 occurs:(pos=12) PHRASE 13 when:(pos=13) PHRASE 13 you:(pos=14) PHRASE 13 try:(pos=15) PHRASE 13 to:(pos=16) PHRASE 13 install:(pos=17) PHRASE 13 windows:(pos=18) PHRASE 13 xp:(pos=19) PHRASE 13 service:(pos=20) PHRASE 13 pack:(pos=21) PHRASE 13 1:(pos=22)))" },
00529 { "(browser 19) citrix", "(Zbrowser:(pos=1) OR 19:(pos=2) OR Zcitrix:(pos=3))" },
00530 { "preg_replace (.*?)", "Zpreg_replac:(pos=1)" },
00531 { "formule excel #naam\"?\"", "(Zformul:(pos=1) OR Zexcel:(pos=2) OR naam:(pos=3))" },
00532 { "->", "" },
00533 { "De instructie op 0x77f436f7 verwijst naar geheugen op 0x007f4778. De lees-of schrijfbewerking (\"written\") op het geheugen is mislukt", "(de:(pos=1) OR Zinstructi:(pos=2) OR Zop:(pos=3) OR 0x77f436f7:(pos=4) OR Zverwijst:(pos=5) OR Znaar:(pos=6) OR Zgeheugen:(pos=7) OR Zop:(pos=8) OR 0x007f4778:(pos=9) OR de:(pos=10) OR (lees:(pos=11) PHRASE 2 of:(pos=12)) OR Zschrijfbewerk:(pos=13) OR written:(pos=14) OR Zop:(pos=15) OR Zhet:(pos=16) OR Zgeheugen:(pos=17) OR Zis:(pos=18) OR Zmislukt:(pos=19))" },
00534 { "<iframe src=\"www.tweakers.net></iframe>", "(Zifram:(pos=1) OR src:(pos=2) OR (www:(pos=3) PHRASE 4 tweakers:(pos=4) PHRASE 4 net:(pos=5) PHRASE 4 iframe:(pos=6)))" },
00535 { "\"rpm -e httpd\"", "(rpm:(pos=1) PHRASE 3 e:(pos=2) PHRASE 3 httpd:(pos=3))" },
00536 { "automatisch op All Flis (*.*)", "(Zautomatisch:(pos=1) OR Zop:(pos=2) OR all:(pos=3) OR flis:(pos=4))" },
00537 { "(Windows; U; Windows NT 5.1; en-US; rv:1.3b) Gecko/20030210", "(windows:(pos=1) OR u:(pos=2) OR windows:(pos=3) OR nt:(pos=4) OR 5.1:(pos=5) OR (en:(pos=6) PHRASE 2 us:(pos=7)) OR (rv:(pos=8) PHRASE 2 1.3b:(pos=9)) OR (gecko:(pos=10) PHRASE 2 20030210:(pos=11)))" },
00538 { "en-US; rv:1.3b) Gecko/20030210", "((en:(pos=1) PHRASE 2 us:(pos=2)) OR (rv:(pos=3) PHRASE 2 1.3b:(pos=4)) OR (gecko:(pos=5) PHRASE 2 20030210:(pos=6)))" },
00539 { "\"en-US; rv:1.3b) Gecko/20030210\"", "(en:(pos=1) PHRASE 6 us:(pos=2) PHRASE 6 rv:(pos=3) PHRASE 6 1.3b:(pos=4) PHRASE 6 gecko:(pos=5) PHRASE 6 20030210:(pos=6))" },
00540 { "(./) chmod.sh", "(chmod:(pos=1) PHRASE 2 sh:(pos=2))" },
00541 { "document.write(ssg(\" html", "((document:(pos=1) PHRASE 2 write:(pos=2)) OR ssg:(pos=3) OR html:(pos=4))" },
00542 { "superstack \"mac+adressen\"", "(Zsuperstack:(pos=1) OR (mac:(pos=2) PHRASE 2 adressen:(pos=3)))" },
00543 { "IIS getenv(REMOTE_HOST)_", "(iis:(pos=1) OR getenv:(pos=2) OR remote_host:(pos=3) OR _:(pos=4))" },
00544 { "IIS en getenv(REMOTE_HOST)", "(iis:(pos=1) OR Zen:(pos=2) OR getenv:(pos=3) OR remote_host:(pos=4))" },
00545 { "php getenv(\"HTTP_REFERER\")", "(Zphp:(pos=1) OR getenv:(pos=2) OR http_referer:(pos=3))" },
00546 { "nec+-1300", "(nec+:(pos=1) PHRASE 2 1300:(pos=2))" },
00547 { "smbpasswd script \"-s\"", "(Zsmbpasswd:(pos=1) OR Zscript:(pos=2) OR s:(pos=3))" },
00548 { "leestekens \" \xc3\xb6 \xc3\xab", "(Zleesteken:(pos=1) OR (\xc3\xb6:(pos=2) PHRASE 2 \xc3\xab:(pos=3)))" },
00549 { "freesco and (all seeing eye)", "(Zfreesco:(pos=1) OR Zand:(pos=2) OR Zall:(pos=3) OR Zsee:(pos=4) OR Zeye:(pos=5))" },
00550 { "('all seeing eye') and freesco", "(Zall:(pos=1) OR Zsee:(pos=2) OR Zeye:(pos=3) OR Zand:(pos=4) OR Zfreesco:(pos=5))" },
00551 { "\"[......\"", "" },
00552 { "Error = 11004 (500 No Data (Winsock error #11004))", "(error:(pos=1) OR 11004:(pos=2) OR 500:(pos=3) OR no:(pos=4) OR data:(pos=5) OR winsock:(pos=6) OR Zerror:(pos=7) OR 11004:(pos=8))" },
00553 { "gegevensfout (cyclishe redundantiecontrole)", "(Zgegevensfout:(pos=1) OR Zcyclish:(pos=2) OR Zredundantiecontrol:(pos=3))" },
00554 { "firmware versie waar NEC\"", "(Zfirmwar:(pos=1) OR Zversi:(pos=2) OR Zwaar:(pos=3) OR nec:(pos=4))" },
00555 { "nu.nl \"-1\"", "((nu:(pos=1) PHRASE 2 nl:(pos=2)) OR 1:(pos=3))" },
00556 { "provider+-webspace", "(provider+:(pos=1) PHRASE 2 webspace:(pos=2))" },
00557 { "verschil \"dvd+rw\" \"dvd-rw\"", "(Zverschil:(pos=1) OR (dvd:(pos=2) PHRASE 2 rw:(pos=3)) OR (dvd:(pos=4) PHRASE 2 rw:(pos=5)))" },
00558 { "(dhcp client) + hangt", "(Zdhcp:(pos=1) OR Zclient:(pos=2) OR Zhangt:(pos=3))" },
00559 { "MSI 875P Neo-FIS2R (Intel 875P)", "(msi:(pos=1) OR 875p:(pos=2) OR (neo:(pos=3) PHRASE 2 fis2r:(pos=4)) OR intel:(pos=5) OR 875p:(pos=6))" },
00560 { "voeding passief gekoeld\"", "(Zvoed:(pos=1) OR Zpassief:(pos=2) OR gekoeld:(pos=3))" },
00561 { "if (mysql_num_rows($resultaat)==1)", "(Zif:(pos=1) OR mysql_num_rows:(pos=2) OR Zresultaat:(pos=3) OR 1:(pos=4))" },
00562 { "Server.CreateObject(\"Persits.Upload.1\")", "((server:(pos=1) PHRASE 2 createobject:(pos=2)) OR (persits:(pos=3) PHRASE 3 upload:(pos=4) PHRASE 3 1:(pos=5)))" },
00563 { "if(cod>9999999)cod=parseInt(cod/64)", "(if:(pos=1) OR cod:(pos=2) OR 9999999:(pos=3) OR cod:(pos=4) OR parseint:(pos=5) OR (cod:(pos=6) PHRASE 2 64:(pos=7)))" },
00564 { "if (cod>9999999", "(Zif:(pos=1) OR cod:(pos=2) OR 9999999:(pos=3))" },
00565 { "\"rm -rf /bin/laden\"", "(rm:(pos=1) PHRASE 4 rf:(pos=2) PHRASE 4 bin:(pos=3) PHRASE 4 laden:(pos=4))" },
00566 { "\">>> 0) & 0xFF\"", "(0:(pos=1) PHRASE 2 0xff:(pos=2))" },
00567 { "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"> document.body.scrollHeight", "(doctype:(pos=1) OR html:(pos=2) OR public:(pos=3) OR (w3c:(pos=4) PHRASE 5 dtd:(pos=5) PHRASE 5 html:(pos=6) PHRASE 5 4.01:(pos=7) PHRASE 5 en:(pos=8)) OR (document:(pos=9) PHRASE 3 body:(pos=10) PHRASE 3 scrollheight:(pos=11)))" },
00568 { "<BR>window.resizeBy(offsetX,offsetY)<P>kweet", "(br:(pos=1) OR (window:(pos=2) PHRASE 2 resizeby:(pos=3)) OR Zoffsetx:(pos=4) OR Zoffseti:(pos=5) OR p:(pos=6) OR Zkweet:(pos=7))" },
00569 { "linux humor :)", "(Zlinux:(pos=1) OR Zhumor:(pos=2))" },
00570 { "ClassFactory kan aangevraagde klasse niet leveren (Fout=80040111)", "(classfactory:(pos=1) OR Zkan:(pos=2) OR Zaangevraagd:(pos=3) OR Zklass:(pos=4) OR Zniet:(pos=5) OR Zleveren:(pos=6) OR fout:(pos=7) OR 80040111:(pos=8))" },
00571 { "remote_smtp defer (-44)", "(Zremote_smtp:(pos=1) OR Zdefer:(pos=2) OR 44:(pos=3))" },
00572 { "txtlogin.getText().trim().toUpperCase().intern() == inuser[2 * (i - 1) + 2].trim().toUpperCase().intern() && txtpass.getText().trim().toUpperCase().intern() == inuser[2 * (i - 1) + 3].trim().toUpperCase().intern())", "((txtlogin:(pos=1) PHRASE 2 gettext:(pos=2)) OR trim:(pos=3) OR touppercase:(pos=4) OR intern:(pos=5) OR inuser:(pos=6) OR 2:(pos=7) OR Zi:(pos=8) OR 1:(pos=9) OR 2:(pos=10) OR trim:(pos=11) OR touppercase:(pos=12) OR intern:(pos=13) OR (txtpass:(pos=14) PHRASE 2 gettext:(pos=15)) OR trim:(pos=16) OR touppercase:(pos=17) OR intern:(pos=18) OR inuser:(pos=19) OR 2:(pos=20) OR Zi:(pos=21) OR 1:(pos=22) OR 3:(pos=23) OR trim:(pos=24) OR touppercase:(pos=25) OR intern:(pos=26))" },
00573 { "Koper + amoniak (NH2", "(koper:(pos=1) OR Zamoniak:(pos=2) OR nh2:(pos=3))" },
00574 { "nec dvd -/+r", "((Znec:(pos=1) OR Zdvd:(pos=2)) AND_NOT Zr:(pos=3))" },
00575 { "er is een gereserveerde fout (-1104) opgetreden", "(Zer:(pos=1) OR Zis:(pos=2) OR Zeen:(pos=3) OR Zgereserveerd:(pos=4) OR Zfout:(pos=5) OR 1104:(pos=6) OR Zopgetreden:(pos=7))" },
00576 { "Cor \\(CCN\\)'\" <cor.kloet@ccn.controlec.nl>", "(cor:(pos=1) OR ccn:(pos=2) OR (cor:(pos=3) PHRASE 5 kloet:(pos=4) PHRASE 5 ccn:(pos=5) PHRASE 5 controlec:(pos=6) PHRASE 5 nl:(pos=7)))" },
00577 { "Warning: Failed opening for inclusion (include_path='') in Unknown on line 0", "(warning:(pos=1) OR failed:(pos=2) OR Zopen:(pos=3) OR Zfor:(pos=4) OR Zinclus:(pos=5) OR include_path:(pos=6) OR Zin:(pos=7) OR unknown:(pos=8) OR Zon:(pos=9) OR Zline:(pos=10) OR 0:(pos=11))" },
00578 { "\"~\" + \"c:\\\"", "Zc:(pos=1)" },
00579 { "mysql count(*)", "(Zmysql:(pos=1) OR count:(pos=2))" },
00580 { "for %f in (*.*) do", "(Zfor:(pos=1) OR Zf:(pos=2) OR Zin:(pos=3) OR Zdo:(pos=4))" },
00581 { "raar \"~\" bestand", "(Zraar:(pos=1) OR Zbestand:(pos=2))" },
00582 { "NEC DVD +-R/RW 1300", "(nec:(pos=1) OR dvd:(pos=2) OR (r:(pos=3) PHRASE 2 rw:(pos=4)) OR 1300:(pos=5))" },
00583 { "approved (ref: 38446-263)", "(Zapprov:(pos=1) OR Zref:(pos=2) OR (38446:(pos=3) PHRASE 2 263:(pos=4)))" },
00584 { "GA-7VRXP(2.0)", "((ga:(pos=1) PHRASE 2 7vrxp:(pos=2)) OR 2.0:(pos=3))" },
00585 { "~ Could not retrieve directory listing for \"/\"", "(could:(pos=1) OR Znot:(pos=2) OR Zretriev:(pos=3) OR Zdirectori:(pos=4) OR Zlist:(pos=5) OR Zfor:(pos=6))" },
00586 { "asp CreateObject(\"Word.Document\")", "(Zasp:(pos=1) OR createobject:(pos=2) OR (word:(pos=3) PHRASE 2 document:(pos=4)))" },
00587 { "De lees- of schrijfbewerking (\"written\") op het geheugen is mislukt.", "(de:(pos=1) OR Zlee:(pos=2) OR Zof:(pos=3) OR Zschrijfbewerk:(pos=4) OR written:(pos=5) OR Zop:(pos=6) OR Zhet:(pos=7) OR Zgeheugen:(pos=8) OR Zis:(pos=9) OR Zmislukt:(pos=10))" },
00588 { "putStr (map (\\x -> chr (round (21/2 * x^3 - 92 * x^2 + 503/2 * x - 105))) [1..4])", "(Zputstr:(pos=1) OR Zmap:(pos=2) OR ((Zx:(pos=3) OR Zround:(pos=5) OR (21:(pos=6) PHRASE 2 2:(pos=7)) OR Zx:(pos=8) OR 3:(pos=9) OR 92:(pos=10) OR Zx:(pos=11) OR 2:(pos=12) OR (503:(pos=13) PHRASE 2 2:(pos=14)) OR Zx:(pos=15) OR 105:(pos=16)) AND_NOT Zchr:(pos=4)) OR (1:(pos=17) PHRASE 2 4:(pos=18)))" },
00589 { "parent.document.getElementById(\\\"leftmenu\\\").cols", "((parent:(pos=1) PHRASE 3 document:(pos=2) PHRASE 3 getelementbyid:(pos=3)) OR leftmenu:(pos=4) OR Zcol:(pos=5))" },
00590 { "<% if not isEmpty(Request.QueryString) then", "(Zif:(pos=1) OR Znot:(pos=2) OR isempty:(pos=3) OR (request:(pos=4) PHRASE 2 querystring:(pos=5)) OR Zthen:(pos=6))" },
00591 { "Active Desktop (Hier issie)", "(active:(pos=1) OR desktop:(pos=2) OR hier:(pos=3) OR Zissi:(pos=4))" },
00592 { "Asus A7V8X (LAN + Sound)", "(asus:(pos=1) OR a7v8x:(pos=2) OR lan:(pos=3) OR sound:(pos=4))" },
00593 { "Novell This pentium class machine (or greater) lacks some required CPU feature(s", "(novell:(pos=1) OR this:(pos=2) OR Zpentium:(pos=3) OR Zclass:(pos=4) OR Zmachin:(pos=5) OR Zor:(pos=6) OR Zgreater:(pos=7) OR Zlack:(pos=8) OR Zsome:(pos=9) OR Zrequir:(pos=10) OR cpu:(pos=11) OR feature:(pos=12) OR Zs:(pos=13))" },
00594 { "sql server install fails error code (-1)", "(Zsql:(pos=1) OR Zserver:(pos=2) OR Zinstal:(pos=3) OR Zfail:(pos=4) OR Zerror:(pos=5) OR Zcode:(pos=6) OR 1:(pos=7))" },
00595 { "session_register(\"login\");", "(session_register:(pos=1) OR login:(pos=2))" },
00596 { "\"kylix+ndmb\"", "(kylix:(pos=1) PHRASE 2 ndmb:(pos=2))" },
00597 { "Cannot find imap library (libc-client.a).", "(cannot:(pos=1) OR Zfind:(pos=2) OR Zimap:(pos=3) OR Zlibrari:(pos=4) OR (libc:(pos=5) PHRASE 3 client:(pos=6) PHRASE 3 a:(pos=7)))" },
00598 { "If ($_SESSION[\"Login\"] == 1)", "(if:(pos=1) OR _session:(pos=2) OR login:(pos=3) OR 1:(pos=4))" },
00599 { "You have an error in your SQL syntax near '1')' at line 1", "(you:(pos=1) OR Zhave:(pos=2) OR Zan:(pos=3) OR Zerror:(pos=4) OR Zin:(pos=5) OR Zyour:(pos=6) OR sql:(pos=7) OR Zsyntax:(pos=8) OR Znear:(pos=9) OR 1:(pos=10) OR Zat:(pos=11) OR Zline:(pos=12) OR 1:(pos=13))" },
00600 { "ASRock K7VT2 (incl. LAN)", "(asrock:(pos=1) OR k7vt2:(pos=2) OR Zincl:(pos=3) OR lan:(pos=4))" },
00601 { "+windows98 +(geen communicatie) +ie5", "(Zwindows98:(pos=1) AND (Zgeen:(pos=2) OR Zcommunicati:(pos=3)) AND Zie5:(pos=4))" },
00602 { "\"xterm -fn\"", "(xterm:(pos=1) PHRASE 2 fn:(pos=2))" },
00603 { "IRQL_NOT_LESS_OR_EQUAL", "irql_not_less_or_equal:(pos=1)" },
00604 { "access query \"NOT IN\"", "(Zaccess:(pos=1) OR Zqueri:(pos=2) OR (not:(pos=3) PHRASE 2 in:(pos=4)))" },
00605 { "\"phrase one \"phrase two\"", "((phrase:(pos=1) PHRASE 2 one:(pos=2)) OR Zphrase:(pos=3) OR two:(pos=4))" },
00606 { "NEAR 207 46 249 27", "(near:(pos=1) OR 207:(pos=2) OR 46:(pos=3) OR 249:(pos=4) OR 27:(pos=5))" },
00607 { "- NEAR 12V voeding", "(near:(pos=1) OR 12v:(pos=2) OR Zvoed:(pos=3))" },
00608 { "waarom \"~\" in directorynaam", "(Zwaarom:(pos=1) OR Zin:(pos=2) OR Zdirectorynaam:(pos=3))" },
00609 { "cd'r NEAR toebehoren", "(cd'r:(pos=1) NEAR 11 toebehoren:(pos=2))" },
00610 { "site:1 site:2", "0 * (H1 OR H2)" },
00611 { "site:1 site2:2", "0 * (H1 AND J2)" },
00612 { "site:1 site:2 site2:2", "0 * ((H1 OR H2) AND J2)" },
00613 { "site:1 OR site:2", "(0 * H1 OR 0 * H2)" },
00614 { "site:1 AND site:2", "(0 * H1 AND 0 * H2)" },
00615 { "foo AND site:2", "(Zfoo:(pos=1) AND 0 * H2)" },
00616
00617 { "category:1 category:2", "0 * (XCAT1 AND XCAT2)" },
00618 { "category:1 site2:2", "0 * (J2 AND XCAT1)" },
00619 { "category:1 category:2 site2:2", "0 * (J2 AND XCAT1 AND XCAT2)" },
00620 { "category:1 OR category:2", "(0 * XCAT1 OR 0 * XCAT2)" },
00621 { "category:1 AND category:2", "(0 * XCAT1 AND 0 * XCAT2)" },
00622 { "foo AND category:2", "(Zfoo:(pos=1) AND 0 * XCAT2)" },
00623 #if 0
00624 { "A site:1 site:2", "(a FILTER (H1 OR H2))" },
00625 { "A (site:1 OR site:2)", "(a FILTER (H1 OR H2))" },
00626 { "A (site:1 OR site:2)", "(a FILTER (H1 OR H2))" },
00627 { "A site:1 site2:2", "(a FILTER (H1 AND J2))" },
00628 { "A site:1 site:2 site2:2", "(a FILTER ((H1 OR H2) AND J2))" },
00629 { "A site:1 OR site:2", "(a FILTER (H1 OR H2))" },
00630 { "A site:1 AND site:2", "(a FILTER (H1 AND H2))" },
00631 #endif
00632 { "site:xapian.org OR site:www.xapian.org", "(0 * Hxapian.org OR 0 * Hwww.xapian.org)" },
00633 { "site:xapian.org site:www.xapian.org", "0 * (Hxapian.org OR Hwww.xapian.org)" },
00634 { "site:xapian.org AND site:www.xapian.org", "(0 * Hxapian.org AND 0 * Hwww.xapian.org)" },
00635 { "Xapian site:xapian.org site:www.xapian.org", "(xapian:(pos=1) FILTER (Hxapian.org OR Hwww.xapian.org))" },
00636 { "author:richard author:olly writer:charlie", "(ZArichard:(pos=1) OR ZAolli:(pos=2) OR ZAcharli:(pos=3))"},
00637 { "author:richard NEAR title:book", "(Arichard:(pos=1) NEAR 11 XTbook:(pos=2))"},
00638 { "authortitle:richard NEAR title:book", "((Arichard:(pos=1) NEAR 11 XTbook:(pos=2)) OR (XTrichard:(pos=1) NEAR 11 XTbook:(pos=2)))"},
00639 { "multisite:xapian.org", "0 * (Hxapian.org OR Jxapian.org)"},
00640 { "authortitle:richard", "(ZArichard:(pos=1) OR ZXTrichard:(pos=1))"},
00641 { "multisite:xapian.org site:www.xapian.org author:richard authortitle:richard", "((ZArichard:(pos=1) OR ZArichard:(pos=2) OR ZXTrichard:(pos=2)) FILTER (Hwww.xapian.org AND (Hxapian.org OR Jxapian.org)))"},
00642 { "authortitle:richard-boulton", "((Arichard:(pos=1) PHRASE 2 Aboulton:(pos=2)) OR (XTrichard:(pos=1) PHRASE 2 XTboulton:(pos=2)))"},
00643 { "authortitle:\"richard boulton\"", "((Arichard:(pos=1) PHRASE 2 Aboulton:(pos=2)) OR (XTrichard:(pos=1) PHRASE 2 XTboulton:(pos=2)))"},
00644
00645 { "久有归天愿", "(久:(pos=1) AND 久有:(pos=1) AND 有:(pos=1) AND 有归:(pos=1) AND 归:(pos=1) AND 归天:(pos=1) AND 天:(pos=1) AND 天愿:(pos=1) AND 愿:(pos=1))" },
00646 { "title:久有 归 天愿", "((XT久:(pos=1) AND XT久有:(pos=1) AND XT有:(pos=1)) OR 归:(pos=2) OR (天:(pos=3) AND 天愿:(pos=3) AND 愿:(pos=3)))" },
00647 { "h众ello万众", "(Zh:(pos=1) OR 众:(pos=2) OR Zello:(pos=3) OR (万:(pos=4) AND 万众:(pos=4) AND 众:(pos=4)))" },
00648 { "世(の中)TEST_tm", "(世:(pos=1) OR (の:(pos=2) AND の中:(pos=2) AND 中:(pos=2)) OR test_tm:(pos=3))" },
00649 { "다녀 AND 와야", "(다:(pos=1) AND 다녀:(pos=1) AND 녀:(pos=1) AND 와:(pos=2) AND 와야:(pos=2) AND 야:(pos=2))" },
00650 { "authortitle:학술 OR 연구를", "((A학:(pos=1) AND XT학:(pos=1) AND A학술:(pos=1) AND XT학술:(pos=1) AND A술:(pos=1) AND XT술:(pos=1)) OR (연:(pos=2) AND 연구:(pos=2) AND 구:(pos=2) AND 구를:(pos=2) AND 를:(pos=2)))" },
00651
00652 { "\"久有归\"", "(久:(pos=1) PHRASE 3 有:(pos=1) PHRASE 3 归:(pos=1))" },
00653 { "\"久有test归\"", "(久:(pos=1) PHRASE 4 有:(pos=1) PHRASE 4 test:(pos=2) PHRASE 4 归:(pos=3))" },
00654
00655 { NULL, NULL }
00656 };
00657
00658 static bool test_queryparser1()
00659 {
00660 Xapian::QueryParser queryparser;
00661 queryparser.set_stemmer(Xapian::Stem("english"));
00662 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00663 queryparser.add_prefix("author", "A");
00664 queryparser.add_prefix("writer", "A");
00665 queryparser.add_prefix("title", "XT");
00666 queryparser.add_prefix("subject", "XT");
00667 queryparser.add_prefix("authortitle", "A");
00668 queryparser.add_prefix("authortitle", "XT");
00669 queryparser.add_boolean_prefix("site", "H");
00670 queryparser.add_boolean_prefix("site2", "J");
00671 queryparser.add_boolean_prefix("multisite", "H");
00672 queryparser.add_boolean_prefix("multisite", "J");
00673 queryparser.add_boolean_prefix("category", "XCAT", false);
00674 TEST_EXCEPTION(Xapian::InvalidOperationError,
00675 queryparser.add_boolean_prefix("authortitle", "B");
00676 );
00677 TEST_EXCEPTION(Xapian::InvalidOperationError,
00678 queryparser.add_prefix("multisite", "B");
00679 );
00680 for (const test *p = test_or_queries; p->query; ++p) {
00681 string expect, parsed;
00682 if (p->expect)
00683 expect = p->expect;
00684 else
00685 expect = "parse error";
00686 try {
00687 Xapian::Query qobj = queryparser.parse_query(p->query);
00688 parsed = qobj.get_description();
00689 expect = string("Xapian::Query(") + expect + ')';
00690 } catch (const Xapian::QueryParserError &e) {
00691 parsed = e.get_msg();
00692 } catch (const Xapian::Error &e) {
00693 parsed = e.get_description();
00694 } catch (...) {
00695 parsed = "Unknown exception!";
00696 }
00697 tout << "Query: " << p->query << '\n';
00698 TEST_STRINGS_EQUAL(parsed, expect);
00699 }
00700 return true;
00701 }
00702
00703 static const test test_and_queries[] = {
00704 { "internet explorer title:(http www)", "(Zinternet:(pos=1) AND Zexplor:(pos=2) AND ZXThttp:(pos=3) AND ZXTwww:(pos=4))" },
00705
00706
00707 { "one +two three", "(Zone:(pos=1) AND Ztwo:(pos=2) AND Zthree:(pos=3))" },
00708 { "hello -title:\"hello world\"", "(Zhello:(pos=1) AND_NOT (XThello:(pos=2) PHRASE 2 XTworld:(pos=3)))" },
00709
00710
00711 { "\"hello world\" -C++", "((hello:(pos=1) PHRASE 2 world:(pos=2)) AND_NOT c++:(pos=3))" },
00712
00713
00714 { "-cup site:world", "(0 * Hworld AND_NOT Zcup:(pos=1))" },
00715 { "site:world -cup", "(0 * Hworld AND_NOT Zcup:(pos=1))" },
00716
00717 { "(site:world) -cup", "(0 * Hworld AND_NOT Zcup:(pos=1))" },
00718
00719
00720
00721 { "foo site:xapian.org bar", "((Zfoo:(pos=1) AND Zbar:(pos=2)) FILTER Hxapian.org)" },
00722
00723 { "a b site:xapian.org", "((Za:(pos=1) AND Zb:(pos=2)) FILTER Hxapian.org)" },
00724 { "site:xapian.org a b", "((Za:(pos=1) AND Zb:(pos=2)) FILTER Hxapian.org)" },
00725
00726 { "author:험가 OR subject:万众 hello world!", "((A험:(pos=1) AND A험가:(pos=1) AND A가:(pos=1)) OR (XT万:(pos=2) AND XT万众:(pos=2) AND XT众:(pos=2) AND Zhello:(pos=3) AND Zworld:(pos=4)))" },
00727 { "洛伊one儿差点two脸three", "(洛:(pos=1) AND 洛伊:(pos=1) AND 伊:(pos=1) AND Zone:(pos=2) AND 儿:(pos=3) AND 儿差:(pos=3) AND 差:(pos=3) AND 差点:(pos=3) AND 点:(pos=3) AND Ztwo:(pos=4) AND 脸:(pos=5) AND Zthree:(pos=6))" },
00728 { NULL, NULL }
00729 };
00730
00731
00732 static bool test_qp_default_op1()
00733 {
00734 Xapian::QueryParser queryparser;
00735 queryparser.set_stemmer(Xapian::Stem("english"));
00736 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00737 queryparser.add_prefix("author", "A");
00738 queryparser.add_prefix("title", "XT");
00739 queryparser.add_prefix("subject", "XT");
00740 queryparser.add_boolean_prefix("site", "H");
00741 queryparser.set_default_op(Xapian::Query::OP_AND);
00742 for (const test *p = test_and_queries; p->query; ++p) {
00743 string expect, parsed;
00744 if (p->expect)
00745 expect = p->expect;
00746 else
00747 expect = "parse error";
00748 try {
00749 Xapian::Query qobj = queryparser.parse_query(p->query);
00750 parsed = qobj.get_description();
00751 expect = string("Xapian::Query(") + expect + ')';
00752 } catch (const Xapian::QueryParserError &e) {
00753 parsed = e.get_msg();
00754 } catch (const Xapian::Error &e) {
00755 parsed = e.get_description();
00756 } catch (...) {
00757 parsed = "Unknown exception!";
00758 }
00759 tout << "Query: " << p->query << '\n';
00760 TEST_STRINGS_EQUAL(parsed, expect);
00761 }
00762 return true;
00763 }
00764
00765
00766 static bool test_qp_default_prefix1()
00767 {
00768 Xapian::QueryParser qp;
00769 qp.set_stemmer(Xapian::Stem("english"));
00770 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00771 qp.add_prefix("title", "XT");
00772
00773 Xapian::Query qobj;
00774 qobj = qp.parse_query("hello world", 0, "A");
00775 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAhello:(pos=1) OR ZAworld:(pos=2)))");
00776 qobj = qp.parse_query("me title:stuff", 0, "A");
00777 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAme:(pos=1) OR ZXTstuff:(pos=2)))");
00778 qobj = qp.parse_query("title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN, "A");
00779 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXTstuff:(pos=1) OR ZAme:(pos=2)))");
00780 qobj = qp.parse_query("英国 title:文森hello", 0, "A");
00781 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((A英:(pos=1) AND A英国:(pos=1) AND A国:(pos=1)) OR (XT文:(pos=2) AND XT文森:(pos=2) AND XT森:(pos=2)) OR ZAhello:(pos=3)))");
00782 return true;
00783 }
00784
00785
00786
00787 static bool test_qp_default_prefix2()
00788 {
00789 Xapian::QueryParser qp;
00790 qp.set_stemmer(Xapian::Stem("english"));
00791 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00792
00793
00794 TEST_EXCEPTION(Xapian::UnimplementedError,
00795 qp.add_boolean_prefix("", "B");
00796 );
00797
00798 qp.add_prefix("title", "XT");
00799 qp.add_prefix("", "A");
00800
00801 Xapian::Query qobj;
00802 qobj = qp.parse_query("hello world", 0);
00803 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAhello:(pos=1) OR ZAworld:(pos=2)))");
00804 qobj = qp.parse_query("me title:stuff", 0);
00805 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAme:(pos=1) OR ZXTstuff:(pos=2)))");
00806 qobj = qp.parse_query("title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN);
00807 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXTstuff:(pos=1) OR ZAme:(pos=2)))");
00808
00809 qobj = qp.parse_query("hello world", 0, "B");
00810 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZBhello:(pos=1) OR ZBworld:(pos=2)))");
00811 qobj = qp.parse_query("me title:stuff", 0, "B");
00812 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZBme:(pos=1) OR ZXTstuff:(pos=2)))");
00813 qobj = qp.parse_query("title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN, "B");
00814 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXTstuff:(pos=1) OR ZBme:(pos=2)))");
00815
00816 qp.add_prefix("", "B");
00817 qobj = qp.parse_query("me-us title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN);
00818 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((Ame:(pos=1) PHRASE 2 Aus:(pos=2)) OR (Bme:(pos=1) PHRASE 2 Bus:(pos=2)) OR ZXTstuff:(pos=3) OR ZAme:(pos=4) OR ZBme:(pos=4)))");
00819 qobj = qp.parse_query("me-us title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN, "C");
00820 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((Cme:(pos=1) PHRASE 2 Cus:(pos=2)) OR ZXTstuff:(pos=3) OR ZCme:(pos=4)))");
00821
00822 qobj = qp.parse_query("me-us title:\"not-me\"", Xapian::QueryParser::FLAG_PHRASE);
00823 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((Ame:(pos=1) PHRASE 2 Aus:(pos=2)) OR (Bme:(pos=1) PHRASE 2 Bus:(pos=2)) OR (XTnot:(pos=3) PHRASE 2 XTme:(pos=4))))");
00824 return true;
00825 }
00826
00827
00828 static bool test_qp_odd_chars1()
00829 {
00830 Xapian::QueryParser qp;
00831 string query("\x01weird\x00stuff\x7f", 13);
00832 Xapian::Query qobj = qp.parse_query(query);
00833 tout << "Query: " << query << '\n';
00834 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((weird:(pos=1) OR stuff:(pos=2)))");
00835 return true;
00836 }
00837
00838
00839 static bool test_qp_flag_wildcard1()
00840 {
00841 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
00842 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
00843 #else
00844 Xapian::WritableDatabase db(Xapian::InMemory::open());
00845 Xapian::Document doc;
00846 doc.add_term("abc");
00847 doc.add_term("main");
00848 doc.add_term("muscat");
00849 doc.add_term("muscle");
00850 doc.add_term("musclebound");
00851 doc.add_term("muscular");
00852 doc.add_term("mutton");
00853 db.add_document(doc);
00854 Xapian::QueryParser qp;
00855 qp.set_database(db);
00856 Xapian::Query qobj = qp.parse_query("ab*", Xapian::QueryParser::FLAG_WILDCARD);
00857 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(abc:(pos=1))");
00858 qobj = qp.parse_query("muscle*", Xapian::QueryParser::FLAG_WILDCARD);
00859 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((muscle:(pos=1) SYNONYM musclebound:(pos=1)))");
00860 qobj = qp.parse_query("meat*", Xapian::QueryParser::FLAG_WILDCARD);
00861 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00862 qobj = qp.parse_query("musc*", Xapian::QueryParser::FLAG_WILDCARD);
00863 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((muscat:(pos=1) SYNONYM muscle:(pos=1) SYNONYM musclebound:(pos=1) SYNONYM muscular:(pos=1)))");
00864 qobj = qp.parse_query("mutt*", Xapian::QueryParser::FLAG_WILDCARD);
00865 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mutton:(pos=1))");
00866
00867
00868 qobj = qp.parse_query("mUTTON++");
00869 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mutton:(pos=1))");
00870
00871 unsigned flags = Xapian::QueryParser::FLAG_WILDCARD |
00872 Xapian::QueryParser::FLAG_LOVEHATE;
00873 qobj = qp.parse_query("+mai* main", flags);
00874 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((main:(pos=1) AND_MAYBE main:(pos=2)))");
00875
00876
00877 qobj = qp.parse_query("foo* main", flags);
00878 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00879 qobj = qp.parse_query("main foo*", flags);
00880 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00881 qobj = qp.parse_query("+foo* main", flags);
00882 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00883 qobj = qp.parse_query("main +foo*", flags);
00884 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00885 qobj = qp.parse_query("foo* +main", flags);
00886 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00887 qobj = qp.parse_query("+main foo*", flags);
00888 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00889 qobj = qp.parse_query("+foo* +main", flags);
00890 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00891 qobj = qp.parse_query("+main +foo*", flags);
00892 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00893 qobj = qp.parse_query("foo* mai", flags);
00894 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=2))");
00895 qobj = qp.parse_query("mai foo*", flags);
00896 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=1))");
00897 qobj = qp.parse_query("+foo* mai", flags);
00898 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00899 qobj = qp.parse_query("mai +foo*", flags);
00900 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00901 qobj = qp.parse_query("foo* +mai", flags);
00902 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=2))");
00903 qobj = qp.parse_query("+mai foo*", flags);
00904 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=1))");
00905 qobj = qp.parse_query("+foo* +mai", flags);
00906 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00907 qobj = qp.parse_query("+mai +foo*", flags);
00908 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00909 qobj = qp.parse_query("-foo* main", flags);
00910 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00911 qobj = qp.parse_query("main -foo*", flags);
00912 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00913 qobj = qp.parse_query("main -foo* -bar", flags);
00914 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((main:(pos=1) AND_NOT bar:(pos=3)))");
00915 qobj = qp.parse_query("main -bar -foo*", flags);
00916 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((main:(pos=1) AND_NOT bar:(pos=2)))");
00917
00918 qp.set_default_op(Xapian::Query::OP_AND);
00919 qobj = qp.parse_query("foo* main", flags);
00920 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00921 qobj = qp.parse_query("main foo*", flags);
00922 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00923 qp.set_default_op(Xapian::Query::OP_AND);
00924 qobj = qp.parse_query("+foo* main", flags);
00925 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00926 qobj = qp.parse_query("main +foo*", flags);
00927 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00928 qobj = qp.parse_query("-foo* main", flags);
00929 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00930 qobj = qp.parse_query("main -foo*", flags);
00931 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00932
00933 qobj = qp.parse_query("foo* -main", Xapian::QueryParser::FLAG_WILDCARD);
00934 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00935
00936 qobj = qp.parse_query("abc muscl* main", flags);
00937 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) AND (muscle:(pos=2) SYNONYM musclebound:(pos=2)) AND main:(pos=3)))");
00938 return true;
00939 #endif
00940 }
00941
00942
00943 static bool test_qp_flag_wildcard2()
00944 {
00945 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
00946 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
00947 #else
00948 Xapian::WritableDatabase db(Xapian::InMemory::open());
00949 Xapian::Document doc;
00950 doc.add_term("Aheinlein");
00951 doc.add_term("Ahuxley");
00952 doc.add_term("hello");
00953 db.add_document(doc);
00954 Xapian::QueryParser qp;
00955 qp.set_database(db);
00956 qp.add_prefix("author", "A");
00957 Xapian::Query qobj;
00958 qobj = qp.parse_query("author:h*", Xapian::QueryParser::FLAG_WILDCARD);
00959 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((Aheinlein:(pos=1) SYNONYM Ahuxley:(pos=1)))");
00960 qobj = qp.parse_query("author:h* test", Xapian::QueryParser::FLAG_WILDCARD);
00961 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((Aheinlein:(pos=1) SYNONYM Ahuxley:(pos=1)) OR test:(pos=2)))");
00962 return true;
00963 #endif
00964 }
00965
00966 #ifdef XAPIAN_HAS_INMEMORY_BACKEND
00967 static void
00968 test_qp_flag_wildcard1_helper(const Xapian::Database &db,
00969 Xapian::termcount max_expansion,
00970 const string & query_string)
00971 {
00972 Xapian::QueryParser qp;
00973 qp.set_database(db);
00974 qp.set_max_wildcard_expansion(max_expansion);
00975 Xapian::Enquire e(db);
00976 e.set_query(qp.parse_query(query_string, Xapian::QueryParser::FLAG_WILDCARD));
00977
00978
00979 e.get_mset(0, 10);
00980 }
00981 #endif
00982
00983
00984 static bool test_qp_flag_wildcard3()
00985 {
00986 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
00987 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
00988 #else
00989 Xapian::WritableDatabase db(Xapian::InMemory::open());
00990 Xapian::Document doc;
00991 doc.add_term("abc");
00992 doc.add_term("main");
00993 doc.add_term("muscat");
00994 doc.add_term("muscle");
00995 doc.add_term("musclebound");
00996 doc.add_term("muscular");
00997 doc.add_term("mutton");
00998 db.add_document(doc);
00999
01000
01001 test_qp_flag_wildcard1_helper(db, 0, "z*");
01002 test_qp_flag_wildcard1_helper(db, 0, "m*");
01003
01004
01005 test_qp_flag_wildcard1_helper(db, 1, "z*");
01006 test_qp_flag_wildcard1_helper(db, 1, "ab*");
01007 test_qp_flag_wildcard1_helper(db, 2, "muscle*");
01008 test_qp_flag_wildcard1_helper(db, 4, "musc*");
01009 test_qp_flag_wildcard1_helper(db, 4, "mus*");
01010 test_qp_flag_wildcard1_helper(db, 5, "mu*");
01011 test_qp_flag_wildcard1_helper(db, 6, "m*");
01012
01013
01014 TEST_EXCEPTION(Xapian::QueryParserError,
01015 test_qp_flag_wildcard1_helper(db, 1, "muscle*"));
01016 TEST_EXCEPTION(Xapian::QueryParserError,
01017 test_qp_flag_wildcard1_helper(db, 3, "musc*"));
01018 TEST_EXCEPTION(Xapian::QueryParserError,
01019 test_qp_flag_wildcard1_helper(db, 3, "mus*"));
01020 TEST_EXCEPTION(Xapian::QueryParserError,
01021 test_qp_flag_wildcard1_helper(db, 4, "mu*"));
01022 TEST_EXCEPTION(Xapian::QueryParserError,
01023 test_qp_flag_wildcard1_helper(db, 5, "m*"));
01024
01025 return true;
01026 #endif
01027 }
01028
01029
01030 static bool test_qp_flag_partial1()
01031 {
01032 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
01033 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
01034 #else
01035 Xapian::WritableDatabase db(Xapian::InMemory::open());
01036 Xapian::Document doc;
01037 Xapian::Stem stemmer("english");
01038 doc.add_term("abc");
01039 doc.add_term("main");
01040 doc.add_term("muscat");
01041 doc.add_term("muscle");
01042 doc.add_term("musclebound");
01043 doc.add_term("muscular");
01044 doc.add_term("mutton");
01045 doc.add_term("Z" + stemmer("outside"));
01046 doc.add_term("Z" + stemmer("out"));
01047 doc.add_term("outside");
01048 doc.add_term("out");
01049 doc.add_term("XTcove");
01050 doc.add_term("XTcows");
01051 doc.add_term("XTcowl");
01052 doc.add_term("XTcox");
01053 doc.add_term("ZXTcow");
01054 doc.add_term("XONEpartial");
01055 doc.add_term("XONEpartial2");
01056 doc.add_term("XTWOpartial3");
01057 doc.add_term("XTWOpartial4");
01058 db.add_document(doc);
01059 Xapian::QueryParser qp;
01060 qp.set_database(db);
01061 qp.set_stemmer(stemmer);
01062 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01063 qp.add_prefix("title", "XT");
01064 qp.add_prefix("double", "XONE");
01065 qp.add_prefix("double", "XTWO");
01066
01067
01068 Xapian::Query qobj = qp.parse_query("a", Xapian::QueryParser::FLAG_PARTIAL);
01069 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) OR Za:(pos=1)))");
01070 qobj = qp.parse_query("ab", Xapian::QueryParser::FLAG_PARTIAL);
01071 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) OR Zab:(pos=1)))");
01072 qobj = qp.parse_query("muscle", Xapian::QueryParser::FLAG_PARTIAL);
01073 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((muscle:(pos=1) SYNONYM musclebound:(pos=1)) OR Zmuscl:(pos=1)))");
01074 qobj = qp.parse_query("meat", Xapian::QueryParser::FLAG_PARTIAL);
01075 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(Zmeat:(pos=1))");
01076 qobj = qp.parse_query("musc", Xapian::QueryParser::FLAG_PARTIAL);
01077 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((muscat:(pos=1) SYNONYM muscle:(pos=1) SYNONYM musclebound:(pos=1) SYNONYM muscular:(pos=1)) OR Zmusc:(pos=1)))");
01078 qobj = qp.parse_query("mutt", Xapian::QueryParser::FLAG_PARTIAL);
01079 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((mutton:(pos=1) OR Zmutt:(pos=1)))");
01080 qobj = qp.parse_query("abc musc", Xapian::QueryParser::FLAG_PARTIAL);
01081 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((Zabc:(pos=1) OR (muscat:(pos=2) SYNONYM muscle:(pos=2) SYNONYM musclebound:(pos=2) SYNONYM muscular:(pos=2)) OR Zmusc:(pos=2)))");
01082 qobj = qp.parse_query("a* mutt", Xapian::QueryParser::FLAG_PARTIAL | Xapian::QueryParser::FLAG_WILDCARD);
01083 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) OR mutton:(pos=2) OR Zmutt:(pos=2)))");
01084
01085
01086 qobj = qp.parse_query("o", Xapian::QueryParser::FLAG_PARTIAL);
01087 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zo:(pos=1)))");
01088 qobj = qp.parse_query("ou", Xapian::QueryParser::FLAG_PARTIAL);
01089 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zou:(pos=1)))");
01090 qobj = qp.parse_query("out", Xapian::QueryParser::FLAG_PARTIAL);
01091 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zout:(pos=1)))");
01092 qobj = qp.parse_query("outs", Xapian::QueryParser::FLAG_PARTIAL);
01093 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zout:(pos=1)))");
01094 qobj = qp.parse_query("outsi", Xapian::QueryParser::FLAG_PARTIAL);
01095 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsi:(pos=1)))");
01096 qobj = qp.parse_query("outsid", Xapian::QueryParser::FLAG_PARTIAL);
01097 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsid:(pos=1)))");
01098 qobj = qp.parse_query("outside", Xapian::QueryParser::FLAG_PARTIAL);
01099 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsid:(pos=1)))");
01100
01101
01102 qobj = qp.parse_query("Out", Xapian::QueryParser::FLAG_PARTIAL);
01103 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR out:(pos=1)))");
01104 qobj = qp.parse_query("Outs", Xapian::QueryParser::FLAG_PARTIAL);
01105 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR outs:(pos=1)))");
01106 qobj = qp.parse_query("Outside", Xapian::QueryParser::FLAG_PARTIAL);
01107 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(outside:(pos=1,wqf=2))");
01108
01109
01110 qp.set_stemming_strategy(Xapian::QueryParser::STEM_ALL);
01111 qobj = qp.parse_query("Out", Xapian::QueryParser::FLAG_PARTIAL);
01112 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR out:(pos=1)))");
01113 qobj = qp.parse_query("Outs", Xapian::QueryParser::FLAG_PARTIAL);
01114 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR out:(pos=1)))");
01115 qobj = qp.parse_query("Outside", Xapian::QueryParser::FLAG_PARTIAL);
01116 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR outsid:(pos=1)))");
01117
01118
01119 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01120 qobj = qp.parse_query("title:cow", Xapian::QueryParser::FLAG_PARTIAL);
01121 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XTcowl:(pos=1) SYNONYM XTcows:(pos=1)) OR ZXTcow:(pos=1)))");
01122 qobj = qp.parse_query("title:cows", Xapian::QueryParser::FLAG_PARTIAL);
01123 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((XTcows:(pos=1) OR ZXTcow:(pos=1)))");
01124 qobj = qp.parse_query("title:Cow", Xapian::QueryParser::FLAG_PARTIAL);
01125 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XTcowl:(pos=1) SYNONYM XTcows:(pos=1)) OR XTcow:(pos=1)))");
01126 qobj = qp.parse_query("title:Cows", Xapian::QueryParser::FLAG_PARTIAL);
01127 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(XTcows:(pos=1,wqf=2))");
01128
01129
01130
01131
01132 qobj = qp.parse_query("double:vision", Xapian::QueryParser::FLAG_PARTIAL);
01133 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXONEvision:(pos=1) SYNONYM ZXTWOvision:(pos=1)))");
01134
01135
01136 qobj = qp.parse_query("double:part", Xapian::QueryParser::FLAG_PARTIAL);
01137 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XONEpartial:(pos=1) SYNONYM XONEpartial2:(pos=1) SYNONYM XTWOpartial3:(pos=1) SYNONYM XTWOpartial4:(pos=1)) OR (ZXONEpart:(pos=1) SYNONYM ZXTWOpart:(pos=1))))");
01138
01139
01140
01141 qp.set_stemming_strategy(Xapian::QueryParser::STEM_NONE);
01142 qobj = qp.parse_query("double:part", Xapian::QueryParser::FLAG_PARTIAL);
01143 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XONEpartial:(pos=1) SYNONYM XONEpartial2:(pos=1) SYNONYM XTWOpartial3:(pos=1) SYNONYM XTWOpartial4:(pos=1)) OR (XONEpart:(pos=1) SYNONYM XTWOpart:(pos=1))))");
01144 qobj = qp.parse_query("double:partial", Xapian::QueryParser::FLAG_PARTIAL);
01145 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XONEpartial:(pos=1) SYNONYM XONEpartial2:(pos=1) SYNONYM XTWOpartial3:(pos=1) SYNONYM XTWOpartial4:(pos=1)) OR (XONEpartial:(pos=1) SYNONYM XTWOpartial:(pos=1))))");
01146
01147 return true;
01148 #endif
01149 }
01150
01151 static bool test_qp_flag_bool_any_case1()
01152 {
01153 using Xapian::QueryParser;
01154 Xapian::QueryParser qp;
01155 Xapian::Query qobj;
01156 qobj = qp.parse_query("to and fro", QueryParser::FLAG_BOOLEAN | QueryParser::FLAG_BOOLEAN_ANY_CASE);
01157 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) AND fro:(pos=2)))");
01158 qobj = qp.parse_query("to and fro", QueryParser::FLAG_BOOLEAN);
01159 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) OR and:(pos=2) OR fro:(pos=3)))");
01160
01161 qobj = qp.parse_query("to And fro", QueryParser::FLAG_BOOLEAN | QueryParser::FLAG_BOOLEAN_ANY_CASE);
01162 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) AND fro:(pos=2)))");
01163 qobj = qp.parse_query("to And fro", QueryParser::FLAG_BOOLEAN);
01164 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) OR and:(pos=2) OR fro:(pos=3)))");
01165 return true;
01166 }
01167
01168 static const test test_stop_queries[] = {
01169 { "test the queryparser", "(test:(pos=1) AND queryparser:(pos=3))" },
01170
01171
01172 { "test AND the AND queryparser", "(test:(pos=1) AND the:(pos=2) AND queryparser:(pos=3))" },
01173
01174
01175 { "the", "the:(pos=1)" },
01176
01177
01178
01179
01180 { "an the a", "(an:(pos=1) AND the:(pos=2) AND a:(pos=3))" },
01181
01182
01183 { "the AND a an", "(the:(pos=1) AND a:(pos=2) AND an:(pos=3))" },
01184 { NULL, NULL }
01185 };
01186
01187 static bool test_qp_stopper1()
01188 {
01189 Xapian::QueryParser qp;
01190 const char * stopwords[] = { "a", "an", "the" };
01191 Xapian::SimpleStopper stop(stopwords, stopwords + 3);
01192 qp.set_stopper(&stop);
01193 qp.set_default_op(Xapian::Query::OP_AND);
01194 for (const test *p = test_stop_queries; p->query; ++p) {
01195 string expect, parsed;
01196 if (p->expect)
01197 expect = p->expect;
01198 else
01199 expect = "parse error";
01200 try {
01201 Xapian::Query qobj = qp.parse_query(p->query);
01202 parsed = qobj.get_description();
01203 expect = string("Xapian::Query(") + expect + ')';
01204 } catch (const Xapian::QueryParserError &e) {
01205 parsed = e.get_msg();
01206 } catch (const Xapian::Error &e) {
01207 parsed = e.get_description();
01208 } catch (...) {
01209 parsed = "Unknown exception!";
01210 }
01211 tout << "Query: " << p->query << '\n';
01212 TEST_STRINGS_EQUAL(parsed, expect);
01213 }
01214 return true;
01215 }
01216
01217 static const test test_pure_not_queries[] = {
01218 { "NOT windows", "(<alldocuments> AND_NOT Zwindow:(pos=1))" },
01219 { "a AND (NOT b)", "(Za:(pos=1) AND (<alldocuments> AND_NOT Zb:(pos=2)))" },
01220 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
01221 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
01222 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
01223 { NULL, NULL }
01224 };
01225
01226 static bool test_qp_flag_pure_not1()
01227 {
01228 using Xapian::QueryParser;
01229 Xapian::QueryParser qp;
01230 qp.set_stemmer(Xapian::Stem("english"));
01231 qp.set_stemming_strategy(QueryParser::STEM_SOME);
01232 for (const test *p = test_pure_not_queries; p->query; ++p) {
01233 string expect, parsed;
01234 if (p->expect)
01235 expect = p->expect;
01236 else
01237 expect = "parse error";
01238 try {
01239 Xapian::Query qobj = qp.parse_query(p->query,
01240 QueryParser::FLAG_BOOLEAN |
01241 QueryParser::FLAG_PURE_NOT);
01242 parsed = qobj.get_description();
01243 expect = string("Xapian::Query(") + expect + ')';
01244 } catch (const Xapian::QueryParserError &e) {
01245 parsed = e.get_msg();
01246 } catch (const Xapian::Error &e) {
01247 parsed = e.get_description();
01248 } catch (...) {
01249 parsed = "Unknown exception!";
01250 }
01251 tout << "Query: " << p->query << '\n';
01252 TEST_STRINGS_EQUAL(parsed, expect);
01253 }
01254 return true;
01255 }
01256
01257
01258
01259
01260 static bool test_qp_unstem_boolean_prefix()
01261 {
01262 Xapian::QueryParser qp;
01263 qp.add_boolean_prefix("test", "XTEST");
01264 Xapian::Query q = qp.parse_query("hello test:foo");
01265 TEST_STRINGS_EQUAL(q.get_description(), "Xapian::Query((hello:(pos=1) FILTER XTESTfoo))");
01266 Xapian::TermIterator u = qp.unstem_begin("XTESTfoo");
01267 TEST(u != qp.unstem_end("XTESTfoo"));
01268 TEST_EQUAL(*u, "test:foo");
01269 ++u;
01270 TEST(u == qp.unstem_end("XTESTfoo"));
01271 return true;
01272 }
01273
01274 static const test test_value_range1_queries[] = {
01275 { "a..b", "VALUE_RANGE 1 a b" },
01276 { "$50..100", "VALUE_RANGE 1 $50 100" },
01277 { "$50..$100", "VALUE_RANGE 1 $50 $100" },
01278 { "02/03/1979..10/12/1980", "VALUE_RANGE 1 02/03/1979 10/12/1980" },
01279 { "a..b hello", "(hello:(pos=1) FILTER VALUE_RANGE 1 a b)" },
01280 { "hello a..b", "(hello:(pos=1) FILTER VALUE_RANGE 1 a b)" },
01281 { "hello a..b world", "((hello:(pos=1) OR world:(pos=2)) FILTER VALUE_RANGE 1 a b)" },
01282 { "hello a..b test:foo", "(hello:(pos=1) FILTER (VALUE_RANGE 1 a b AND XTESTfoo))" },
01283 { "hello a..b test:foo test:bar", "(hello:(pos=1) FILTER (VALUE_RANGE 1 a b AND (XTESTfoo OR XTESTbar)))" },
01284 { "hello a..b c..d test:foo", "(hello:(pos=1) FILTER ((VALUE_RANGE 1 a b OR VALUE_RANGE 1 c d) AND XTESTfoo))" },
01285 { "hello a..b c..d test:foo test:bar", "(hello:(pos=1) FILTER ((VALUE_RANGE 1 a b OR VALUE_RANGE 1 c d) AND (XTESTfoo OR XTESTbar)))" },
01286 { "-5..7", "VALUE_RANGE 1 -5 7" },
01287 { "hello -5..7", "(hello:(pos=1) FILTER VALUE_RANGE 1 -5 7)" },
01288 { "-5..7 hello", "(hello:(pos=1) FILTER VALUE_RANGE 1 -5 7)" },
01289 { "\"time flies\" 09:00..12:30", "((time:(pos=1) PHRASE 2 flies:(pos=2)) FILTER VALUE_RANGE 1 09:00 12:30)" },
01290
01291 { "..b", "VALUE_RANGE 1 b" },
01292 { "a..", "VALUE_GE 1 a" },
01293 { NULL, NULL }
01294 };
01295
01296
01297 static bool test_qp_value_range1()
01298 {
01299 Xapian::QueryParser qp;
01300 qp.add_boolean_prefix("test", "XTEST");
01301 Xapian::StringValueRangeProcessor vrp(1);
01302 qp.add_valuerangeprocessor(&vrp);
01303 for (const test *p = test_value_range1_queries; p->query; ++p) {
01304 string expect, parsed;
01305 if (p->expect)
01306 expect = p->expect;
01307 else
01308 expect = "parse error";
01309 try {
01310 Xapian::Query qobj = qp.parse_query(p->query);
01311 parsed = qobj.get_description();
01312 expect = string("Xapian::Query(") + expect + ')';
01313 } catch (const Xapian::QueryParserError &e) {
01314 parsed = e.get_msg();
01315 } catch (const Xapian::Error &e) {
01316 parsed = e.get_description();
01317 } catch (...) {
01318 parsed = "Unknown exception!";
01319 }
01320 tout << "Query: " << p->query << '\n';
01321 TEST_STRINGS_EQUAL(parsed, expect);
01322 }
01323 return true;
01324 }
01325
01326 static const test test_value_range2_queries[] = {
01327 { "a..b", "VALUE_RANGE 3 a b" },
01328 { "1..12", "VALUE_RANGE 2 \240 \256" },
01329 { "20070201..20070228", "VALUE_RANGE 1 20070201 20070228" },
01330 { "$10..20", "VALUE_RANGE 4 \255 \261" },
01331 { "$10..$20", "VALUE_RANGE 4 \255 \261" },
01332
01333 { "$..20", "VALUE_RANGE 4 \261" },
01334 { "$10..", "VALUE_GE 4 \255" },
01335 { "12..42kg", "VALUE_RANGE 5 \256 \265@" },
01336 { "12kg..42kg", "VALUE_RANGE 5 \256 \265@" },
01337 { "12kg..42", "VALUE_RANGE 3 12kg 42" },
01338 { "10..$20", "VALUE_RANGE 3 10 $20" },
01339 { "1999-03-12..2020-12-30", "VALUE_RANGE 1 19990312 20201230" },
01340 { "1999/03/12..2020/12/30", "VALUE_RANGE 1 19990312 20201230" },
01341 { "1999.03.12..2020.12.30", "VALUE_RANGE 1 19990312 20201230" },
01342
01343 { "..2020.12.30", "VALUE_RANGE 1 20201230" },
01344 { "1999.03.12..", "VALUE_GE 1 19990312" },
01345 { "12/03/99..12/04/01", "VALUE_RANGE 1 19990312 20010412" },
01346 { "03-12-99..04-14-01", "VALUE_RANGE 1 19990312 20010414" },
01347 { "(test:a..test:b hello)", "(hello:(pos=1) FILTER VALUE_RANGE 3 test:a test:b)" },
01348 { "12..42kg 5..6kg 1..12", "0 * (VALUE_RANGE 2 \240 \256 AND (VALUE_RANGE 5 \256 \265@ OR VALUE_RANGE 5 \251 \252))" },
01349
01350
01351 { "$12a..13", "VALUE_RANGE 3 $12a 13" },
01352 { "$12..13b", "VALUE_RANGE 3 $12 13b" },
01353 { "$12..12kg", "VALUE_RANGE 3 $12 12kg" },
01354 { "12..b12kg", "VALUE_RANGE 3 12 b12kg" },
01355 { NULL, NULL }
01356 };
01357
01358
01359 static bool test_qp_value_range2()
01360 {
01361 Xapian::QueryParser qp;
01362 qp.add_boolean_prefix("test", "XTEST");
01363 Xapian::DateValueRangeProcessor vrp_date(1);
01364 Xapian::NumberValueRangeProcessor vrp_num(2);
01365 Xapian::StringValueRangeProcessor vrp_str(3);
01366 Xapian::NumberValueRangeProcessor vrp_cash(4, "$");
01367 Xapian::NumberValueRangeProcessor vrp_weight(5, "kg", false);
01368 qp.add_valuerangeprocessor(&vrp_date);
01369 qp.add_valuerangeprocessor(&vrp_num);
01370 qp.add_valuerangeprocessor(&vrp_cash);
01371 qp.add_valuerangeprocessor(&vrp_weight);
01372 qp.add_valuerangeprocessor(&vrp_str);
01373 for (const test *p = test_value_range2_queries; p->query; ++p) {
01374 string expect, parsed;
01375 if (p->expect)
01376 expect = p->expect;
01377 else
01378 expect = "parse error";
01379 try {
01380 Xapian::Query qobj = qp.parse_query(p->query);
01381 parsed = qobj.get_description();
01382 expect = string("Xapian::Query(") + expect + ')';
01383 } catch (const Xapian::QueryParserError &e) {
01384 parsed = e.get_msg();
01385 } catch (const Xapian::Error &e) {
01386 parsed = e.get_description();
01387 } catch (...) {
01388 parsed = "Unknown exception!";
01389 }
01390 tout << "Query: " << p->query << '\n';
01391 TEST_STRINGS_EQUAL(parsed, expect);
01392 }
01393 return true;
01394 }
01395
01396
01397 static bool test_qp_value_range3()
01398 {
01399 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
01400 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
01401 #else
01402 Xapian::WritableDatabase db(Xapian::InMemory::open());
01403 double low = -10;
01404 int steps = 60;
01405 double step = 0.5;
01406
01407 for (int i = 0; i <= steps; ++i) {
01408 double v = low + i * step;
01409 Xapian::Document doc;
01410 doc.add_value(1, Xapian::sortable_serialise(v));
01411 db.add_document(doc);
01412 }
01413
01414 Xapian::NumberValueRangeProcessor vrp_num(1);
01415 Xapian::QueryParser qp;
01416 qp.add_valuerangeprocessor(&vrp_num);
01417
01418 for (int j = 0; j <= steps; ++j) {
01419 double start = low + j * step;
01420 for (int k = 0; k <= steps; ++k) {
01421 double end = low + k * step;
01422 string query = str(start) + ".." + str(end);
01423 tout << "Query: " << query << '\n';
01424 Xapian::Query qobj = qp.parse_query(query);
01425 Xapian::Enquire enq(db);
01426 enq.set_query(qobj);
01427 Xapian::MSet mset = enq.get_mset(0, steps + 1);
01428 if (end < start) {
01429 TEST_EQUAL(mset.size(), 0);
01430 } else {
01431 TEST_EQUAL(mset.size(), 1u + (k - j));
01432 for (unsigned int m = 0; m != mset.size(); ++m) {
01433 double v = start + m * step;
01434 TEST_EQUAL(mset[m].get_document().get_value(1),
01435 Xapian::sortable_serialise(v));
01436 }
01437 }
01438 }
01439 }
01440 return true;
01441 #endif
01442 }
01443
01444 static const double test_value_range_numbers[] = {
01445 #ifdef INFINITY
01446 -INFINITY,
01447 #endif
01448 -HUGE_VAL,
01449 -DBL_MAX,
01450 -pow(2.0, 1022),
01451 -1024.5,
01452 -3.14159265358979323846,
01453 -3,
01454 -2,
01455 -1.8,
01456 -1.1,
01457 -1,
01458 -0.5,
01459 -0.2,
01460 -0.1,
01461 -0.000005,
01462 -0.000002,
01463 -0.000001,
01464 -pow(2.0, -1023),
01465 -pow(2.0, -1024),
01466 -pow(2.0, -1074),
01467 -DBL_MIN,
01468 0,
01469 DBL_MIN,
01470 pow(2.0, -1074),
01471 pow(2.0, -1024),
01472 pow(2.0, -1023),
01473 0.000001,
01474 0.000002,
01475 0.000005,
01476 0.1,
01477 0.2,
01478 0.5,
01479 1,
01480 1.1,
01481 1.8,
01482 2,
01483 3,
01484 3.14159265358979323846,
01485 1024.5,
01486 pow(2.0, 1022),
01487 DBL_MAX,
01488 HUGE_VAL,
01489 #ifdef INFINITY
01490 INFINITY,
01491 #endif
01492
01493 64
01494 };
01495
01496 static const test test_value_range4_queries[] = {
01497 { "id:19254@foo..example.com", "0 * Q19254@foo..example.com" },
01498 { "hello:world", "0 * XHELLOworld" },
01499 { "hello:mum..world", "VALUE_RANGE 1 mum world" },
01500 { NULL, NULL }
01501 };
01502
01509 static bool test_qp_value_range4()
01510 {
01511 Xapian::QueryParser qp;
01512 qp.add_boolean_prefix("id", "Q");
01513 qp.add_boolean_prefix("hello", "XHELLO");
01514 Xapian::StringValueRangeProcessor vrp_str(1, "hello:");
01515 qp.add_valuerangeprocessor(&vrp_str);
01516 for (const test *p = test_value_range4_queries; p->query; ++p) {
01517 string expect, parsed;
01518 if (p->expect)
01519 expect = p->expect;
01520 else
01521 expect = "parse error";
01522 try {
01523 Xapian::Query qobj = qp.parse_query(p->query);
01524 parsed = qobj.get_description();
01525 expect = string("Xapian::Query(") + expect + ')';
01526 } catch (const Xapian::QueryParserError &e) {
01527 parsed = e.get_msg();
01528 } catch (const Xapian::Error &e) {
01529 parsed = e.get_description();
01530 } catch (...) {
01531 parsed = "Unknown exception!";
01532 }
01533 tout << "Query: " << p->query << '\n';
01534 TEST_STRINGS_EQUAL(parsed, expect);
01535 }
01536 return true;
01537 }
01538
01539
01540
01541 static bool test_value_range_serialise1()
01542 {
01543 double prevnum = 0;
01544 string prevstr;
01545 bool started = false;
01546 for (const double *p = test_value_range_numbers; *p != 64; ++p) {
01547 double num = *p;
01548 tout << "Number: " << num << '\n';
01549 string str = Xapian::sortable_serialise(num);
01550 tout << "String: " << str << '\n';
01551 TEST_EQUAL(Xapian::sortable_unserialise(str), num);
01552
01553 if (started) {
01554 int num_cmp = 0;
01555 if (prevnum < num) {
01556 num_cmp = -1;
01557 } else if (prevnum > num) {
01558 num_cmp = 1;
01559 }
01560 int str_cmp = 0;
01561 if (prevstr < str) {
01562 str_cmp = -1;
01563 } else if (prevstr > str) {
01564 str_cmp = 1;
01565 }
01566
01567 TEST_AND_EXPLAIN(num_cmp == str_cmp,
01568 "Numbers " << prevnum << " and " << num <<
01569 " don't sort the same way as their string "
01570 "counterparts");
01571 }
01572
01573 prevnum = num;
01574 prevstr = str;
01575 started = true;
01576 }
01577 return true;
01578 }
01579
01580 static const test test_value_daterange1_queries[] = {
01581 { "12/03/99..12/04/01", "VALUE_RANGE 1 19991203 20011204" },
01582 { "03-12-99..04-14-01", "VALUE_RANGE 1 19990312 20010414" },
01583 { "01/30/60..02/02/59", "VALUE_RANGE 1 19600130 20590202" },
01584 { "1999-03-12..2001-04-14", "VALUE_RANGE 1 19990312 20010414" },
01585 { "12/03/99..02", "Unknown range operation" },
01586 { "1999-03-12..2001", "Unknown range operation" },
01587 { NULL, NULL }
01588 };
01589
01590
01591 static bool test_qp_value_daterange1()
01592 {
01593 Xapian::QueryParser qp;
01594 Xapian::DateValueRangeProcessor vrp_date(1, true, 1960);
01595 qp.add_valuerangeprocessor(&vrp_date);
01596 for (const test *p = test_value_daterange1_queries; p->query; ++p) {
01597 string expect, parsed;
01598 if (p->expect)
01599 expect = p->expect;
01600 else
01601 expect = "parse error";
01602 try {
01603 Xapian::Query qobj = qp.parse_query(p->query);
01604 parsed = qobj.get_description();
01605 expect = string("Xapian::Query(") + expect + ')';
01606 } catch (const Xapian::QueryParserError &e) {
01607 parsed = e.get_msg();
01608 } catch (const Xapian::Error &e) {
01609 parsed = e.get_description();
01610 } catch (...) {
01611 parsed = "Unknown exception!";
01612 }
01613 tout << "Query: " << p->query << '\n';
01614 TEST_STRINGS_EQUAL(parsed, expect);
01615 }
01616 return true;
01617 }
01618
01619 static const test test_value_daterange2_queries[] = {
01620 { "created:12/03/99..12/04/01", "VALUE_RANGE 1 19991203 20011204" },
01621 { "modified:03-12-99..04-14-01", "VALUE_RANGE 2 19990312 20010414" },
01622 { "accessed:01/30/70..02/02/69", "VALUE_RANGE 3 19700130 20690202" },
01623 { "1999-03-12..2001-04-14", "Unknown range operation" },
01624 { "12/03/99..created:12/04/01", "Unknown range operation" },
01625 { "12/03/99created:..12/04/01", "Unknown range operation" },
01626 { "12/03/99..12/04/01created:", "Unknown range operation" },
01627 { "12/03/99..02", "Unknown range operation" },
01628 { "1999-03-12..2001", "Unknown range operation" },
01629 { NULL, NULL }
01630 };
01631
01632
01633 static bool test_qp_value_daterange2()
01634 {
01635 Xapian::QueryParser qp;
01636 Xapian::DateValueRangeProcessor vrp_cdate(1, "created:", true, true, 1970);
01637 Xapian::DateValueRangeProcessor vrp_mdate(2, "modified:", true, true, 1970);
01638 Xapian::DateValueRangeProcessor vrp_adate(3, "accessed:", true, true, 1970);
01639 qp.add_valuerangeprocessor(&vrp_cdate);
01640 qp.add_valuerangeprocessor(&vrp_mdate);
01641 qp.add_valuerangeprocessor(&vrp_adate);
01642 for (const test *p = test_value_daterange2_queries; p->query; ++p) {
01643 string expect, parsed;
01644 if (p->expect)
01645 expect = p->expect;
01646 else
01647 expect = "parse error";
01648 try {
01649 Xapian::Query qobj = qp.parse_query(p->query);
01650 parsed = qobj.get_description();
01651 expect = string("Xapian::Query(") + expect + ')';
01652 } catch (const Xapian::QueryParserError &e) {
01653 parsed = e.get_msg();
01654 } catch (const Xapian::Error &e) {
01655 parsed = e.get_description();
01656 } catch (...) {
01657 parsed = "Unknown exception!";
01658 }
01659 tout << "Query: " << p->query << '\n';
01660 TEST_STRINGS_EQUAL(parsed, expect);
01661 }
01662 return true;
01663 }
01664
01665 static const test test_value_stringrange1_queries[] = {
01666 { "tag:bar..foo", "VALUE_RANGE 1 bar foo" },
01667 { "bar..foo", "VALUE_RANGE 0 bar foo" },
01668 { NULL, NULL }
01669 };
01670
01671
01672 static bool test_qp_value_stringrange1()
01673 {
01674 Xapian::QueryParser qp;
01675 Xapian::StringValueRangeProcessor vrp_default(0);
01676 Xapian::StringValueRangeProcessor vrp_tag(1, "tag:", true);
01677 qp.add_valuerangeprocessor(&vrp_tag);
01678 qp.add_valuerangeprocessor(&vrp_default);
01679 for (const test *p = test_value_stringrange1_queries; p->query; ++p) {
01680 string expect, parsed;
01681 if (p->expect)
01682 expect = p->expect;
01683 else
01684 expect = "parse error";
01685 try {
01686 Xapian::Query qobj = qp.parse_query(p->query);
01687 parsed = qobj.get_description();
01688 expect = string("Xapian::Query(") + expect + ')';
01689 } catch (const Xapian::QueryParserError &e) {
01690 parsed = e.get_msg();
01691 } catch (const Xapian::Error &e) {
01692 parsed = e.get_description();
01693 } catch (...) {
01694 parsed = "Unknown exception!";
01695 }
01696 tout << "Query: " << p->query << '\n';
01697 TEST_STRINGS_EQUAL(parsed, expect);
01698 }
01699 return true;
01700 }
01701
01702 struct AuthorValueRangeProcessor : public Xapian::ValueRangeProcessor {
01703 AuthorValueRangeProcessor() {}
01704
01705 Xapian::valueno operator()(std::string &begin, std::string &end) {
01706 if (!startswith(begin, "author:"))
01707 return Xapian::BAD_VALUENO;
01708 begin.erase(0, 7);
01709 begin = Xapian::Unicode::tolower(begin);
01710 end = Xapian::Unicode::tolower(end);
01711 return 4;
01712 }
01713 };
01714
01715 static const test test_value_customrange1_queries[] = {
01716 { "mars author:Asimov..Bradbury", "(mars:(pos=1) FILTER VALUE_RANGE 4 asimov bradbury)" },
01717 { NULL, NULL }
01718 };
01719
01720
01721 static bool test_qp_value_customrange1()
01722 {
01723 Xapian::QueryParser qp;
01724 AuthorValueRangeProcessor vrp_author;
01725 qp.add_valuerangeprocessor(&vrp_author);
01726 for (const test *p = test_value_customrange1_queries; p->query; ++p) {
01727 string expect, parsed;
01728 if (p->expect)
01729 expect = p->expect;
01730 else
01731 expect = "parse error";
01732 try {
01733 Xapian::Query qobj = qp.parse_query(p->query);
01734 parsed = qobj.get_description();
01735 expect = string("Xapian::Query(") + expect + ')';
01736 } catch (const Xapian::QueryParserError &e) {
01737 parsed = e.get_msg();
01738 } catch (const Xapian::Error &e) {
01739 parsed = e.get_description();
01740 } catch (...) {
01741 parsed = "Unknown exception!";
01742 }
01743 tout << "Query: " << p->query << '\n';
01744 TEST_STRINGS_EQUAL(parsed, expect);
01745 }
01746 return true;
01747 }
01748
01749 static bool test_qp_stoplist1()
01750 {
01751 Xapian::QueryParser qp;
01752 const char * stopwords[] = { "a", "an", "the" };
01753 Xapian::SimpleStopper stop(stopwords, stopwords + 3);
01754 qp.set_stopper(&stop);
01755
01756 Xapian::TermIterator i;
01757
01758 Xapian::Query query1 = qp.parse_query("some mice");
01759 i = qp.stoplist_begin();
01760 TEST(i == qp.stoplist_end());
01761
01762 Xapian::Query query2 = qp.parse_query("the cat");
01763 i = qp.stoplist_begin();
01764 TEST(i != qp.stoplist_end());
01765 TEST_EQUAL(*i, "the");
01766 ++i;
01767 TEST(i == qp.stoplist_end());
01768
01769
01770
01771 Xapian::Query query3 = qp.parse_query("an aardvark");
01772 i = qp.stoplist_begin();
01773 TEST(i != qp.stoplist_end());
01774 TEST_EQUAL(*i, "an");
01775 ++i;
01776 TEST(i == qp.stoplist_end());
01777
01778 return true;
01779 }
01780
01781 static const test test_mispelled_queries[] = {
01782 { "doucment search", "document search" },
01783 { "doucment seeacrh", "document search" },
01784 { "docment seeacrh test", "document search test" },
01785 { "\"paragahp pineapple\"", "\"paragraph pineapple\"" },
01786 { "\"paragahp pineapple\"", "\"paragraph pineapple\"" },
01787 { "test S.E.A.R.C.", "" },
01788 { "this AND that", "" },
01789 { "documento", "document" },
01790 { "documento-documento", "document-document" },
01791 { "documento-searcho", "document-search" },
01792 { "test saerch", "test search" },
01793 { "paragraf search", "paragraph search" },
01794 { NULL, NULL }
01795 };
01796
01797
01798 static bool test_qp_spell1()
01799 {
01800 mkdir(".flint", 0755);
01801 string dbdir = ".flint/qp_spell1";
01802 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01803
01804 Xapian::Document doc;
01805 doc.add_term("document", 6);
01806 doc.add_term("search", 7);
01807 doc.add_term("saerch", 1);
01808 doc.add_term("paragraph", 8);
01809 doc.add_term("paragraf", 2);
01810 db.add_document(doc);
01811
01812 db.add_spelling("document");
01813 db.add_spelling("search");
01814 db.add_spelling("paragraph");
01815 db.add_spelling("band");
01816
01817 Xapian::QueryParser qp;
01818 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01819 qp.set_database(db);
01820
01821 for (const test *p = test_mispelled_queries; p->query; ++p) {
01822 Xapian::Query q;
01823 q = qp.parse_query(p->query,
01824 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01825 Xapian::QueryParser::FLAG_BOOLEAN );
01826 tout << "Query: " << p->query << endl;
01827 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01828 }
01829
01830 return true;
01831 }
01832
01833
01834 static bool test_qp_spell2()
01835 {
01836 mkdir(".flint", 0755);
01837 string dbdir = ".flint/qp_spell2";
01838 Xapian::WritableDatabase db1(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01839
01840 db1.add_spelling("document");
01841 db1.add_spelling("search");
01842 db1.commit();
01843
01844 dbdir = ".flint/qp_spell2b";
01845 Xapian::WritableDatabase db2(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01846
01847 db2.add_spelling("document");
01848 db2.add_spelling("paragraph");
01849 db2.add_spelling("band");
01850
01851 Xapian::Database db;
01852 db.add_database(db1);
01853 db.add_database(db2);
01854
01855 Xapian::QueryParser qp;
01856 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01857 qp.set_database(db);
01858
01859 for (const test *p = test_mispelled_queries; p->query; ++p) {
01860 Xapian::Query q;
01861 q = qp.parse_query(p->query,
01862 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01863 Xapian::QueryParser::FLAG_BOOLEAN );
01864 tout << "Query: " << p->query << endl;
01865 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01866 }
01867
01868 return true;
01869 }
01870
01871 static const test test_mispelled_wildcard_queries[] = {
01872 { "doucment", "document" },
01873 { "doucment*", "" },
01874 { "doucment* seearch", "doucment* search" },
01875 { "doucment* search", "" },
01876 { NULL, NULL }
01877 };
01878
01879
01880
01881 static bool test_qp_spellwild1()
01882 {
01883 mkdir(".flint", 0755);
01884 string dbdir = ".flint/qp_spellwild1";
01885 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01886
01887 db.add_spelling("document");
01888 db.add_spelling("search");
01889 db.add_spelling("paragraph");
01890 db.add_spelling("band");
01891
01892 Xapian::QueryParser qp;
01893 qp.set_database(db);
01894
01895 const test *p;
01896 for (p = test_mispelled_queries; p->query; ++p) {
01897 Xapian::Query q;
01898 q = qp.parse_query(p->query,
01899 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01900 Xapian::QueryParser::FLAG_BOOLEAN |
01901 Xapian::QueryParser::FLAG_WILDCARD);
01902 tout << "Query: " << p->query << endl;
01903 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01904 }
01905 for (p = test_mispelled_wildcard_queries; p->query; ++p) {
01906 Xapian::Query q;
01907 q = qp.parse_query(p->query,
01908 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01909 Xapian::QueryParser::FLAG_BOOLEAN |
01910 Xapian::QueryParser::FLAG_WILDCARD);
01911 tout << "Query: " << p->query << endl;
01912 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01913 }
01914
01915 return true;
01916 }
01917
01918 static const test test_mispelled_partial_queries[] = {
01919 { "doucment", "" },
01920 { "doucment ", "document " },
01921 { "documen", "" },
01922 { "documen ", "document " },
01923 { "seearch documen", "search documen" },
01924 { "search documen", "" },
01925 { NULL, NULL }
01926 };
01927
01928
01929
01930 static bool test_qp_spellpartial1()
01931 {
01932 mkdir(".flint", 0755);
01933 string dbdir = ".flint/qp_spellpartial1";
01934 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01935
01936 db.add_spelling("document");
01937 db.add_spelling("search");
01938 db.add_spelling("paragraph");
01939 db.add_spelling("band");
01940
01941 Xapian::QueryParser qp;
01942 qp.set_database(db);
01943
01944 for (const test *p = test_mispelled_partial_queries; p->query; ++p) {
01945 Xapian::Query q;
01946 q = qp.parse_query(p->query,
01947 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01948 Xapian::QueryParser::FLAG_PARTIAL);
01949 tout << "Query: " << p->query << endl;
01950 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01951 }
01952
01953 return true;
01954 }
01955
01956 static const test test_synonym_queries[] = {
01957 { "searching", "(Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1))" },
01958 { "search", "(Zsearch:(pos=1) SYNONYM find:(pos=1))" },
01959 { "Search", "(search:(pos=1) SYNONYM find:(pos=1))" },
01960 { "Searching", "searching:(pos=1)" },
01961 { "searching OR terms", "((Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1)) OR Zterm:(pos=2))" },
01962 { "search OR terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
01963 { "search +terms", "(Zterm:(pos=2) AND_MAYBE (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
01964 { "search -terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_NOT Zterm:(pos=2))" },
01965 { "+search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_MAYBE Zterm:(pos=2))" },
01966 { "-search terms", "(Zterm:(pos=2) AND_NOT (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
01967 { "search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
01968
01969 { "\"search terms\"", "(search:(pos=1) PHRASE 2 terms:(pos=2))" },
01970
01971
01972 { "regression test", "(Zregress:(pos=1) OR Ztest:(pos=2))" },
01973 { NULL, NULL }
01974 };
01975
01976
01977 static bool test_qp_synonym1()
01978 {
01979 mkdir(".flint", 0755);
01980 string dbdir = ".flint/qp_synonym1";
01981 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01982
01983 db.add_synonym("Zsearch", "Zfind");
01984 db.add_synonym("Zsearch", "Zlocate");
01985 db.add_synonym("search", "find");
01986 db.add_synonym("Zseek", "Zsearch");
01987 db.add_synonym("regression test", "magic");
01988
01989 db.commit();
01990
01991 Xapian::QueryParser qp;
01992 qp.set_stemmer(Xapian::Stem("english"));
01993 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01994 qp.set_database(db);
01995
01996 for (const test *p = test_synonym_queries; p->query; ++p) {
01997 string expect = "Xapian::Query(";
01998 expect += p->expect;
01999 expect += ')';
02000 Xapian::Query q;
02001 q = qp.parse_query(p->query, qp.FLAG_AUTO_SYNONYMS|qp.FLAG_DEFAULT);
02002 tout << "Query: " << p->query << endl;
02003 TEST_STRINGS_EQUAL(q.get_description(), expect);
02004 }
02005
02006 return true;
02007 }
02008
02009 static const test test_multi_synonym_queries[] = {
02010 { "sun OR tan OR cream", "(Zsun:(pos=1) OR Ztan:(pos=2) OR Zcream:(pos=3))" },
02011 { "sun tan", "((Zsun:(pos=1) OR Ztan:(pos=2)) SYNONYM bathe:(pos=1))" },
02012 { "sun tan cream", "((Zsun:(pos=1) OR Ztan:(pos=2) OR Zcream:(pos=3)) SYNONYM lotion:(pos=1))" },
02013 { "beach sun tan holiday", "(Zbeach:(pos=1) OR ((Zsun:(pos=2) OR Ztan:(pos=3)) SYNONYM bathe:(pos=2)) OR Zholiday:(pos=4))" },
02014 { "sun tan sun tan cream", "(((Zsun:(pos=1) OR Ztan:(pos=2)) SYNONYM bathe:(pos=1)) OR ((Zsun:(pos=3) OR Ztan:(pos=4) OR Zcream:(pos=5)) SYNONYM lotion:(pos=3)))" },
02015 { "single", "(Zsingl:(pos=1) SYNONYM record:(pos=1))" },
02016 { NULL, NULL }
02017 };
02018
02019
02020 static bool test_qp_synonym2()
02021 {
02022 mkdir(".flint", 0755);
02023 string dbdir = ".flint/qp_synonym2";
02024 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02025
02026 db.add_synonym("sun tan cream", "lotion");
02027 db.add_synonym("sun tan", "bathe");
02028 db.add_synonym("single", "record");
02029
02030 db.commit();
02031
02032 Xapian::QueryParser qp;
02033 qp.set_stemmer(Xapian::Stem("english"));
02034 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02035 qp.set_database(db);
02036
02037 for (const test *p = test_multi_synonym_queries; p->query; ++p) {
02038 string expect = "Xapian::Query(";
02039 expect += p->expect;
02040 expect += ')';
02041 Xapian::Query q;
02042 q = qp.parse_query(p->query,
02043 Xapian::QueryParser::FLAG_AUTO_MULTIWORD_SYNONYMS |
02044 Xapian::QueryParser::FLAG_DEFAULT);
02045 tout << "Query: " << p->query << endl;
02046 TEST_STRINGS_EQUAL(q.get_description(), expect);
02047 }
02048
02049 return true;
02050 }
02051
02052 static const test test_synonym_op_queries[] = {
02053 { "searching", "Zsearch:(pos=1)" },
02054 { "~searching", "(Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1))" },
02055 { "~search", "(Zsearch:(pos=1) SYNONYM find:(pos=1))" },
02056 { "~Search", "(search:(pos=1) SYNONYM find:(pos=1))" },
02057 { "~Searching", "searching:(pos=1)" },
02058 { "~searching OR terms", "((Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1)) OR Zterm:(pos=2))" },
02059 { "~search OR terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
02060 { "~search +terms", "(Zterm:(pos=2) AND_MAYBE (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
02061 { "~search -terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_NOT Zterm:(pos=2))" },
02062 { "+~search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_MAYBE Zterm:(pos=2))" },
02063 { "-~search terms", "(Zterm:(pos=2) AND_NOT (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
02064 { "~search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
02065
02066 { "~\"search terms\"", "(search:(pos=1) PHRASE 2 terms:(pos=2))" },
02067 { NULL, NULL }
02068 };
02069
02070
02071 static bool test_qp_synonym3()
02072 {
02073 mkdir(".flint", 0755);
02074 string dbdir = ".flint/qp_synonym3";
02075 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02076
02077 db.add_synonym("Zsearch", "Zfind");
02078 db.add_synonym("Zsearch", "Zlocate");
02079 db.add_synonym("search", "find");
02080 db.add_synonym("Zseek", "Zsearch");
02081
02082 db.commit();
02083
02084 Xapian::QueryParser qp;
02085 qp.set_stemmer(Xapian::Stem("english"));
02086 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02087 qp.set_database(db);
02088
02089 for (const test *p = test_synonym_op_queries; p->query; ++p) {
02090 string expect = "Xapian::Query(";
02091 expect += p->expect;
02092 expect += ')';
02093 Xapian::Query q;
02094 q = qp.parse_query(p->query,
02095 Xapian::QueryParser::FLAG_SYNONYM |
02096 Xapian::QueryParser::FLAG_BOOLEAN |
02097 Xapian::QueryParser::FLAG_LOVEHATE |
02098 Xapian::QueryParser::FLAG_PHRASE );
02099 tout << "Query: " << p->query << endl;
02100 TEST_STRINGS_EQUAL(q.get_description(), expect);
02101 }
02102
02103 return true;
02104 }
02105
02106 static const test test_stem_all_queries[] = {
02107 { "\"chemical engineers\"", "(chemic:(pos=1) PHRASE 2 engin:(pos=2))" },
02108 { "chemical NEAR engineers", "(chemic:(pos=1) NEAR 11 engin:(pos=2))" },
02109 { "chemical engineers", "(chemic:(pos=1) OR engin:(pos=2))" },
02110 { NULL, NULL }
02111 };
02112
02113 static bool test_qp_stem_all1()
02114 {
02115 Xapian::QueryParser qp;
02116 qp.set_stemmer(Xapian::Stem("english"));
02117 qp.set_stemming_strategy(qp.STEM_ALL);
02118 for (const test *p = test_stem_all_queries; p->query; ++p) {
02119 string expect, parsed;
02120 if (p->expect)
02121 expect = p->expect;
02122 else
02123 expect = "parse error";
02124 try {
02125 Xapian::Query qobj = qp.parse_query(p->query);
02126 parsed = qobj.get_description();
02127 expect = string("Xapian::Query(") + expect + ')';
02128 } catch (const Xapian::QueryParserError &e) {
02129 parsed = e.get_msg();
02130 } catch (const Xapian::Error &e) {
02131 parsed = e.get_description();
02132 } catch (...) {
02133 parsed = "Unknown exception!";
02134 }
02135 tout << "Query: " << p->query << '\n';
02136 TEST_STRINGS_EQUAL(parsed, expect);
02137 }
02138 return true;
02139 }
02140
02141 static double
02142 time_query_parse(const Xapian::Database & db, const string & q,
02143 int repetitions, unsigned flags)
02144 {
02145 Xapian::QueryParser qp;
02146 qp.set_database(db);
02147 CPUTimer timer;
02148 std::vector<Xapian::Query> qs;
02149 qs.reserve(repetitions);
02150 for (int i = 0; i != repetitions; ++i) {
02151 qs.push_back(qp.parse_query(q, flags));
02152 }
02153 if (repetitions > 1) {
02154 Xapian::Query qc(Xapian::Query::OP_OR, qs.begin(), qs.end());
02155 }
02156 return timer.get_time();
02157 }
02158
02159 static void
02160 qp_scale1_helper(const Xapian::Database &db, const string & q, unsigned n,
02161 unsigned flags)
02162 {
02163 double time1;
02164 while (true) {
02165 time1 = time_query_parse(db, q, n, flags);
02166 if (time1 != 0.0) break;
02167
02168
02169
02170 unsigned n_new = n * 10;
02171 if (n_new < n)
02172 SKIP_TEST("Can't count enough repetitions to be able to time test");
02173 n = n_new;
02174 }
02175
02176 string q_n;
02177 q_n.reserve(q.size() * n);
02178 for (unsigned i = n; i != 0; --i) {
02179 q_n += q;
02180 }
02181
02182 double time2 = time_query_parse(db, q_n, 1, flags);
02183 tout << "small=" << time1 << "s, large=" << time2 << "s\n";
02184
02185
02186
02187 TEST_REL(time2,<,time1 * 2.15);
02188 }
02189
02190
02191
02192 static bool test_qp_scale1()
02193 {
02194 mkdir(".flint", 0755);
02195 string dbdir = ".flint/qp_scale1";
02196 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02197
02198 db.add_synonym("foo", "bar");
02199 db.commit();
02200
02201 string q1("foo ");
02202 string q1b("baz ");
02203 const unsigned repetitions = 5000;
02204
02205
02206 string syn;
02207 for (int j = 60; j != 0; --j) {
02208 syn += q1;
02209 }
02210 syn.resize(syn.size() - 1);
02211
02212 unsigned synflags = Xapian::QueryParser::FLAG_DEFAULT |
02213 Xapian::QueryParser::FLAG_SYNONYM |
02214 Xapian::QueryParser::FLAG_AUTO_MULTIWORD_SYNONYMS;
02215
02216
02217 qp_scale1_helper(db, q1, repetitions, Xapian::QueryParser::FLAG_DEFAULT);
02218
02219
02220
02221 qp_scale1_helper(db, q1b, repetitions, synflags);
02222
02223
02224 qp_scale1_helper(db, q1, repetitions, synflags);
02225
02226
02227 db.add_synonym(syn, "bar");
02228 db.commit();
02229
02230 qp_scale1_helper(db, q1, repetitions, synflags);
02231
02232 return true;
02233 }
02234
02235 static const test test_near_queries[] = {
02236 { "simple-example", "(simple:(pos=1) PHRASE 2 example:(pos=2))" },
02237 { "stock -cooking", "(Zstock:(pos=1) AND_NOT Zcook:(pos=2))" },
02238
02239
02240
02241 { "foo bar", "(foo:(pos=1) NEAR 11 bar:(pos=2))" },
02242 { "foo bar baz", "(foo:(pos=1) NEAR 12 bar:(pos=2) NEAR 12 baz:(pos=3))" },
02243 { "gtk+ -gnome", "(Zgtk+:(pos=1) AND_NOT Zgnome:(pos=2))" },
02244 { "c++ -d--", "(Zc++:(pos=1) AND_NOT Zd:(pos=2))" },
02245 { "\"c++ library\"", "(c++:(pos=1) PHRASE 2 library:(pos=2))" },
02246 { "author:orwell animal farm", "(Aorwell:(pos=1) NEAR 12 animal:(pos=2) NEAR 12 farm:(pos=3))" },
02247 { "author:Orwell Animal Farm", "(Aorwell:(pos=1) NEAR 12 animal:(pos=2) NEAR 12 farm:(pos=3))" },
02248 { "beer NOT \"orange juice\"", "(Zbeer:(pos=1) AND_NOT (orange:(pos=2) PHRASE 2 juice:(pos=3)))" },
02249 { "beer AND NOT lager", "(Zbeer:(pos=1) AND_NOT Zlager:(pos=2))" },
02250 { "A OR B NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02251 { "A OR B AND NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02252 { "A OR B XOR C", "(a:(pos=1) OR (b:(pos=2) XOR c:(pos=3)))" },
02253 { "A XOR B NOT C", "(a:(pos=1) XOR (b:(pos=2) AND_NOT c:(pos=3)))" },
02254 { "one AND two", "(Zone:(pos=1) AND Ztwo:(pos=2))" },
02255 { "NOT windows", "Syntax: <expression> NOT <expression>" },
02256 { "a AND (NOT b)", "Syntax: <expression> NOT <expression>" },
02257 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
02258 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
02259 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
02260 { "foo OR (something AND)", "Syntax: <expression> AND <expression>" },
02261 { "OR foo", "Syntax: <expression> OR <expression>" },
02262 { "XOR", "Syntax: <expression> XOR <expression>" },
02263 { "hard\xa0space", "(hard:(pos=1) NEAR 11 space:(pos=2))" },
02264 { NULL, NULL }
02265 };
02266
02267 static bool test_qp_near1()
02268 {
02269 Xapian::QueryParser queryparser;
02270 queryparser.set_stemmer(Xapian::Stem("english"));
02271 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02272 queryparser.add_prefix("author", "A");
02273 queryparser.add_prefix("writer", "A");
02274 queryparser.add_prefix("title", "XT");
02275 queryparser.add_prefix("subject", "XT");
02276 queryparser.add_prefix("authortitle", "A");
02277 queryparser.add_prefix("authortitle", "XT");
02278 queryparser.add_boolean_prefix("site", "H");
02279 queryparser.add_boolean_prefix("site2", "J");
02280 queryparser.add_boolean_prefix("multisite", "H");
02281 queryparser.add_boolean_prefix("multisite", "J");
02282 queryparser.add_boolean_prefix("category", "XCAT", false);
02283 queryparser.set_default_op(Xapian::Query::OP_NEAR);
02284 for (const test *p = test_near_queries; p->query; ++p) {
02285 string expect, parsed;
02286 if (p->expect)
02287 expect = p->expect;
02288 else
02289 expect = "parse error";
02290 try {
02291 Xapian::Query qobj = queryparser.parse_query(p->query);
02292 parsed = qobj.get_description();
02293 expect = string("Xapian::Query(") + expect + ')';
02294 } catch (const Xapian::QueryParserError &e) {
02295 parsed = e.get_msg();
02296 } catch (const Xapian::Error &e) {
02297 parsed = e.get_description();
02298 } catch (...) {
02299 parsed = "Unknown exception!";
02300 }
02301 tout << "Query: " << p->query << '\n';
02302 TEST_STRINGS_EQUAL(parsed, expect);
02303 }
02304 return true;
02305 }
02306
02307 static const test test_phrase_queries[] = {
02308 { "simple-example", "(simple:(pos=1) PHRASE 2 example:(pos=2))" },
02309 { "stock -cooking", "(Zstock:(pos=1) AND_NOT Zcook:(pos=2))" },
02310
02311
02312
02313 { "foo bar", "(foo:(pos=1) PHRASE 11 bar:(pos=2))" },
02314 { "foo bar baz", "(foo:(pos=1) PHRASE 12 bar:(pos=2) PHRASE 12 baz:(pos=3))" },
02315 { "gtk+ -gnome", "(Zgtk+:(pos=1) AND_NOT Zgnome:(pos=2))" },
02316 { "c++ -d--", "(Zc++:(pos=1) AND_NOT Zd:(pos=2))" },
02317 { "\"c++ library\"", "(c++:(pos=1) PHRASE 2 library:(pos=2))" },
02318 { "author:orwell animal farm", "(Aorwell:(pos=1) PHRASE 12 animal:(pos=2) PHRASE 12 farm:(pos=3))" },
02319 { "author:Orwell Animal Farm", "(Aorwell:(pos=1) PHRASE 12 animal:(pos=2) PHRASE 12 farm:(pos=3))" },
02320 { "beer NOT \"orange juice\"", "(Zbeer:(pos=1) AND_NOT (orange:(pos=2) PHRASE 2 juice:(pos=3)))" },
02321 { "beer AND NOT lager", "(Zbeer:(pos=1) AND_NOT Zlager:(pos=2))" },
02322 { "A OR B NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02323 { "A OR B AND NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02324 { "A OR B XOR C", "(a:(pos=1) OR (b:(pos=2) XOR c:(pos=3)))" },
02325 { "A XOR B NOT C", "(a:(pos=1) XOR (b:(pos=2) AND_NOT c:(pos=3)))" },
02326 { "one AND two", "(Zone:(pos=1) AND Ztwo:(pos=2))" },
02327 { "NOT windows", "Syntax: <expression> NOT <expression>" },
02328 { "a AND (NOT b)", "Syntax: <expression> NOT <expression>" },
02329 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
02330 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
02331 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
02332 { "foo OR (something AND)", "Syntax: <expression> AND <expression>" },
02333 { "OR foo", "Syntax: <expression> OR <expression>" },
02334 { "XOR", "Syntax: <expression> XOR <expression>" },
02335 { "hard\xa0space", "(hard:(pos=1) PHRASE 11 space:(pos=2))" },
02336
02337
02338 { "(one AND two) three", "((Zone:(pos=1) PHRASE 11 Zthree:(pos=3)) AND (Ztwo:(pos=2) PHRASE 11 Zthree:(pos=3)))" },
02339 { NULL, NULL }
02340 };
02341
02342 static bool test_qp_phrase1()
02343 {
02344 Xapian::QueryParser queryparser;
02345 queryparser.set_stemmer(Xapian::Stem("english"));
02346 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02347 queryparser.add_prefix("author", "A");
02348 queryparser.add_prefix("writer", "A");
02349 queryparser.add_prefix("title", "XT");
02350 queryparser.add_prefix("subject", "XT");
02351 queryparser.add_prefix("authortitle", "A");
02352 queryparser.add_prefix("authortitle", "XT");
02353 queryparser.add_boolean_prefix("site", "H");
02354 queryparser.add_boolean_prefix("site2", "J");
02355 queryparser.add_boolean_prefix("multisite", "H");
02356 queryparser.add_boolean_prefix("multisite", "J");
02357 queryparser.add_boolean_prefix("category", "XCAT", false);
02358 queryparser.set_default_op(Xapian::Query::OP_PHRASE);
02359 for (const test *p = test_phrase_queries; p->query; ++p) {
02360 string expect, parsed;
02361 if (p->expect)
02362 expect = p->expect;
02363 else
02364 expect = "parse error";
02365 try {
02366 Xapian::Query qobj = queryparser.parse_query(p->query);
02367 parsed = qobj.get_description();
02368 expect = string("Xapian::Query(") + expect + ')';
02369 } catch (const Xapian::QueryParserError &e) {
02370 parsed = e.get_msg();
02371 } catch (const Xapian::Error &e) {
02372 parsed = e.get_description();
02373 } catch (...) {
02374 parsed = "Unknown exception!";
02375 }
02376 tout << "Query: " << p->query << '\n';
02377 TEST_STRINGS_EQUAL(parsed, expect);
02378 }
02379 return true;
02380 }
02381
02382 static const test test_stopword_group_or_queries[] = {
02383 { "this is a test", "test:(pos=4)" },
02384 { "test*", "(test:(pos=1) SYNONYM testable:(pos=1) SYNONYM tester:(pos=1))" },
02385 { "a test*", "(test:(pos=2) SYNONYM testable:(pos=2) SYNONYM tester:(pos=2))" },
02386 { "is a test*", "(test:(pos=3) SYNONYM testable:(pos=3) SYNONYM tester:(pos=3))" },
02387 { "this is a test*", "(test:(pos=4) SYNONYM testable:(pos=4) SYNONYM tester:(pos=4))" },
02388 { "this is a us* test*", "(user:(pos=4) OR (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02389 { "this is a user test*", "(user:(pos=4) OR (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02390 { NULL, NULL }
02391 };
02392
02393 static const test test_stopword_group_and_queries[] = {
02394 { "this is a test", "test:(pos=4)" },
02395 { "test*", "(test:(pos=1) SYNONYM testable:(pos=1) SYNONYM tester:(pos=1))" },
02396 { "a test*", "(test:(pos=2) SYNONYM testable:(pos=2) SYNONYM tester:(pos=2))" },
02397
02398 { "is a test*", "(test:(pos=3) SYNONYM testable:(pos=3) SYNONYM tester:(pos=3))" },
02399
02400 { "this is a test*", "(test:(pos=4) SYNONYM testable:(pos=4) SYNONYM tester:(pos=4))" },
02401
02402 { "this is a us* test*", "(user:(pos=4) AND (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02403 { "this is a user test*", "(user:(pos=4) AND (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02404 { NULL, NULL }
02405 };
02406
02407
02408 static bool test_qp_stopword_group1()
02409 {
02410 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
02411 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
02412 #else
02413 Xapian::WritableDatabase db(Xapian::InMemory::open());
02414 Xapian::Document doc;
02415 doc.add_term("test");
02416 doc.add_term("tester");
02417 doc.add_term("testable");
02418 doc.add_term("user");
02419 db.add_document(doc);
02420
02421 Xapian::SimpleStopper stopper;
02422 stopper.add("this");
02423 stopper.add("is");
02424 stopper.add("a");
02425
02426 Xapian::QueryParser qp;
02427 qp.set_stopper(&stopper);
02428 qp.set_database(db);
02429
02430
02431 qp.set_default_op(Xapian::Query::OP_OR);
02432 const test *p = test_stopword_group_or_queries;
02433 for (int i = 1; i <= 2; ++i) {
02434 for ( ; p->query; ++p) {
02435 string expect, parsed;
02436 if (p->expect)
02437 expect = p->expect;
02438 else
02439 expect = "parse error";
02440 try {
02441 Xapian::Query qobj = qp.parse_query(p->query, qp.FLAG_WILDCARD);
02442 parsed = qobj.get_description();
02443 expect = string("Xapian::Query(") + expect + ')';
02444 } catch (const Xapian::QueryParserError &e) {
02445 parsed = e.get_msg();
02446 } catch (const Xapian::Error &e) {
02447 parsed = e.get_description();
02448 } catch (...) {
02449 parsed = "Unknown exception!";
02450 }
02451 tout << "Query: " << p->query << '\n';
02452 TEST_STRINGS_EQUAL(parsed, expect);
02453 }
02454
02455 qp.set_default_op(Xapian::Query::OP_AND);
02456 p = test_stopword_group_and_queries;
02457 }
02458
02459 return true;
02460 #endif
02461 }
02462
02464
02465 static bool test_qp_default_op2()
02466 {
02467 Xapian::QueryParser qp;
02468 static const Xapian::Query::op ops[] = {
02469 Xapian::Query::OP_AND_NOT,
02470 Xapian::Query::OP_AND_MAYBE,
02471 Xapian::Query::OP_FILTER,
02472 Xapian::Query::OP_VALUE_RANGE,
02473 Xapian::Query::OP_SCALE_WEIGHT,
02474 Xapian::Query::OP_VALUE_GE,
02475 Xapian::Query::OP_VALUE_LE
02476 };
02477 const Xapian::Query::op * p;
02478 for (p = ops; p - ops != sizeof(ops) / sizeof(*ops); ++p) {
02479 tout << *p << endl;
02480 qp.set_default_op(*p);
02481
02482
02483 TEST_EXCEPTION(Xapian::InvalidArgumentError,
02484 qp.parse_query("a-b NEAR c NEAR d"));
02485 }
02486 return true;
02487 }
02488
02490 static const test_desc tests[] = {
02491 TESTCASE(queryparser1),
02492 TESTCASE(qp_default_op1),
02493 TESTCASE(qp_odd_chars1),
02494 TESTCASE(qp_flag_wildcard1),
02495 TESTCASE(qp_flag_wildcard2),
02496 TESTCASE(qp_flag_wildcard3),
02497 TESTCASE(qp_flag_partial1),
02498 TESTCASE(qp_flag_bool_any_case1),
02499 TESTCASE(qp_stopper1),
02500 TESTCASE(qp_flag_pure_not1),
02501 TESTCASE(qp_unstem_boolean_prefix),
02502 TESTCASE(qp_default_prefix1),
02503 TESTCASE(qp_default_prefix2),
02504 TESTCASE(value_range_serialise1),
02505 TESTCASE(qp_value_range1),
02506 TESTCASE(qp_value_range2),
02507 TESTCASE(qp_value_range3),
02508 TESTCASE(qp_value_range4),
02509 TESTCASE(qp_value_daterange1),
02510 TESTCASE(qp_value_daterange2),
02511 TESTCASE(qp_value_stringrange1),
02512 TESTCASE(qp_value_customrange1),
02513 TESTCASE(qp_stoplist1),
02514 TESTCASE(qp_spell1),
02515 TESTCASE(qp_spell2),
02516 TESTCASE(qp_spellwild1),
02517 TESTCASE(qp_spellpartial1),
02518 TESTCASE(qp_synonym1),
02519 TESTCASE(qp_synonym2),
02520 TESTCASE(qp_synonym3),
02521 TESTCASE(qp_stem_all1),
02522 TESTCASE(qp_scale1),
02523 TESTCASE(qp_near1),
02524 TESTCASE(qp_phrase1),
02525 TESTCASE(qp_stopword_group1),
02526 TESTCASE(qp_default_op2),
02527 END_OF_TESTCASES
02528 };
02529
02530 int main(int argc, char **argv)
02531 try {
02532
02533 #ifdef __WIN32__
02534 _putenv_s("XAPIAN_CJK_NGRAM", "1");
02535 #elif defined HAVE_SETENV
02536 setenv("XAPIAN_CJK_NGRAM", "1", 1);
02537 #else
02538 putenv(const_cast<char*>("XAPIAN_CJK_NGRAM=1"));
02539 #endif
02540 test_driver::parse_command_line(argc, argv);
02541 return test_driver::run(tests);
02542 } catch (const char * e) {
02543 cout << e << endl;
02544 return 1;
02545 }