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 { "(foo", "Zfoo:(pos=1)" },
00199 { "(foo XOR bar", "(Zfoo:(pos=1) XOR Zbar:(pos=2))" },
00200 { "(foo XOR (bar AND baz)", "(Zfoo:(pos=1) XOR (Zbar:(pos=2) AND Zbaz:(pos=3)))" },
00201 { "(foo XOR (bar AND baz", "(Zfoo:(pos=1) XOR (Zbar:(pos=2) AND Zbaz:(pos=3)))" },
00202
00203 { "Call to undefined function: imagecreate()", "(call:(pos=1) OR Zto:(pos=2) OR Zundefin:(pos=3) OR Zfunction:(pos=4) OR imagecreate:(pos=5))" },
00204 { "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))" },
00205 { "php date() nedelands", "(Zphp:(pos=1) OR date:(pos=2) OR Znedeland:(pos=3))" },
00206 { "wget domein --http-user", "(Zwget:(pos=1) OR Zdomein:(pos=2) OR (http:(pos=3) PHRASE 2 user:(pos=4)))" },
00207 { "@home problemen", "(Zhome:(pos=1) OR Zproblemen:(pos=2))" },
00208 { "'ipacsum'", "Zipacsum:(pos=1)" },
00209 { "canal + ", "Zcanal:(pos=1)" },
00210 { "/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))" },
00211 { "\"QSI-161 drivers\"", "(qsi:(pos=1) PHRASE 3 161:(pos=2) PHRASE 3 drivers:(pos=3))" },
00212 { "\"e-cube\" barebone", "((e:(pos=1) PHRASE 2 cube:(pos=2)) OR Zbarebon:(pos=3))" },
00213 { "\"./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))" },
00214 { "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))" },
00215 { "location.href = \"\"", "(location:(pos=1) PHRASE 2 href:(pos=2))" },
00216 { "method=\"post\" action=\"\">", "(method:(pos=1) OR post:(pos=2) OR action:(pos=3))" },
00217 { "behuizing 19\" inch", "(Zbehuiz:(pos=1) OR 19:(pos=2) OR inch:(pos=3))" },
00218 { "19\" rack", "(19:(pos=1) OR rack:(pos=2))" },
00219 { "3,5\" mainboard", "(3,5:(pos=1) OR mainboard:(pos=2))" },
00220 { "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))" },
00221 { "data error (clic redundancy check)", "(Zdata:(pos=1) OR Zerror:(pos=2) OR Zclic:(pos=3) OR Zredund:(pos=4) OR Zcheck:(pos=5))" },
00222 { "? mediaplayer 9\"", "(Zmediaplay:(pos=1) OR 9:(pos=2))" },
00223 { "date(\"w\")", "(date:(pos=1) OR w:(pos=2))" },
00224 { "Syntaxisfout (operator ontbreekt ASP", "(syntaxisfout:(pos=1) OR Zoper:(pos=2) OR Zontbreekt:(pos=3) OR asp:(pos=4))" },
00225 { "Request.ServerVariables(\"logon_user\")", "((request:(pos=1) PHRASE 2 servervariables:(pos=2)) OR logon_user:(pos=3))" },
00226 { "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)))" },
00227 { "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)))" },
00228 { "ip_masq_new(proto=TCP)", "(ip_masq_new:(pos=1) OR proto:(pos=2) OR tcp:(pos=3))" },
00229 { "\"document.write(\"", "(document:(pos=1) PHRASE 2 write:(pos=2))" },
00230 { "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))" },
00231 { "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))" },
00232 { "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))" },
00233 { "\"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))" },
00234 { "\") 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))" },
00235 { "\"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))" },
00236 { "$structure = imap_header($mbox, $tt);", "(Zstructur:(pos=1) OR imap_header:(pos=2) OR Zmbox:(pos=3) OR Ztt:(pos=4))" },
00237 { "\"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))" },
00238 { "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))" },
00239 { "ereg_replace(\"\\\\\",\"\\/\"", "ereg_replace:(pos=1)" },
00240 { "\\\\\"divx+geen+geluid\\\\\"", "(divx:(pos=1) PHRASE 3 geen:(pos=2) PHRASE 3 geluid:(pos=3))" },
00241 { "lcase(\"string\")", "(lcase:(pos=1) OR string:(pos=2))" },
00242 { "isEmpty( ) functie in visual basic", "(isempty:(pos=1) OR Zfuncti:(pos=2) OR Zin:(pos=3) OR Zvisual:(pos=4) OR Zbasic:(pos=5))" },
00243 { "*** stop: 0x0000001E (0xC0000005,0x00000000,0x00000000,0x00000000)", "(Zstop:(pos=1) OR 0x0000001e:(pos=2) OR 0xc0000005,0x00000000,0x00000000,0x00000000:(pos=3))" },
00244 { "\"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))" },
00245 { "Server.CreateObject(\"ADODB.connection\")", "((server:(pos=1) PHRASE 2 createobject:(pos=2)) OR (adodb:(pos=3) PHRASE 2 connection:(pos=4)))" },
00246 { "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)))" },
00247 { "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))" },
00248 { "delphi CreateOleObject(\"MSXML2.DomDocument\")", "(Zdelphi:(pos=1) OR createoleobject:(pos=2) OR (msxml2:(pos=3) PHRASE 2 domdocument:(pos=4)))" },
00249 { "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)))" },
00250 { "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))" },
00251 { "asp ' en \"", "(Zasp:(pos=1) OR Zen:(pos=2))" },
00252 { "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))" },
00253 { "session_set_cookie_params(echo \"hoi\")", "(session_set_cookie_params:(pos=1) OR Zecho:(pos=2) OR hoi:(pos=3))" },
00254 { "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))" },
00255 { "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))" },
00256 { "sony +(u20 u-20)", "((Zu20:(pos=2) OR (u:(pos=3) PHRASE 2 20:(pos=4))) AND_MAYBE Zsoni:(pos=1))" },
00257 { "[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))" },
00258 { "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))" },
00259 { "(multi pc modem)+ (line sync)", "(Zmulti:(pos=1) OR Zpc:(pos=2) OR Zmodem:(pos=3) OR Zline:(pos=4) OR Zsync:(pos=5))" },
00260 { "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)))" },
00261 { "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))" },
00262 { "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))" },
00263 { "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))" },
00264 { "\"arp -s\" ip veranderen", "((arp:(pos=1) PHRASE 2 s:(pos=2)) OR Zip:(pos=3) OR Zveranderen:(pos=4))" },
00265 { "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)))" },
00266 { "$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)))" },
00267 { "\"'\" +asp", "Zasp:(pos=1)" },
00268 { "+session +[", "Zsession:(pos=1)" },
00269 { "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))" },
00270 { "\"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))" },
00271 { "\"+irq +veranderen +xp\"", "(irq:(pos=1) PHRASE 3 veranderen:(pos=2) PHRASE 3 xp:(pos=3))" },
00272 { "\"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))" },
00273 { "mkdir() failed (File exists) php", "(mkdir:(pos=1) OR Zfail:(pos=2) OR file:(pos=3) OR Zexist:(pos=4) OR Zphp:(pos=5))" },
00274 { "laatsteIndex(int n)", "(laatsteindex:(pos=1) OR Zint:(pos=2) OR Zn:(pos=3))" },
00275 { "\"line+in\" OR \"c8783\"", "((line:(pos=1) PHRASE 2 in:(pos=2)) OR c8783:(pos=3))" },
00276 { "if ($_POST['Submit'])", "(Zif:(pos=1) OR _post:(pos=2) OR submit:(pos=3))" },
00277 { "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)))" },
00278 { "*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))" },
00279 { "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))" },
00280 { "href=\"#\"", "href:(pos=1)" },
00281 { "Request.ServerVariables(\"REMOTE_USER\") javascript", "((request:(pos=1) PHRASE 2 servervariables:(pos=2)) OR remote_user:(pos=3) OR Zjavascript:(pos=4))" },
00282 { "XF86Config(-4) waar", "(xf86config:(pos=1) OR 4:(pos=2) OR Zwaar:(pos=3))" },
00283 { "Unknown (tag 2000)", "(unknown:(pos=1) OR Ztag:(pos=2) OR 2000:(pos=3))" },
00284 { "KT4V(MS-6712)", "(kt4v:(pos=1) OR (ms:(pos=2) PHRASE 2 6712:(pos=3)))" },
00285 { "scheduled+AND+nieuwsgroepen+AND+updaten", "(Zschedul:(pos=1) AND Znieuwsgroepen:(pos=2) AND Zupdaten:(pos=3))" },
00286 { "137(netbios-ns)", "(137:(pos=1) OR (netbios:(pos=2) PHRASE 2 ns:(pos=3)))" },
00287 { "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)))" },
00288 { "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))" },
00289 { "wat is code van \" teken", "(Zwat:(pos=1) OR Zis:(pos=2) OR Zcode:(pos=3) OR Zvan:(pos=4) OR teken:(pos=5))" },
00290 { "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))" },
00291 { "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)))" },
00292 { "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))" },
00293 { "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))" },
00294 { "\"2020 NEAR zoom\"", "(2020:(pos=1) PHRASE 3 near:(pos=2) PHRASE 3 zoom:(pos=3))" },
00295 { "setcookie(\"naam\",\"$user\");", "(setcookie:(pos=1) OR naam:(pos=2) OR user:(pos=3))" },
00296 { "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))" },
00297 { "if ($HTTP", "(Zif:(pos=1) OR http:(pos=2))" },
00298 { "data error(cyclic redundancy check)", "(Zdata:(pos=1) OR error:(pos=2) OR Zcyclic:(pos=3) OR Zredund:(pos=4) OR Zcheck:(pos=5))" },
00299 { "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))" },
00300 { "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))" },
00301 { "Call Shell(\"notepad.exe\",", "(call:(pos=1) OR shell:(pos=2) OR (notepad:(pos=3) PHRASE 2 exe:(pos=4)))" },
00302 { "2.5\" harddisk converter", "(2.5:(pos=1) OR (harddisk:(pos=2) PHRASE 2 converter:(pos=3)))" },
00303 { "creative labs \"dvd+rw\"", "(Zcreativ:(pos=1) OR Zlab:(pos=2) OR (dvd:(pos=3) PHRASE 2 rw:(pos=4)))" },
00304 { "\"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))" },
00305 { "ati radeon \"driver cleaner", "(Zati:(pos=1) OR Zradeon:(pos=2) OR (driver:(pos=3) PHRASE 2 cleaner:(pos=4)))" },
00306 { "\"../\" path", "Zpath:(pos=1)" },
00307 { "(novell client) workstation only", "(Znovel:(pos=1) OR Zclient:(pos=2) OR Zworkstat:(pos=3) OR Zonli:(pos=4))" },
00308 { "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))" },
00309 { "\"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))" },
00310 { "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))" },
00311 { "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))" },
00312 { "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))" },
00313 { "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))" },
00314 { "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))" },
00315 { "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))" },
00316 { "\"dvd+r\" \"dvd-r\"", "((dvd:(pos=1) PHRASE 2 r:(pos=2)) OR (dvd:(pos=3) PHRASE 2 r:(pos=4)))" },
00317 { "\"=\" tekens uit csvfile", "(Zteken:(pos=1) OR Zuit:(pos=2) OR Zcsvfile:(pos=3))" },
00318 { "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))" },
00319 { "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)))" },
00320 { "(t-mobile) bereik", "((t:(pos=1) PHRASE 2 mobile:(pos=2)) OR Zbereik:(pos=3))" },
00321 { "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))" },
00322 { "patch linux exploit -p)", "(Zpatch:(pos=1) OR Zlinux:(pos=2) OR Zexploit:(pos=3) OR Zp:(pos=4))" },
00323 { "MYD not found (Errcode: 2)", "(myd:(pos=1) OR Znot:(pos=2) OR Zfound:(pos=3) OR errcode:(pos=4) OR 2:(pos=5))" },
00324 { "ob_start(\"ob_gzhandler\"); file download", "(ob_start:(pos=1) OR ob_gzhandler:(pos=2) OR Zfile:(pos=3) OR Zdownload:(pos=4))" },
00325 { "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)))" },
00326 { "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))" },
00327 { "Javascript:history.go(-1)", "((javascript:(pos=1) PHRASE 3 history:(pos=2) PHRASE 3 go:(pos=3)) OR 1:(pos=4))" },
00328 { "java :) als icon", "(Zjava:(pos=1) OR Zal:(pos=2) OR Zicon:(pos=3))" },
00329 { "onmouseover=setPointer(this", "(onmouseover:(pos=1) OR setpointer:(pos=2) OR Zthis:(pos=3))" },
00330 { "\" in vbscript", "(in:(pos=1) PHRASE 2 vbscript:(pos=2))" },
00331 { "IRC (FAQ OR (hulp NEAR bij))", "(irc:(pos=1) OR faq:(pos=2) OR (hulp:(pos=3) NEAR 11 bij:(pos=4)))" },
00332 { "setProperty(\"McSquare\"+i, _xscale, _xscale++);", "(setproperty:(pos=1) OR mcsquare:(pos=2) OR Zi:(pos=3) OR _xscale:(pos=4) OR _xscale++:(pos=5))" },
00333 { "[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))" },
00334 { "(php.ini) (memory_limit)", "((php:(pos=1) PHRASE 2 ini:(pos=2)) OR Zmemory_limit:(pos=3))" },
00335 { "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))" },
00336 { "VXD NAVEX()@)", "(vxd:(pos=1) OR navex:(pos=2))" },
00337 { "\"Iiyama AS4314UT 17\" \"", "(iiyama:(pos=1) PHRASE 3 as4314ut:(pos=2) PHRASE 3 17:(pos=3))" },
00338 { "include (\"$id.html\");", "(Zinclud:(pos=1) OR (id:(pos=2) PHRASE 2 html:(pos=3)))" },
00339 { "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))" },
00340 { "(program files\\common) opstarten", "(Zprogram:(pos=1) OR (files:(pos=2) PHRASE 2 common:(pos=3)) OR Zopstarten:(pos=4))" },
00341 { "java \" string", "(Zjava:(pos=1) OR string:(pos=2))" },
00342 { "+=", "" },
00343 { "php +=", "Zphp:(pos=1)" },
00344 { "[php] ereg_replace(\".\"", "(Zphp:(pos=1) OR ereg_replace:(pos=2))" },
00345 { "\"echo -e\" kleur", "((echo:(pos=1) PHRASE 2 e:(pos=2)) OR Zkleur:(pos=3))" },
00346 { "adobe premiere \"-1\"", "(Zadob:(pos=1) OR Zpremier:(pos=2) OR 1:(pos=3))" },
00347 { "DVD brander \"+\" en \"-\"", "(dvd:(pos=1) OR Zbrander:(pos=2) OR Zen:(pos=3))" },
00348 { "inspirion \"dvd+R\"", "(Zinspirion:(pos=1) OR (dvd:(pos=2) PHRASE 2 r:(pos=3)))" },
00349 { "asp 0x80040E14)", "(Zasp:(pos=1) OR 0x80040e14:(pos=2))" },
00350 { "\"e-tech motorola router", "(e:(pos=1) PHRASE 4 tech:(pos=2) PHRASE 4 motorola:(pos=3) PHRASE 4 router:(pos=4))" },
00351 { "bluetooth '1.3.2.19\"", "(Zbluetooth:(pos=1) OR 1.3.2.19:(pos=2))" },
00352 { "ms +-connect", "(Zms:(pos=1) OR Zconnect:(pos=2))" },
00353 { "php+print+\"", "(Zphp:(pos=1) OR print+:(pos=2))" },
00354 { "athlon 1400 :welke videokaart\"", "(Zathlon:(pos=1) OR 1400:(pos=2) OR Zwelk:(pos=3) OR videokaart:(pos=4))" },
00355 { "+-dvd", "Zdvd:(pos=1)" },
00356 { "glftpd \"-new-\"", "(Zglftpd:(pos=1) OR new:(pos=2))" },
00357 { "\"scandisk + dos5.0", "(scandisk:(pos=1) PHRASE 2 dos5.0:(pos=2))" },
00358 { "socket\\(\\)", "socket:(pos=1)" },
00359 { "msn (e-tech) router", "(Zmsn:(pos=1) OR (e:(pos=2) PHRASE 2 tech:(pos=3)) OR Zrouter:(pos=4))" },
00360 { "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))" },
00361 { "\"CF+bluetooth\"", "(cf:(pos=1) PHRASE 2 bluetooth:(pos=2))" },
00362 { "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))" },
00363 { "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))" },
00364 { "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))" },
00365 { "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)))" },
00366 { "\"muziek 2x zo snel\"\"", "(muziek:(pos=1) PHRASE 4 2x:(pos=2) PHRASE 4 zo:(pos=3) PHRASE 4 snel:(pos=4))" },
00367 { "execCommand('inserthorizontalrule'", "(execcommand:(pos=1) OR Zinserthorizontalrul:(pos=2))" },
00368 { "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)))" },
00369 { "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))" },
00370 { "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))" },
00371 { "'\"><br>bla</br>", "(br:(pos=1) PHRASE 3 bla:(pos=2) PHRASE 3 br:(pos=3))" },
00372 { "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)))" },
00373 { "\"(P5A-b)\"", "(p5a:(pos=1) PHRASE 2 b:(pos=2))" },
00374 { "(13,5 > 13) == no-go!", "(13,5:(pos=1) OR 13:(pos=2) OR (no:(pos=3) PHRASE 2 go:(pos=4)))" },
00375 { "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)))" },
00376 { "<META NAME=\"ROBOTS", "(meta:(pos=1) OR name:(pos=2) OR robots:(pos=3))" },
00377 { "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)))" },
00378 { "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))" },
00379 { "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)))" },
00380 { "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)))" },
00381 { "\"-RW\" \"+RW\"", "(rw:(pos=1) OR rw:(pos=2))" },
00382 { "\"cresta digital answering machine", "(cresta:(pos=1) PHRASE 4 digital:(pos=2) PHRASE 4 answering:(pos=3) PHRASE 4 machine:(pos=4))" },
00383 { "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))" },
00384 { "c++ fopen \"r+t\"", "(Zc++:(pos=1) OR Zfopen:(pos=2) OR (r:(pos=3) PHRASE 2 t:(pos=4)))" },
00385 { "c++ fopen (r+t)", "(Zc++:(pos=1) OR Zfopen:(pos=2) OR Zr:(pos=3) OR Zt:(pos=4))" },
00386 { "\"DVD+R\"", "(dvd:(pos=1) PHRASE 2 r:(pos=2))" },
00387 { "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)))" },
00388 { "perl(find.pl)", "(perl:(pos=1) OR (find:(pos=2) PHRASE 2 pl:(pos=3)))" },
00389 { "\"-5v\" voeding", "(5v:(pos=1) OR Zvoed:(pos=2))" },
00390 { "\"-5v\" power supply", "(5v:(pos=1) OR Zpower:(pos=2) OR Zsuppli:(pos=3))" },
00391 { "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))" },
00392 { "(error $2108) Borland", "(Zerror:(pos=1) OR 2108:(pos=2) OR borland:(pos=3))" },
00393 { "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))" },
00394 { "Elektrotechniek + \"hoe bevalt het?\"\"", "(elektrotechniek:(pos=1) OR (hoe:(pos=2) PHRASE 3 bevalt:(pos=3) PHRASE 3 het:(pos=4)))" },
00395 { "Shortcuts in menu (java", "(shortcuts:(pos=1) OR Zin:(pos=2) OR Zmenu:(pos=3) OR Zjava:(pos=4))" },
00396 { "detonator+settings\"", "(Zdeton:(pos=1) OR settings:(pos=2))" },
00397 { "(ez-bios) convert", "((ez:(pos=1) PHRASE 2 bios:(pos=2)) OR Zconvert:(pos=3))" },
00398 { "Sparkle 7100M4 64MB (GeForce4 MX440)", "(sparkle:(pos=1) OR 7100m4:(pos=2) OR 64mb:(pos=3) OR geforce4:(pos=4) OR mx440:(pos=5))" },
00399 { "freebsd \"boek OR newbie\"", "(Zfreebsd:(pos=1) OR (boek:(pos=2) PHRASE 3 or:(pos=3) PHRASE 3 newbie:(pos=4)))" },
00400 { "for (;;) c++", "(Zfor:(pos=1) OR Zc++:(pos=2))" },
00401 { "1700+-2100+", "(1700+:(pos=1) PHRASE 2 2100+:(pos=2))" },
00402 { "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)))" },
00403 { "NEC DV-5800B (Bul", "(nec:(pos=1) OR (dv:(pos=2) PHRASE 2 5800b:(pos=3)) OR bul:(pos=4))" },
00404 { "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)))" },
00405 { "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))" },
00406 { "'q ben\"", "(Zq:(pos=1) OR ben:(pos=2))" },
00407 { "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))" },
00408 { "\xc3\xb6ude onderdelen\"", "(Z\xc3\xb6ude:(pos=1) OR onderdelen:(pos=2))" },
00409 { "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))" },
00410 { "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)))" },
00411 { "cybercom \"dvd+r\"", "(Zcybercom:(pos=1) OR (dvd:(pos=2) PHRASE 2 r:(pos=3)))" },
00412 { "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)))" },
00413 { "relais +/-", "Zrelai:(pos=1)" },
00414 { "formules (slepen OR doortrekken) excel", "(Zformul:(pos=1) OR Zslepen:(pos=2) OR Zdoortrekken:(pos=3) OR Zexcel:(pos=4))" },
00415 { "\"%English", "english:(pos=1)" },
00416 { "select max( mysql", "(Zselect:(pos=1) OR max:(pos=2) OR Zmysql:(pos=3))" },
00417 { "leejow(saait", "(leejow:(pos=1) OR Zsaait:(pos=2))" },
00418 { "'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)))" },
00419 { "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)))" },
00420 { "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))" },
00421 { "\"cannot find -lz\"", "(cannot:(pos=1) PHRASE 3 find:(pos=2) PHRASE 3 lz:(pos=3))" },
00422 { "undefined reference to `mysql_drop_db'\"", "(Zundefin:(pos=1) OR Zrefer:(pos=2) OR Zto:(pos=3) OR Zmysql_drop_db:(pos=4))" },
00423 { "search form asp \"%'", "(Zsearch:(pos=1) OR Zform:(pos=2) OR Zasp:(pos=3))" },
00424 { "(dvd+r) kwaliteit", "(Zdvd:(pos=1) OR Zr:(pos=2) OR Zkwaliteit:(pos=3))" },
00425 { "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))" },
00426 { "geluid (schokt OR hapert)", "(Zgeluid:(pos=1) OR Zschokt:(pos=2) OR Zhapert:(pos=3))" },
00427 { "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))" },
00428 { "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))" },
00429 { "(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))" },
00430 { "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))" },
00431 { "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))" },
00432 { "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)))" },
00433 { "[php] date( min", "(Zphp:(pos=1) OR date:(pos=2) OR Zmin:(pos=3))" },
00434 { "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))" },
00435 { "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))" },
00436 { "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))" },
00437 { "ati linux drivers (4.3.0)", "(Zati:(pos=1) OR Zlinux:(pos=2) OR Zdriver:(pos=3) OR 4.3.0:(pos=4))" },
00438 { "ENCAPSED_AND_WHITESPACE", "encapsed_and_whitespace:(pos=1)" },
00439 { "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)))" },
00440 { "welke dvd \"+r\" media", "(Zwelk:(pos=1) OR Zdvd:(pos=2) OR r:(pos=3) OR Zmedia:(pos=4))" },
00441 { "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))" },
00442 { "dvd +/-", "Zdvd:(pos=1)" },
00443 { "7vaxp +voltage mod\"", "(Zvoltag:(pos=2) AND_MAYBE (7vaxp:(pos=1) OR mod:(pos=3)))" },
00444 { "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))" },
00445 { "getenv(\"HTTP_REFERER\")", "(getenv:(pos=1) OR http_referer:(pos=2))" },
00446 { "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))" },
00447 { "Exception number: c0000005 (access violation)", "(exception:(pos=1) OR Znumber:(pos=2) OR Zc0000005:(pos=3) OR Zaccess:(pos=4) OR Zviolat:(pos=5))" },
00448 { "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)))" },
00449 { "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)))" },
00450 { "(001.part.met", "(001:(pos=1) PHRASE 3 part:(pos=2) PHRASE 3 met:(pos=3))" },
00451 { "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))" },
00452 { "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))" },
00453 { "dvd \"+\" \"-\"", "Zdvd:(pos=1)" },
00454 { "bericht ( %)", "Zbericht:(pos=1)" },
00455 { "2500+ of 2600+ (niett OC)", "(2500+:(pos=1) OR Zof:(pos=2) OR 2600+:(pos=3) OR Zniett:(pos=4) OR oc:(pos=5))" },
00456 { "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))" },
00457 { "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))" },
00458 { "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))" },
00459 { "GA-8IHXP(3.0)", "((ga:(pos=1) PHRASE 2 8ihxp:(pos=2)) OR 3.0:(pos=3))" },
00460 { "8IHXP(3.0)", "(8ihxp:(pos=1) OR 3.0:(pos=2))" },
00461 { "na\xc2\xb7si (de ~ (m.))", "(Zna\xc2\xb7si:(pos=1) OR Zde:(pos=2) OR Zm:(pos=3))" },
00462 { "header(\"Content-Disposition: attachment;", "(header:(pos=1) OR (content:(pos=2) PHRASE 3 disposition:(pos=3) PHRASE 3 attachment:(pos=4)))" },
00463 { "\"header(\"Content-Disposition: attachment;\"", "(header:(pos=1) OR (content:(pos=2) PHRASE 2 disposition:(pos=3)) OR Zattach:(pos=4))" },
00464 { "\"Beep -f\"", "(beep:(pos=1) PHRASE 2 f:(pos=2))" },
00465 { "kraan NEAR (Elektrisch OR Electrisch)", "(Zkraan:(pos=1) OR near:(pos=2) OR elektrisch:(pos=3) OR or:(pos=4) OR electrisch:(pos=5))" },
00466 { "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))" },
00467 { "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)))" },
00468 { "ac3 (0x2000) \"Dolby Laboratories,", "(Zac3:(pos=1) OR 0x2000:(pos=2) OR (dolby:(pos=3) PHRASE 2 laboratories:(pos=4)))" },
00469 { "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)))" },
00470 { "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))" },
00471 { "Motion JPEG (MJPEG codec)", "(motion:(pos=1) OR jpeg:(pos=2) OR mjpeg:(pos=3) OR Zcodec:(pos=4))" },
00472 { ": zoomtext\"", "zoomtext:(pos=1)" },
00473 { "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)))" },
00474 { "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)))" },
00475 { "\"\"wa is fase\"", "(Zwa:(pos=1) OR Zis:(pos=2) OR fase:(pos=3))" },
00476 { "<v:imagedata src=\"", "((v:(pos=1) PHRASE 2 imagedata:(pos=2)) OR src:(pos=3))" },
00477 { "system(play ringin.wav); ?>", "(system:(pos=1) OR Zplay:(pos=2) OR (ringin:(pos=3) PHRASE 2 wav:(pos=4)))" },
00478 { "\"perfect NEAR systems\"", "(perfect:(pos=1) PHRASE 3 near:(pos=2) PHRASE 3 systems:(pos=3))" },
00479 { "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))" },
00480 { "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))" },
00481 { "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))" },
00482 { "\"Postal2+Explorer.exe\"", "(postal2:(pos=1) PHRASE 3 explorer:(pos=2) PHRASE 3 exe:(pos=3))" },
00483 { "COUNT(*)", "count:(pos=1)" },
00484 { "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)))" },
00485 { "if(usercode==passcode==)", "(if:(pos=1) OR usercode:(pos=2) OR passcode:(pos=3))" },
00486 { "lg 8160b (dvd+r)", "(Zlg:(pos=1) OR 8160b:(pos=2) OR Zdvd:(pos=3) OR Zr:(pos=4))" },
00487 { "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))" },
00488 { "'ipod pakt tags niet\"", "(Zipod:(pos=1) OR Zpakt:(pos=2) OR Ztag:(pos=3) OR niet:(pos=4))" },
00489 { "\"DVD+/-R\"", "(dvd+:(pos=1) PHRASE 2 r:(pos=2))" },
00490 { "\"DVD+R DVD-R\"", "(dvd:(pos=1) PHRASE 4 r:(pos=2) PHRASE 4 dvd:(pos=3) PHRASE 4 r:(pos=4))" },
00491 { "php ;) in een array zetten", "(Zphp:(pos=1) OR Zin:(pos=2) OR Zeen:(pos=3) OR Zarray:(pos=4) OR Zzetten:(pos=5))" },
00492 { "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))" },
00493 { "creative (soundblaster OR sb) 128", "(Zcreativ:(pos=1) OR Zsoundblast:(pos=2) OR Zsb:(pos=3) OR 128:(pos=4))" },
00494 { "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))" },
00495 { "Formateren lukt niet(98,XP)", "(formateren:(pos=1) OR Zlukt:(pos=2) OR niet:(pos=3) OR 98:(pos=4) OR xp:(pos=5))" },
00496 { "access denied (java.io.", "(Zaccess:(pos=1) OR Zdeni:(pos=2) OR (java:(pos=3) PHRASE 2 io:(pos=4)))" },
00497 { "(access denied (java.io.)", "(Zaccess:(pos=1) OR Zdeni:(pos=2) OR (java:(pos=3) PHRASE 2 io:(pos=4)))" },
00498 { "wil niet installeren ( crc fouten)", "(Zwil:(pos=1) OR Zniet:(pos=2) OR Zinstalleren:(pos=3) OR Zcrc:(pos=4) OR Zfouten:(pos=5))" },
00499 { "(DVD+RW) brandsoftware meerdere", "(dvd:(pos=1) OR rw:(pos=2) OR Zbrandsoftwar:(pos=3) OR Zmeerder:(pos=4))" },
00500 { "(database OF databases) EN geheugen", "(Zdatabas:(pos=1) OR of:(pos=2) OR Zdatabas:(pos=3) OR en:(pos=4) OR Zgeheugen:(pos=5))" },
00501 { "(server 2003) winroute", "(Zserver:(pos=1) OR 2003:(pos=2) OR Zwinrout:(pos=3))" },
00502 { "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))" },
00503 { "(draadloos OR wireless) netwerk", "(Zdraadloo:(pos=1) OR Zwireless:(pos=2) OR Znetwerk:(pos=3))" },
00504 { "localtime(time(NULL));", "(localtime:(pos=1) OR time:(pos=2) OR null:(pos=3))" },
00505 { "ob_start(\"ob_gzhandler\");", "(ob_start:(pos=1) OR ob_gzhandler:(pos=2))" },
00506 { "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)))" },
00507 { "COM+-gebeurtenissysteem", "(com+:(pos=1) PHRASE 2 gebeurtenissysteem:(pos=2))" },
00508 { "rcpthosts (#5.7.1)", "(Zrcpthost:(pos=1) OR 5.7.1:(pos=2))" },
00509 { "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))" },
00510 { "window.open( scrollbar", "((window:(pos=1) PHRASE 2 open:(pos=2)) OR Zscrollbar:(pos=3))" },
00511 { "T68i truc ->", "(t68i:(pos=1) OR Ztruc:(pos=2))" },
00512 { "T68i ->", "t68i:(pos=1)" },
00513 { "\"de lijn is bezet\"\"", "(de:(pos=1) PHRASE 4 lijn:(pos=2) PHRASE 4 is:(pos=3) PHRASE 4 bezet:(pos=4))" },
00514 { "if (eregi(\"", "(Zif:(pos=1) OR eregi:(pos=2))" },
00515 { "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))" },
00516 { "execCommand(\"Paste\");", "(execcommand:(pos=1) OR paste:(pos=2))" },
00517 { "\"-1 unread\"", "(1:(pos=1) PHRASE 2 unread:(pos=2))" },
00518 { "\"www.historical-fire-engines", "(www:(pos=1) PHRASE 4 historical:(pos=2) PHRASE 4 fire:(pos=3) PHRASE 4 engines:(pos=4))" },
00519 { "\"DVD+RW\" erase", "((dvd:(pos=1) PHRASE 2 rw:(pos=2)) OR Zeras:(pos=3))" },
00520 { "[showjekamer)", "Zshowjekam:(pos=1)" },
00521 { "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))" },
00522 { "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))" },
00523 { "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))" },
00524 { "vervangen # \"/", "Zvervangen:(pos=1)" },
00525 { "vervangen # /\"", "Zvervangen:(pos=1)" },
00526 { "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))" },
00527 { "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))" },
00528 { "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))" },
00529 { "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))" },
00530 { "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))" },
00531 { "mag mijn waarschuwing nu weg ? ;)", "(Zmag:(pos=1) OR Zmijn:(pos=2) OR Zwaarschuw:(pos=3) OR Znu:(pos=4) OR Zweg:(pos=5))" },
00532 { "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))" },
00533 { "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)))" },
00534 { "(browser 19) citrix", "(Zbrowser:(pos=1) OR 19:(pos=2) OR Zcitrix:(pos=3))" },
00535 { "preg_replace (.*?)", "Zpreg_replac:(pos=1)" },
00536 { "formule excel #naam\"?\"", "(Zformul:(pos=1) OR Zexcel:(pos=2) OR naam:(pos=3))" },
00537 { "->", "" },
00538 { "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))" },
00539 { "<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)))" },
00540 { "\"rpm -e httpd\"", "(rpm:(pos=1) PHRASE 3 e:(pos=2) PHRASE 3 httpd:(pos=3))" },
00541 { "automatisch op All Flis (*.*)", "(Zautomatisch:(pos=1) OR Zop:(pos=2) OR all:(pos=3) OR flis:(pos=4))" },
00542 { "(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)))" },
00543 { "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)))" },
00544 { "\"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))" },
00545 { "(./) chmod.sh", "(chmod:(pos=1) PHRASE 2 sh:(pos=2))" },
00546 { "document.write(ssg(\" html", "((document:(pos=1) PHRASE 2 write:(pos=2)) OR ssg:(pos=3) OR html:(pos=4))" },
00547 { "superstack \"mac+adressen\"", "(Zsuperstack:(pos=1) OR (mac:(pos=2) PHRASE 2 adressen:(pos=3)))" },
00548 { "IIS getenv(REMOTE_HOST)_", "(iis:(pos=1) OR getenv:(pos=2) OR remote_host:(pos=3) OR _:(pos=4))" },
00549 { "IIS en getenv(REMOTE_HOST)", "(iis:(pos=1) OR Zen:(pos=2) OR getenv:(pos=3) OR remote_host:(pos=4))" },
00550 { "php getenv(\"HTTP_REFERER\")", "(Zphp:(pos=1) OR getenv:(pos=2) OR http_referer:(pos=3))" },
00551 { "nec+-1300", "(nec+:(pos=1) PHRASE 2 1300:(pos=2))" },
00552 { "smbpasswd script \"-s\"", "(Zsmbpasswd:(pos=1) OR Zscript:(pos=2) OR s:(pos=3))" },
00553 { "leestekens \" \xc3\xb6 \xc3\xab", "(Zleesteken:(pos=1) OR (\xc3\xb6:(pos=2) PHRASE 2 \xc3\xab:(pos=3)))" },
00554 { "freesco and (all seeing eye)", "(Zfreesco:(pos=1) OR Zand:(pos=2) OR Zall:(pos=3) OR Zsee:(pos=4) OR Zeye:(pos=5))" },
00555 { "('all seeing eye') and freesco", "(Zall:(pos=1) OR Zsee:(pos=2) OR Zeye:(pos=3) OR Zand:(pos=4) OR Zfreesco:(pos=5))" },
00556 { "\"[......\"", "" },
00557 { "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))" },
00558 { "gegevensfout (cyclishe redundantiecontrole)", "(Zgegevensfout:(pos=1) OR Zcyclish:(pos=2) OR Zredundantiecontrol:(pos=3))" },
00559 { "firmware versie waar NEC\"", "(Zfirmwar:(pos=1) OR Zversi:(pos=2) OR Zwaar:(pos=3) OR nec:(pos=4))" },
00560 { "nu.nl \"-1\"", "((nu:(pos=1) PHRASE 2 nl:(pos=2)) OR 1:(pos=3))" },
00561 { "provider+-webspace", "(provider+:(pos=1) PHRASE 2 webspace:(pos=2))" },
00562 { "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)))" },
00563 { "(dhcp client) + hangt", "(Zdhcp:(pos=1) OR Zclient:(pos=2) OR Zhangt:(pos=3))" },
00564 { "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))" },
00565 { "voeding passief gekoeld\"", "(Zvoed:(pos=1) OR Zpassief:(pos=2) OR gekoeld:(pos=3))" },
00566 { "if (mysql_num_rows($resultaat)==1)", "(Zif:(pos=1) OR mysql_num_rows:(pos=2) OR Zresultaat:(pos=3) OR 1:(pos=4))" },
00567 { "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)))" },
00568 { "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)))" },
00569 { "if (cod>9999999", "(Zif:(pos=1) OR cod:(pos=2) OR 9999999:(pos=3))" },
00570 { "\"rm -rf /bin/laden\"", "(rm:(pos=1) PHRASE 4 rf:(pos=2) PHRASE 4 bin:(pos=3) PHRASE 4 laden:(pos=4))" },
00571 { "\">>> 0) & 0xFF\"", "(0:(pos=1) PHRASE 2 0xff:(pos=2))" },
00572 { "<!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)))" },
00573 { "<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))" },
00574 { "linux humor :)", "(Zlinux:(pos=1) OR Zhumor:(pos=2))" },
00575 { "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))" },
00576 { "remote_smtp defer (-44)", "(Zremote_smtp:(pos=1) OR Zdefer:(pos=2) OR 44:(pos=3))" },
00577 { "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))" },
00578 { "Koper + amoniak (NH2", "(koper:(pos=1) OR Zamoniak:(pos=2) OR nh2:(pos=3))" },
00579 { "nec dvd -/+r", "((Znec:(pos=1) OR Zdvd:(pos=2)) AND_NOT Zr:(pos=3))" },
00580 { "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))" },
00581 { "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)))" },
00582 { "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))" },
00583 { "\"~\" + \"c:\\\"", "Zc:(pos=1)" },
00584 { "mysql count(*)", "(Zmysql:(pos=1) OR count:(pos=2))" },
00585 { "for %f in (*.*) do", "(Zfor:(pos=1) OR Zf:(pos=2) OR Zin:(pos=3) OR Zdo:(pos=4))" },
00586 { "raar \"~\" bestand", "(Zraar:(pos=1) OR Zbestand:(pos=2))" },
00587 { "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))" },
00588 { "approved (ref: 38446-263)", "(Zapprov:(pos=1) OR Zref:(pos=2) OR (38446:(pos=3) PHRASE 2 263:(pos=4)))" },
00589 { "GA-7VRXP(2.0)", "((ga:(pos=1) PHRASE 2 7vrxp:(pos=2)) OR 2.0:(pos=3))" },
00590 { "~ 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))" },
00591 { "asp CreateObject(\"Word.Document\")", "(Zasp:(pos=1) OR createobject:(pos=2) OR (word:(pos=3) PHRASE 2 document:(pos=4)))" },
00592 { "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))" },
00593 { "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)))" },
00594 { "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))" },
00595 { "<% 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))" },
00596 { "Active Desktop (Hier issie)", "(active:(pos=1) OR desktop:(pos=2) OR hier:(pos=3) OR Zissi:(pos=4))" },
00597 { "Asus A7V8X (LAN + Sound)", "(asus:(pos=1) OR a7v8x:(pos=2) OR lan:(pos=3) OR sound:(pos=4))" },
00598 { "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))" },
00599 { "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))" },
00600 { "session_register(\"login\");", "(session_register:(pos=1) OR login:(pos=2))" },
00601 { "\"kylix+ndmb\"", "(kylix:(pos=1) PHRASE 2 ndmb:(pos=2))" },
00602 { "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)))" },
00603 { "If ($_SESSION[\"Login\"] == 1)", "(if:(pos=1) OR _session:(pos=2) OR login:(pos=3) OR 1:(pos=4))" },
00604 { "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))" },
00605 { "ASRock K7VT2 (incl. LAN)", "(asrock:(pos=1) OR k7vt2:(pos=2) OR Zincl:(pos=3) OR lan:(pos=4))" },
00606 { "+windows98 +(geen communicatie) +ie5", "(Zwindows98:(pos=1) AND (Zgeen:(pos=2) OR Zcommunicati:(pos=3)) AND Zie5:(pos=4))" },
00607 { "\"xterm -fn\"", "(xterm:(pos=1) PHRASE 2 fn:(pos=2))" },
00608 { "IRQL_NOT_LESS_OR_EQUAL", "irql_not_less_or_equal:(pos=1)" },
00609 { "access query \"NOT IN\"", "(Zaccess:(pos=1) OR Zqueri:(pos=2) OR (not:(pos=3) PHRASE 2 in:(pos=4)))" },
00610 { "\"phrase one \"phrase two\"", "((phrase:(pos=1) PHRASE 2 one:(pos=2)) OR Zphrase:(pos=3) OR two:(pos=4))" },
00611 { "NEAR 207 46 249 27", "(near:(pos=1) OR 207:(pos=2) OR 46:(pos=3) OR 249:(pos=4) OR 27:(pos=5))" },
00612 { "- NEAR 12V voeding", "(near:(pos=1) OR 12v:(pos=2) OR Zvoed:(pos=3))" },
00613 { "waarom \"~\" in directorynaam", "(Zwaarom:(pos=1) OR Zin:(pos=2) OR Zdirectorynaam:(pos=3))" },
00614 { "cd'r NEAR toebehoren", "(cd'r:(pos=1) NEAR 11 toebehoren:(pos=2))" },
00615 { "site:1 site:2", "0 * (H1 OR H2)" },
00616 { "site:1 site2:2", "0 * (H1 AND J2)" },
00617 { "site:1 site:2 site2:2", "0 * ((H1 OR H2) AND J2)" },
00618 { "site:1 OR site:2", "(0 * H1 OR 0 * H2)" },
00619 { "site:1 AND site:2", "(0 * H1 AND 0 * H2)" },
00620 { "foo AND site:2", "(Zfoo:(pos=1) AND 0 * H2)" },
00621
00622 { "category:1 category:2", "0 * (XCAT1 AND XCAT2)" },
00623 { "category:1 site2:2", "0 * (J2 AND XCAT1)" },
00624 { "category:1 category:2 site2:2", "0 * (J2 AND XCAT1 AND XCAT2)" },
00625 { "category:1 OR category:2", "(0 * XCAT1 OR 0 * XCAT2)" },
00626 { "category:1 AND category:2", "(0 * XCAT1 AND 0 * XCAT2)" },
00627 { "foo AND category:2", "(Zfoo:(pos=1) AND 0 * XCAT2)" },
00628 #if 0
00629 { "A site:1 site:2", "(a FILTER (H1 OR H2))" },
00630 { "A (site:1 OR site:2)", "(a FILTER (H1 OR H2))" },
00631 { "A (site:1 OR site:2)", "(a FILTER (H1 OR H2))" },
00632 { "A site:1 site2:2", "(a FILTER (H1 AND J2))" },
00633 { "A site:1 site:2 site2:2", "(a FILTER ((H1 OR H2) AND J2))" },
00634 { "A site:1 OR site:2", "(a FILTER (H1 OR H2))" },
00635 { "A site:1 AND site:2", "(a FILTER (H1 AND H2))" },
00636 #endif
00637 { "site:xapian.org OR site:www.xapian.org", "(0 * Hxapian.org OR 0 * Hwww.xapian.org)" },
00638 { "site:xapian.org site:www.xapian.org", "0 * (Hxapian.org OR Hwww.xapian.org)" },
00639 { "site:xapian.org AND site:www.xapian.org", "(0 * Hxapian.org AND 0 * Hwww.xapian.org)" },
00640 { "Xapian site:xapian.org site:www.xapian.org", "(xapian:(pos=1) FILTER (Hxapian.org OR Hwww.xapian.org))" },
00641 { "author:richard author:olly writer:charlie", "(ZArichard:(pos=1) OR ZAolli:(pos=2) OR ZAcharli:(pos=3))"},
00642 { "author:richard NEAR title:book", "(Arichard:(pos=1) NEAR 11 XTbook:(pos=2))"},
00643 { "authortitle:richard NEAR title:book", "((Arichard:(pos=1) NEAR 11 XTbook:(pos=2)) OR (XTrichard:(pos=1) NEAR 11 XTbook:(pos=2)))"},
00644 { "multisite:xapian.org", "0 * (Hxapian.org OR Jxapian.org)"},
00645 { "authortitle:richard", "(ZArichard:(pos=1) OR ZXTrichard:(pos=1))"},
00646 { "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)))"},
00647 { "authortitle:richard-boulton", "((Arichard:(pos=1) PHRASE 2 Aboulton:(pos=2)) OR (XTrichard:(pos=1) PHRASE 2 XTboulton:(pos=2)))"},
00648 { "authortitle:\"richard boulton\"", "((Arichard:(pos=1) PHRASE 2 Aboulton:(pos=2)) OR (XTrichard:(pos=1) PHRASE 2 XTboulton:(pos=2)))"},
00649
00650 { "久有归天愿", "(久:(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))" },
00651 { "title:久有 归 天愿", "((XT久:(pos=1) AND XT久有:(pos=1) AND XT有:(pos=1)) OR 归:(pos=2) OR (天:(pos=3) AND 天愿:(pos=3) AND 愿:(pos=3)))" },
00652 { "h众ello万众", "(Zh:(pos=1) OR 众:(pos=2) OR Zello:(pos=3) OR (万:(pos=4) AND 万众:(pos=4) AND 众:(pos=4)))" },
00653 { "世(の中)TEST_tm", "(世:(pos=1) OR (の:(pos=2) AND の中:(pos=2) AND 中:(pos=2)) OR test_tm:(pos=3))" },
00654 { "다녀 AND 와야", "(다:(pos=1) AND 다녀:(pos=1) AND 녀:(pos=1) AND 와:(pos=2) AND 와야:(pos=2) AND 야:(pos=2))" },
00655 { "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)))" },
00656
00657 { "\"久有归\"", "(久:(pos=1) PHRASE 3 有:(pos=1) PHRASE 3 归:(pos=1))" },
00658 { "\"久有test归\"", "(久:(pos=1) PHRASE 4 有:(pos=1) PHRASE 4 test:(pos=2) PHRASE 4 归:(pos=3))" },
00659
00660 { NULL, NULL }
00661 };
00662
00663 static bool test_queryparser1()
00664 {
00665 Xapian::QueryParser queryparser;
00666 queryparser.set_stemmer(Xapian::Stem("english"));
00667 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00668 queryparser.add_prefix("author", "A");
00669 queryparser.add_prefix("writer", "A");
00670 queryparser.add_prefix("title", "XT");
00671 queryparser.add_prefix("subject", "XT");
00672 queryparser.add_prefix("authortitle", "A");
00673 queryparser.add_prefix("authortitle", "XT");
00674 queryparser.add_boolean_prefix("site", "H");
00675 queryparser.add_boolean_prefix("site2", "J");
00676 queryparser.add_boolean_prefix("multisite", "H");
00677 queryparser.add_boolean_prefix("multisite", "J");
00678 queryparser.add_boolean_prefix("category", "XCAT", false);
00679 TEST_EXCEPTION(Xapian::InvalidOperationError,
00680 queryparser.add_boolean_prefix("authortitle", "B");
00681 );
00682 TEST_EXCEPTION(Xapian::InvalidOperationError,
00683 queryparser.add_prefix("multisite", "B");
00684 );
00685 for (const test *p = test_or_queries; p->query; ++p) {
00686 string expect, parsed;
00687 if (p->expect)
00688 expect = p->expect;
00689 else
00690 expect = "parse error";
00691 try {
00692 Xapian::Query qobj = queryparser.parse_query(p->query);
00693 parsed = qobj.get_description();
00694 expect = string("Xapian::Query(") + expect + ')';
00695 } catch (const Xapian::QueryParserError &e) {
00696 parsed = e.get_msg();
00697 } catch (const Xapian::Error &e) {
00698 parsed = e.get_description();
00699 } catch (...) {
00700 parsed = "Unknown exception!";
00701 }
00702 tout << "Query: " << p->query << '\n';
00703 TEST_STRINGS_EQUAL(parsed, expect);
00704 }
00705 return true;
00706 }
00707
00708 static const test test_and_queries[] = {
00709 { "internet explorer title:(http www)", "(Zinternet:(pos=1) AND Zexplor:(pos=2) AND ZXThttp:(pos=3) AND ZXTwww:(pos=4))" },
00710
00711
00712 { "one +two three", "(Zone:(pos=1) AND Ztwo:(pos=2) AND Zthree:(pos=3))" },
00713 { "hello -title:\"hello world\"", "(Zhello:(pos=1) AND_NOT (XThello:(pos=2) PHRASE 2 XTworld:(pos=3)))" },
00714
00715
00716 { "\"hello world\" -C++", "((hello:(pos=1) PHRASE 2 world:(pos=2)) AND_NOT c++:(pos=3))" },
00717
00718
00719 { "-cup site:world", "(0 * Hworld AND_NOT Zcup:(pos=1))" },
00720 { "site:world -cup", "(0 * Hworld AND_NOT Zcup:(pos=1))" },
00721
00722 { "(site:world) -cup", "(0 * Hworld AND_NOT Zcup:(pos=1))" },
00723
00724
00725
00726 { "foo site:xapian.org bar", "((Zfoo:(pos=1) AND Zbar:(pos=2)) FILTER Hxapian.org)" },
00727
00728 { "a b site:xapian.org", "((Za:(pos=1) AND Zb:(pos=2)) FILTER Hxapian.org)" },
00729 { "site:xapian.org a b", "((Za:(pos=1) AND Zb:(pos=2)) FILTER Hxapian.org)" },
00730
00731 { "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)))" },
00732 { "洛伊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))" },
00733 { NULL, NULL }
00734 };
00735
00736
00737 static bool test_qp_default_op1()
00738 {
00739 Xapian::QueryParser queryparser;
00740 queryparser.set_stemmer(Xapian::Stem("english"));
00741 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00742 queryparser.add_prefix("author", "A");
00743 queryparser.add_prefix("title", "XT");
00744 queryparser.add_prefix("subject", "XT");
00745 queryparser.add_boolean_prefix("site", "H");
00746 queryparser.set_default_op(Xapian::Query::OP_AND);
00747 for (const test *p = test_and_queries; p->query; ++p) {
00748 string expect, parsed;
00749 if (p->expect)
00750 expect = p->expect;
00751 else
00752 expect = "parse error";
00753 try {
00754 Xapian::Query qobj = queryparser.parse_query(p->query);
00755 parsed = qobj.get_description();
00756 expect = string("Xapian::Query(") + expect + ')';
00757 } catch (const Xapian::QueryParserError &e) {
00758 parsed = e.get_msg();
00759 } catch (const Xapian::Error &e) {
00760 parsed = e.get_description();
00761 } catch (...) {
00762 parsed = "Unknown exception!";
00763 }
00764 tout << "Query: " << p->query << '\n';
00765 TEST_STRINGS_EQUAL(parsed, expect);
00766 }
00767 return true;
00768 }
00769
00770
00771 static bool test_qp_default_prefix1()
00772 {
00773 Xapian::QueryParser qp;
00774 qp.set_stemmer(Xapian::Stem("english"));
00775 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00776 qp.add_prefix("title", "XT");
00777
00778 Xapian::Query qobj;
00779 qobj = qp.parse_query("hello world", 0, "A");
00780 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAhello:(pos=1) OR ZAworld:(pos=2)))");
00781 qobj = qp.parse_query("me title:stuff", 0, "A");
00782 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAme:(pos=1) OR ZXTstuff:(pos=2)))");
00783 qobj = qp.parse_query("title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN, "A");
00784 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXTstuff:(pos=1) OR ZAme:(pos=2)))");
00785 qobj = qp.parse_query("英国 title:文森hello", 0, "A");
00786 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)))");
00787 return true;
00788 }
00789
00790
00791
00792 static bool test_qp_default_prefix2()
00793 {
00794 Xapian::QueryParser qp;
00795 qp.set_stemmer(Xapian::Stem("english"));
00796 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
00797
00798
00799 TEST_EXCEPTION(Xapian::UnimplementedError,
00800 qp.add_boolean_prefix("", "B");
00801 );
00802
00803 qp.add_prefix("title", "XT");
00804 qp.add_prefix("", "A");
00805
00806 Xapian::Query qobj;
00807 qobj = qp.parse_query("hello world", 0);
00808 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAhello:(pos=1) OR ZAworld:(pos=2)))");
00809 qobj = qp.parse_query("me title:stuff", 0);
00810 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZAme:(pos=1) OR ZXTstuff:(pos=2)))");
00811 qobj = qp.parse_query("title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN);
00812 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXTstuff:(pos=1) OR ZAme:(pos=2)))");
00813
00814 qobj = qp.parse_query("hello world", 0, "B");
00815 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZBhello:(pos=1) OR ZBworld:(pos=2)))");
00816 qobj = qp.parse_query("me title:stuff", 0, "B");
00817 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZBme:(pos=1) OR ZXTstuff:(pos=2)))");
00818 qobj = qp.parse_query("title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN, "B");
00819 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXTstuff:(pos=1) OR ZBme:(pos=2)))");
00820
00821 qp.add_prefix("", "B");
00822 qobj = qp.parse_query("me-us title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN);
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 ZXTstuff:(pos=3) OR ZAme:(pos=4) OR ZBme:(pos=4)))");
00824 qobj = qp.parse_query("me-us title:(stuff) me", Xapian::QueryParser::FLAG_BOOLEAN, "C");
00825 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((Cme:(pos=1) PHRASE 2 Cus:(pos=2)) OR ZXTstuff:(pos=3) OR ZCme:(pos=4)))");
00826
00827 qobj = qp.parse_query("me-us title:\"not-me\"", Xapian::QueryParser::FLAG_PHRASE);
00828 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))))");
00829 return true;
00830 }
00831
00832
00833 static bool test_qp_odd_chars1()
00834 {
00835 Xapian::QueryParser qp;
00836 string query("\x01weird\x00stuff\x7f", 13);
00837 Xapian::Query qobj = qp.parse_query(query);
00838 tout << "Query: " << query << '\n';
00839 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((weird:(pos=1) OR stuff:(pos=2)))");
00840 return true;
00841 }
00842
00843
00844 static bool test_qp_flag_wildcard1()
00845 {
00846 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
00847 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
00848 #else
00849 Xapian::WritableDatabase db(Xapian::InMemory::open());
00850 Xapian::Document doc;
00851 doc.add_term("abc");
00852 doc.add_term("main");
00853 doc.add_term("muscat");
00854 doc.add_term("muscle");
00855 doc.add_term("musclebound");
00856 doc.add_term("muscular");
00857 doc.add_term("mutton");
00858 db.add_document(doc);
00859 Xapian::QueryParser qp;
00860 qp.set_database(db);
00861 Xapian::Query qobj = qp.parse_query("ab*", Xapian::QueryParser::FLAG_WILDCARD);
00862 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(abc:(pos=1))");
00863 qobj = qp.parse_query("muscle*", Xapian::QueryParser::FLAG_WILDCARD);
00864 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((muscle:(pos=1) SYNONYM musclebound:(pos=1)))");
00865 qobj = qp.parse_query("meat*", Xapian::QueryParser::FLAG_WILDCARD);
00866 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00867 qobj = qp.parse_query("musc*", Xapian::QueryParser::FLAG_WILDCARD);
00868 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((muscat:(pos=1) SYNONYM muscle:(pos=1) SYNONYM musclebound:(pos=1) SYNONYM muscular:(pos=1)))");
00869 qobj = qp.parse_query("mutt*", Xapian::QueryParser::FLAG_WILDCARD);
00870 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mutton:(pos=1))");
00871
00872
00873 qobj = qp.parse_query("mUTTON++");
00874 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mutton:(pos=1))");
00875
00876 unsigned flags = Xapian::QueryParser::FLAG_WILDCARD |
00877 Xapian::QueryParser::FLAG_LOVEHATE;
00878 qobj = qp.parse_query("+mai* main", flags);
00879 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((main:(pos=1) AND_MAYBE main:(pos=2)))");
00880
00881
00882 qobj = qp.parse_query("foo* main", flags);
00883 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00884 qobj = qp.parse_query("main foo*", flags);
00885 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00886 qobj = qp.parse_query("+foo* main", flags);
00887 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00888 qobj = qp.parse_query("main +foo*", flags);
00889 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00890 qobj = qp.parse_query("foo* +main", flags);
00891 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00892 qobj = qp.parse_query("+main foo*", flags);
00893 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00894 qobj = qp.parse_query("+foo* +main", flags);
00895 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00896 qobj = qp.parse_query("+main +foo*", flags);
00897 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00898 qobj = qp.parse_query("foo* mai", flags);
00899 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=2))");
00900 qobj = qp.parse_query("mai foo*", flags);
00901 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=1))");
00902 qobj = qp.parse_query("+foo* mai", flags);
00903 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00904 qobj = qp.parse_query("mai +foo*", flags);
00905 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00906 qobj = qp.parse_query("foo* +mai", flags);
00907 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=2))");
00908 qobj = qp.parse_query("+mai foo*", flags);
00909 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(mai:(pos=1))");
00910 qobj = qp.parse_query("+foo* +mai", flags);
00911 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00912 qobj = qp.parse_query("+mai +foo*", flags);
00913 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00914 qobj = qp.parse_query("-foo* main", flags);
00915 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00916 qobj = qp.parse_query("main -foo*", flags);
00917 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00918 qobj = qp.parse_query("main -foo* -bar", flags);
00919 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((main:(pos=1) AND_NOT bar:(pos=3)))");
00920 qobj = qp.parse_query("main -bar -foo*", flags);
00921 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((main:(pos=1) AND_NOT bar:(pos=2)))");
00922
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 qp.set_default_op(Xapian::Query::OP_AND);
00929 qobj = qp.parse_query("+foo* main", flags);
00930 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00931 qobj = qp.parse_query("main +foo*", flags);
00932 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00933 qobj = qp.parse_query("-foo* main", flags);
00934 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=2))");
00935 qobj = qp.parse_query("main -foo*", flags);
00936 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(main:(pos=1))");
00937
00938 qobj = qp.parse_query("foo* -main", Xapian::QueryParser::FLAG_WILDCARD);
00939 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query()");
00940
00941 qobj = qp.parse_query("abc muscl* main", flags);
00942 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) AND (muscle:(pos=2) SYNONYM musclebound:(pos=2)) AND main:(pos=3)))");
00943 return true;
00944 #endif
00945 }
00946
00947
00948 static bool test_qp_flag_wildcard2()
00949 {
00950 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
00951 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
00952 #else
00953 Xapian::WritableDatabase db(Xapian::InMemory::open());
00954 Xapian::Document doc;
00955 doc.add_term("Aheinlein");
00956 doc.add_term("Ahuxley");
00957 doc.add_term("hello");
00958 db.add_document(doc);
00959 Xapian::QueryParser qp;
00960 qp.set_database(db);
00961 qp.add_prefix("author", "A");
00962 Xapian::Query qobj;
00963 qobj = qp.parse_query("author:h*", Xapian::QueryParser::FLAG_WILDCARD);
00964 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((Aheinlein:(pos=1) SYNONYM Ahuxley:(pos=1)))");
00965 qobj = qp.parse_query("author:h* test", Xapian::QueryParser::FLAG_WILDCARD);
00966 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((Aheinlein:(pos=1) SYNONYM Ahuxley:(pos=1)) OR test:(pos=2)))");
00967 return true;
00968 #endif
00969 }
00970
00971 #ifdef XAPIAN_HAS_INMEMORY_BACKEND
00972 static void
00973 test_qp_flag_wildcard1_helper(const Xapian::Database &db,
00974 Xapian::termcount max_expansion,
00975 const string & query_string)
00976 {
00977 Xapian::QueryParser qp;
00978 qp.set_database(db);
00979 qp.set_max_wildcard_expansion(max_expansion);
00980 Xapian::Enquire e(db);
00981 e.set_query(qp.parse_query(query_string, Xapian::QueryParser::FLAG_WILDCARD));
00982
00983
00984 e.get_mset(0, 10);
00985 }
00986 #endif
00987
00988
00989 static bool test_qp_flag_wildcard3()
00990 {
00991 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
00992 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
00993 #else
00994 Xapian::WritableDatabase db(Xapian::InMemory::open());
00995 Xapian::Document doc;
00996 doc.add_term("abc");
00997 doc.add_term("main");
00998 doc.add_term("muscat");
00999 doc.add_term("muscle");
01000 doc.add_term("musclebound");
01001 doc.add_term("muscular");
01002 doc.add_term("mutton");
01003 db.add_document(doc);
01004
01005
01006 test_qp_flag_wildcard1_helper(db, 0, "z*");
01007 test_qp_flag_wildcard1_helper(db, 0, "m*");
01008
01009
01010 test_qp_flag_wildcard1_helper(db, 1, "z*");
01011 test_qp_flag_wildcard1_helper(db, 1, "ab*");
01012 test_qp_flag_wildcard1_helper(db, 2, "muscle*");
01013 test_qp_flag_wildcard1_helper(db, 4, "musc*");
01014 test_qp_flag_wildcard1_helper(db, 4, "mus*");
01015 test_qp_flag_wildcard1_helper(db, 5, "mu*");
01016 test_qp_flag_wildcard1_helper(db, 6, "m*");
01017
01018
01019 TEST_EXCEPTION(Xapian::QueryParserError,
01020 test_qp_flag_wildcard1_helper(db, 1, "muscle*"));
01021 TEST_EXCEPTION(Xapian::QueryParserError,
01022 test_qp_flag_wildcard1_helper(db, 3, "musc*"));
01023 TEST_EXCEPTION(Xapian::QueryParserError,
01024 test_qp_flag_wildcard1_helper(db, 3, "mus*"));
01025 TEST_EXCEPTION(Xapian::QueryParserError,
01026 test_qp_flag_wildcard1_helper(db, 4, "mu*"));
01027 TEST_EXCEPTION(Xapian::QueryParserError,
01028 test_qp_flag_wildcard1_helper(db, 5, "m*"));
01029
01030 return true;
01031 #endif
01032 }
01033
01034
01035 static bool test_qp_flag_partial1()
01036 {
01037 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
01038 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
01039 #else
01040 Xapian::WritableDatabase db(Xapian::InMemory::open());
01041 Xapian::Document doc;
01042 Xapian::Stem stemmer("english");
01043 doc.add_term("abc");
01044 doc.add_term("main");
01045 doc.add_term("muscat");
01046 doc.add_term("muscle");
01047 doc.add_term("musclebound");
01048 doc.add_term("muscular");
01049 doc.add_term("mutton");
01050 doc.add_term("Z" + stemmer("outside"));
01051 doc.add_term("Z" + stemmer("out"));
01052 doc.add_term("outside");
01053 doc.add_term("out");
01054 doc.add_term("XTcove");
01055 doc.add_term("XTcows");
01056 doc.add_term("XTcowl");
01057 doc.add_term("XTcox");
01058 doc.add_term("ZXTcow");
01059 doc.add_term("XONEpartial");
01060 doc.add_term("XONEpartial2");
01061 doc.add_term("XTWOpartial3");
01062 doc.add_term("XTWOpartial4");
01063 db.add_document(doc);
01064 Xapian::QueryParser qp;
01065 qp.set_database(db);
01066 qp.set_stemmer(stemmer);
01067 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01068 qp.add_prefix("title", "XT");
01069 qp.add_prefix("double", "XONE");
01070 qp.add_prefix("double", "XTWO");
01071
01072
01073 Xapian::Query qobj = qp.parse_query("a", Xapian::QueryParser::FLAG_PARTIAL);
01074 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) OR Za:(pos=1)))");
01075 qobj = qp.parse_query("ab", Xapian::QueryParser::FLAG_PARTIAL);
01076 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) OR Zab:(pos=1)))");
01077 qobj = qp.parse_query("muscle", Xapian::QueryParser::FLAG_PARTIAL);
01078 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((muscle:(pos=1) SYNONYM musclebound:(pos=1)) OR Zmuscl:(pos=1)))");
01079 qobj = qp.parse_query("meat", Xapian::QueryParser::FLAG_PARTIAL);
01080 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(Zmeat:(pos=1))");
01081 qobj = qp.parse_query("musc", Xapian::QueryParser::FLAG_PARTIAL);
01082 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)))");
01083 qobj = qp.parse_query("mutt", Xapian::QueryParser::FLAG_PARTIAL);
01084 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((mutton:(pos=1) OR Zmutt:(pos=1)))");
01085 qobj = qp.parse_query("abc musc", Xapian::QueryParser::FLAG_PARTIAL);
01086 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)))");
01087 qobj = qp.parse_query("a* mutt", Xapian::QueryParser::FLAG_PARTIAL | Xapian::QueryParser::FLAG_WILDCARD);
01088 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((abc:(pos=1) OR mutton:(pos=2) OR Zmutt:(pos=2)))");
01089
01090
01091 qobj = qp.parse_query("o", Xapian::QueryParser::FLAG_PARTIAL);
01092 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zo:(pos=1)))");
01093 qobj = qp.parse_query("ou", Xapian::QueryParser::FLAG_PARTIAL);
01094 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zou:(pos=1)))");
01095 qobj = qp.parse_query("out", Xapian::QueryParser::FLAG_PARTIAL);
01096 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zout:(pos=1)))");
01097 qobj = qp.parse_query("outs", Xapian::QueryParser::FLAG_PARTIAL);
01098 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zout:(pos=1)))");
01099 qobj = qp.parse_query("outsi", Xapian::QueryParser::FLAG_PARTIAL);
01100 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsi:(pos=1)))");
01101 qobj = qp.parse_query("outsid", Xapian::QueryParser::FLAG_PARTIAL);
01102 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsid:(pos=1)))");
01103 qobj = qp.parse_query("outside", Xapian::QueryParser::FLAG_PARTIAL);
01104 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsid:(pos=1)))");
01105
01106
01107 qobj = qp.parse_query("Out", Xapian::QueryParser::FLAG_PARTIAL);
01108 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR out:(pos=1)))");
01109 qobj = qp.parse_query("Outs", Xapian::QueryParser::FLAG_PARTIAL);
01110 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR outs:(pos=1)))");
01111 qobj = qp.parse_query("Outside", Xapian::QueryParser::FLAG_PARTIAL);
01112 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(outside:(pos=1,wqf=2))");
01113
01114
01115 qp.set_stemming_strategy(Xapian::QueryParser::STEM_ALL);
01116 qobj = qp.parse_query("Out", Xapian::QueryParser::FLAG_PARTIAL);
01117 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR out:(pos=1)))");
01118 qobj = qp.parse_query("Outs", Xapian::QueryParser::FLAG_PARTIAL);
01119 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR out:(pos=1)))");
01120 qobj = qp.parse_query("Outside", Xapian::QueryParser::FLAG_PARTIAL);
01121 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR outsid:(pos=1)))");
01122
01123
01124 qp.set_stemming_strategy(Xapian::QueryParser::STEM_ALL_Z);
01125 qobj = qp.parse_query("Out", Xapian::QueryParser::FLAG_PARTIAL);
01126 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((out:(pos=1) SYNONYM outside:(pos=1)) OR Zout:(pos=1)))");
01127 qobj = qp.parse_query("Outs", Xapian::QueryParser::FLAG_PARTIAL);
01128 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zout:(pos=1)))");
01129 qobj = qp.parse_query("Outside", Xapian::QueryParser::FLAG_PARTIAL);
01130 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((outside:(pos=1) OR Zoutsid:(pos=1)))");
01131
01132
01133 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01134 qobj = qp.parse_query("title:cow", Xapian::QueryParser::FLAG_PARTIAL);
01135 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XTcowl:(pos=1) SYNONYM XTcows:(pos=1)) OR ZXTcow:(pos=1)))");
01136 qobj = qp.parse_query("title:cows", Xapian::QueryParser::FLAG_PARTIAL);
01137 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((XTcows:(pos=1) OR ZXTcow:(pos=1)))");
01138 qobj = qp.parse_query("title:Cow", Xapian::QueryParser::FLAG_PARTIAL);
01139 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(((XTcowl:(pos=1) SYNONYM XTcows:(pos=1)) OR XTcow:(pos=1)))");
01140 qobj = qp.parse_query("title:Cows", Xapian::QueryParser::FLAG_PARTIAL);
01141 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query(XTcows:(pos=1,wqf=2))");
01142
01143
01144
01145
01146 qobj = qp.parse_query("double:vision", Xapian::QueryParser::FLAG_PARTIAL);
01147 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((ZXONEvision:(pos=1) SYNONYM ZXTWOvision:(pos=1)))");
01148
01149
01150 qobj = qp.parse_query("double:part", Xapian::QueryParser::FLAG_PARTIAL);
01151 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))))");
01152
01153
01154
01155 qp.set_stemming_strategy(Xapian::QueryParser::STEM_NONE);
01156 qobj = qp.parse_query("double:part", Xapian::QueryParser::FLAG_PARTIAL);
01157 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))))");
01158 qobj = qp.parse_query("double:partial", Xapian::QueryParser::FLAG_PARTIAL);
01159 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))))");
01160
01161 return true;
01162 #endif
01163 }
01164
01165 static bool test_qp_flag_bool_any_case1()
01166 {
01167 using Xapian::QueryParser;
01168 Xapian::QueryParser qp;
01169 Xapian::Query qobj;
01170 qobj = qp.parse_query("to and fro", QueryParser::FLAG_BOOLEAN | QueryParser::FLAG_BOOLEAN_ANY_CASE);
01171 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) AND fro:(pos=2)))");
01172 qobj = qp.parse_query("to and fro", QueryParser::FLAG_BOOLEAN);
01173 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) OR and:(pos=2) OR fro:(pos=3)))");
01174
01175 qobj = qp.parse_query("to And fro", QueryParser::FLAG_BOOLEAN | QueryParser::FLAG_BOOLEAN_ANY_CASE);
01176 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) AND fro:(pos=2)))");
01177 qobj = qp.parse_query("to And fro", QueryParser::FLAG_BOOLEAN);
01178 TEST_STRINGS_EQUAL(qobj.get_description(), "Xapian::Query((to:(pos=1) OR and:(pos=2) OR fro:(pos=3)))");
01179 return true;
01180 }
01181
01182 static const test test_stop_queries[] = {
01183 { "test the queryparser", "(test:(pos=1) AND queryparser:(pos=3))" },
01184
01185
01186 { "test AND the AND queryparser", "(test:(pos=1) AND the:(pos=2) AND queryparser:(pos=3))" },
01187
01188
01189 { "the", "the:(pos=1)" },
01190
01191
01192
01193
01194 { "an the a", "(an:(pos=1) AND the:(pos=2) AND a:(pos=3))" },
01195
01196
01197 { "the AND a an", "(the:(pos=1) AND a:(pos=2) AND an:(pos=3))" },
01198 { NULL, NULL }
01199 };
01200
01201 static bool test_qp_stopper1()
01202 {
01203 Xapian::QueryParser qp;
01204 const char * stopwords[] = { "a", "an", "the" };
01205 Xapian::SimpleStopper stop(stopwords, stopwords + 3);
01206 qp.set_stopper(&stop);
01207 qp.set_default_op(Xapian::Query::OP_AND);
01208 for (const test *p = test_stop_queries; p->query; ++p) {
01209 string expect, parsed;
01210 if (p->expect)
01211 expect = p->expect;
01212 else
01213 expect = "parse error";
01214 try {
01215 Xapian::Query qobj = qp.parse_query(p->query);
01216 parsed = qobj.get_description();
01217 expect = string("Xapian::Query(") + expect + ')';
01218 } catch (const Xapian::QueryParserError &e) {
01219 parsed = e.get_msg();
01220 } catch (const Xapian::Error &e) {
01221 parsed = e.get_description();
01222 } catch (...) {
01223 parsed = "Unknown exception!";
01224 }
01225 tout << "Query: " << p->query << '\n';
01226 TEST_STRINGS_EQUAL(parsed, expect);
01227 }
01228 return true;
01229 }
01230
01231 static const test test_pure_not_queries[] = {
01232 { "NOT windows", "(<alldocuments> AND_NOT Zwindow:(pos=1))" },
01233 { "a AND (NOT b)", "(Za:(pos=1) AND (<alldocuments> AND_NOT Zb:(pos=2)))" },
01234 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
01235 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
01236 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
01237 { NULL, NULL }
01238 };
01239
01240 static bool test_qp_flag_pure_not1()
01241 {
01242 using Xapian::QueryParser;
01243 Xapian::QueryParser qp;
01244 qp.set_stemmer(Xapian::Stem("english"));
01245 qp.set_stemming_strategy(QueryParser::STEM_SOME);
01246 for (const test *p = test_pure_not_queries; p->query; ++p) {
01247 string expect, parsed;
01248 if (p->expect)
01249 expect = p->expect;
01250 else
01251 expect = "parse error";
01252 try {
01253 Xapian::Query qobj = qp.parse_query(p->query,
01254 QueryParser::FLAG_BOOLEAN |
01255 QueryParser::FLAG_PURE_NOT);
01256 parsed = qobj.get_description();
01257 expect = string("Xapian::Query(") + expect + ')';
01258 } catch (const Xapian::QueryParserError &e) {
01259 parsed = e.get_msg();
01260 } catch (const Xapian::Error &e) {
01261 parsed = e.get_description();
01262 } catch (...) {
01263 parsed = "Unknown exception!";
01264 }
01265 tout << "Query: " << p->query << '\n';
01266 TEST_STRINGS_EQUAL(parsed, expect);
01267 }
01268 return true;
01269 }
01270
01271
01272
01273
01274 static bool test_qp_unstem_boolean_prefix()
01275 {
01276 Xapian::QueryParser qp;
01277 qp.add_boolean_prefix("test", "XTEST");
01278 Xapian::Query q = qp.parse_query("hello test:foo");
01279 TEST_STRINGS_EQUAL(q.get_description(), "Xapian::Query((hello:(pos=1) FILTER XTESTfoo))");
01280 Xapian::TermIterator u = qp.unstem_begin("XTESTfoo");
01281 TEST(u != qp.unstem_end("XTESTfoo"));
01282 TEST_EQUAL(*u, "test:foo");
01283 ++u;
01284 TEST(u == qp.unstem_end("XTESTfoo"));
01285 return true;
01286 }
01287
01288 static const test test_value_range1_queries[] = {
01289 { "a..b", "VALUE_RANGE 1 a b" },
01290 { "$50..100", "VALUE_RANGE 1 $50 100" },
01291 { "$50..$100", "VALUE_RANGE 1 $50 $100" },
01292 { "02/03/1979..10/12/1980", "VALUE_RANGE 1 02/03/1979 10/12/1980" },
01293 { "a..b hello", "(hello:(pos=1) FILTER VALUE_RANGE 1 a b)" },
01294 { "hello a..b", "(hello:(pos=1) FILTER VALUE_RANGE 1 a b)" },
01295 { "hello a..b world", "((hello:(pos=1) OR world:(pos=2)) FILTER VALUE_RANGE 1 a b)" },
01296 { "hello a..b test:foo", "(hello:(pos=1) FILTER (VALUE_RANGE 1 a b AND XTESTfoo))" },
01297 { "hello a..b test:foo test:bar", "(hello:(pos=1) FILTER (VALUE_RANGE 1 a b AND (XTESTfoo OR XTESTbar)))" },
01298 { "hello a..b c..d test:foo", "(hello:(pos=1) FILTER ((VALUE_RANGE 1 a b OR VALUE_RANGE 1 c d) AND XTESTfoo))" },
01299 { "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)))" },
01300 { "-5..7", "VALUE_RANGE 1 -5 7" },
01301 { "hello -5..7", "(hello:(pos=1) FILTER VALUE_RANGE 1 -5 7)" },
01302 { "-5..7 hello", "(hello:(pos=1) FILTER VALUE_RANGE 1 -5 7)" },
01303 { "\"time flies\" 09:00..12:30", "((time:(pos=1) PHRASE 2 flies:(pos=2)) FILTER VALUE_RANGE 1 09:00 12:30)" },
01304
01305 { "..b", "VALUE_RANGE 1 b" },
01306 { "a..", "VALUE_GE 1 a" },
01307 { NULL, NULL }
01308 };
01309
01310
01311 static bool test_qp_value_range1()
01312 {
01313 Xapian::QueryParser qp;
01314 qp.add_boolean_prefix("test", "XTEST");
01315 Xapian::StringValueRangeProcessor vrp(1);
01316 qp.add_valuerangeprocessor(&vrp);
01317 for (const test *p = test_value_range1_queries; p->query; ++p) {
01318 string expect, parsed;
01319 if (p->expect)
01320 expect = p->expect;
01321 else
01322 expect = "parse error";
01323 try {
01324 Xapian::Query qobj = qp.parse_query(p->query);
01325 parsed = qobj.get_description();
01326 expect = string("Xapian::Query(") + expect + ')';
01327 } catch (const Xapian::QueryParserError &e) {
01328 parsed = e.get_msg();
01329 } catch (const Xapian::Error &e) {
01330 parsed = e.get_description();
01331 } catch (...) {
01332 parsed = "Unknown exception!";
01333 }
01334 tout << "Query: " << p->query << '\n';
01335 TEST_STRINGS_EQUAL(parsed, expect);
01336 }
01337 return true;
01338 }
01339
01340 static const test test_value_range2_queries[] = {
01341 { "a..b", "VALUE_RANGE 3 a b" },
01342 { "1..12", "VALUE_RANGE 2 \240 \256" },
01343 { "20070201..20070228", "VALUE_RANGE 1 20070201 20070228" },
01344 { "$10..20", "VALUE_RANGE 4 \255 \261" },
01345 { "$10..$20", "VALUE_RANGE 4 \255 \261" },
01346
01347 { "$..20", "VALUE_RANGE 4 \261" },
01348 { "$10..", "VALUE_GE 4 \255" },
01349 { "12..42kg", "VALUE_RANGE 5 \256 \265@" },
01350 { "12kg..42kg", "VALUE_RANGE 5 \256 \265@" },
01351 { "12kg..42", "VALUE_RANGE 3 12kg 42" },
01352 { "10..$20", "VALUE_RANGE 3 10 $20" },
01353 { "1999-03-12..2020-12-30", "VALUE_RANGE 1 19990312 20201230" },
01354 { "1999/03/12..2020/12/30", "VALUE_RANGE 1 19990312 20201230" },
01355 { "1999.03.12..2020.12.30", "VALUE_RANGE 1 19990312 20201230" },
01356
01357 { "..2020.12.30", "VALUE_RANGE 1 20201230" },
01358 { "1999.03.12..", "VALUE_GE 1 19990312" },
01359 { "12/03/99..12/04/01", "VALUE_RANGE 1 19990312 20010412" },
01360 { "03-12-99..04-14-01", "VALUE_RANGE 1 19990312 20010414" },
01361 { "(test:a..test:b hello)", "(hello:(pos=1) FILTER VALUE_RANGE 3 test:a test:b)" },
01362 { "12..42kg 5..6kg 1..12", "0 * (VALUE_RANGE 2 \240 \256 AND (VALUE_RANGE 5 \256 \265@ OR VALUE_RANGE 5 \251 \252))" },
01363
01364
01365 { "$12a..13", "VALUE_RANGE 3 $12a 13" },
01366 { "$12..13b", "VALUE_RANGE 3 $12 13b" },
01367 { "$12..12kg", "VALUE_RANGE 3 $12 12kg" },
01368 { "12..b12kg", "VALUE_RANGE 3 12 b12kg" },
01369 { NULL, NULL }
01370 };
01371
01372
01373 static bool test_qp_value_range2()
01374 {
01375 Xapian::QueryParser qp;
01376 qp.add_boolean_prefix("test", "XTEST");
01377 Xapian::DateValueRangeProcessor vrp_date(1);
01378 Xapian::NumberValueRangeProcessor vrp_num(2);
01379 Xapian::StringValueRangeProcessor vrp_str(3);
01380 Xapian::NumberValueRangeProcessor vrp_cash(4, "$");
01381 Xapian::NumberValueRangeProcessor vrp_weight(5, "kg", false);
01382 qp.add_valuerangeprocessor(&vrp_date);
01383 qp.add_valuerangeprocessor(&vrp_num);
01384 qp.add_valuerangeprocessor(&vrp_cash);
01385 qp.add_valuerangeprocessor(&vrp_weight);
01386 qp.add_valuerangeprocessor(&vrp_str);
01387 for (const test *p = test_value_range2_queries; p->query; ++p) {
01388 string expect, parsed;
01389 if (p->expect)
01390 expect = p->expect;
01391 else
01392 expect = "parse error";
01393 try {
01394 Xapian::Query qobj = qp.parse_query(p->query);
01395 parsed = qobj.get_description();
01396 expect = string("Xapian::Query(") + expect + ')';
01397 } catch (const Xapian::QueryParserError &e) {
01398 parsed = e.get_msg();
01399 } catch (const Xapian::Error &e) {
01400 parsed = e.get_description();
01401 } catch (...) {
01402 parsed = "Unknown exception!";
01403 }
01404 tout << "Query: " << p->query << '\n';
01405 TEST_STRINGS_EQUAL(parsed, expect);
01406 }
01407 return true;
01408 }
01409
01410
01411 static bool test_qp_value_range3()
01412 {
01413 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
01414 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
01415 #else
01416 Xapian::WritableDatabase db(Xapian::InMemory::open());
01417 double low = -10;
01418 int steps = 60;
01419 double step = 0.5;
01420
01421 for (int i = 0; i <= steps; ++i) {
01422 double v = low + i * step;
01423 Xapian::Document doc;
01424 doc.add_value(1, Xapian::sortable_serialise(v));
01425 db.add_document(doc);
01426 }
01427
01428 Xapian::NumberValueRangeProcessor vrp_num(1);
01429 Xapian::QueryParser qp;
01430 qp.add_valuerangeprocessor(&vrp_num);
01431
01432 for (int j = 0; j <= steps; ++j) {
01433 double start = low + j * step;
01434 for (int k = 0; k <= steps; ++k) {
01435 double end = low + k * step;
01436 string query = str(start) + ".." + str(end);
01437 tout << "Query: " << query << '\n';
01438 Xapian::Query qobj = qp.parse_query(query);
01439 Xapian::Enquire enq(db);
01440 enq.set_query(qobj);
01441 Xapian::MSet mset = enq.get_mset(0, steps + 1);
01442 if (end < start) {
01443 TEST_EQUAL(mset.size(), 0);
01444 } else {
01445 TEST_EQUAL(mset.size(), 1u + (k - j));
01446 for (unsigned int m = 0; m != mset.size(); ++m) {
01447 double v = start + m * step;
01448 TEST_EQUAL(mset[m].get_document().get_value(1),
01449 Xapian::sortable_serialise(v));
01450 }
01451 }
01452 }
01453 }
01454 return true;
01455 #endif
01456 }
01457
01458 static const double test_value_range_numbers[] = {
01459 #ifdef INFINITY
01460 -INFINITY,
01461 #endif
01462 -HUGE_VAL,
01463 -DBL_MAX,
01464 -pow(2.0, 1022),
01465 -1024.5,
01466 -3.14159265358979323846,
01467 -3,
01468 -2,
01469 -1.8,
01470 -1.1,
01471 -1,
01472 -0.5,
01473 -0.2,
01474 -0.1,
01475 -0.000005,
01476 -0.000002,
01477 -0.000001,
01478 -pow(2.0, -1023),
01479 -pow(2.0, -1024),
01480 -pow(2.0, -1074),
01481 -DBL_MIN,
01482 0,
01483 DBL_MIN,
01484 pow(2.0, -1074),
01485 pow(2.0, -1024),
01486 pow(2.0, -1023),
01487 0.000001,
01488 0.000002,
01489 0.000005,
01490 0.1,
01491 0.2,
01492 0.5,
01493 1,
01494 1.1,
01495 1.8,
01496 2,
01497 3,
01498 3.14159265358979323846,
01499 1024.5,
01500 pow(2.0, 1022),
01501 DBL_MAX,
01502 HUGE_VAL,
01503 #ifdef INFINITY
01504 INFINITY,
01505 #endif
01506
01507 64
01508 };
01509
01510 static const test test_value_range4_queries[] = {
01511 { "id:19254@foo..example.com", "0 * Q19254@foo..example.com" },
01512 { "hello:world", "0 * XHELLOworld" },
01513 { "hello:mum..world", "VALUE_RANGE 1 mum world" },
01514 { NULL, NULL }
01515 };
01516
01523 static bool test_qp_value_range4()
01524 {
01525 Xapian::QueryParser qp;
01526 qp.add_boolean_prefix("id", "Q");
01527 qp.add_boolean_prefix("hello", "XHELLO");
01528 Xapian::StringValueRangeProcessor vrp_str(1, "hello:");
01529 qp.add_valuerangeprocessor(&vrp_str);
01530 for (const test *p = test_value_range4_queries; p->query; ++p) {
01531 string expect, parsed;
01532 if (p->expect)
01533 expect = p->expect;
01534 else
01535 expect = "parse error";
01536 try {
01537 Xapian::Query qobj = qp.parse_query(p->query);
01538 parsed = qobj.get_description();
01539 expect = string("Xapian::Query(") + expect + ')';
01540 } catch (const Xapian::QueryParserError &e) {
01541 parsed = e.get_msg();
01542 } catch (const Xapian::Error &e) {
01543 parsed = e.get_description();
01544 } catch (...) {
01545 parsed = "Unknown exception!";
01546 }
01547 tout << "Query: " << p->query << '\n';
01548 TEST_STRINGS_EQUAL(parsed, expect);
01549 }
01550 return true;
01551 }
01552
01553
01554
01555 static bool test_value_range_serialise1()
01556 {
01557 double prevnum = 0;
01558 string prevstr;
01559 bool started = false;
01560 for (const double *p = test_value_range_numbers; *p != 64; ++p) {
01561 double num = *p;
01562 tout << "Number: " << num << '\n';
01563 string str = Xapian::sortable_serialise(num);
01564 tout << "String: " << str << '\n';
01565 TEST_EQUAL(Xapian::sortable_unserialise(str), num);
01566
01567 if (started) {
01568 int num_cmp = 0;
01569 if (prevnum < num) {
01570 num_cmp = -1;
01571 } else if (prevnum > num) {
01572 num_cmp = 1;
01573 }
01574 int str_cmp = 0;
01575 if (prevstr < str) {
01576 str_cmp = -1;
01577 } else if (prevstr > str) {
01578 str_cmp = 1;
01579 }
01580
01581 TEST_AND_EXPLAIN(num_cmp == str_cmp,
01582 "Numbers " << prevnum << " and " << num <<
01583 " don't sort the same way as their string "
01584 "counterparts");
01585 }
01586
01587 prevnum = num;
01588 prevstr = str;
01589 started = true;
01590 }
01591 return true;
01592 }
01593
01594 static const test test_value_daterange1_queries[] = {
01595 { "12/03/99..12/04/01", "VALUE_RANGE 1 19991203 20011204" },
01596 { "03-12-99..04-14-01", "VALUE_RANGE 1 19990312 20010414" },
01597 { "01/30/60..02/02/59", "VALUE_RANGE 1 19600130 20590202" },
01598 { "1999-03-12..2001-04-14", "VALUE_RANGE 1 19990312 20010414" },
01599 { "12/03/99..02", "Unknown range operation" },
01600 { "1999-03-12..2001", "Unknown range operation" },
01601 { NULL, NULL }
01602 };
01603
01604
01605 static bool test_qp_value_daterange1()
01606 {
01607 Xapian::QueryParser qp;
01608 Xapian::DateValueRangeProcessor vrp_date(1, true, 1960);
01609 qp.add_valuerangeprocessor(&vrp_date);
01610 for (const test *p = test_value_daterange1_queries; p->query; ++p) {
01611 string expect, parsed;
01612 if (p->expect)
01613 expect = p->expect;
01614 else
01615 expect = "parse error";
01616 try {
01617 Xapian::Query qobj = qp.parse_query(p->query);
01618 parsed = qobj.get_description();
01619 expect = string("Xapian::Query(") + expect + ')';
01620 } catch (const Xapian::QueryParserError &e) {
01621 parsed = e.get_msg();
01622 } catch (const Xapian::Error &e) {
01623 parsed = e.get_description();
01624 } catch (...) {
01625 parsed = "Unknown exception!";
01626 }
01627 tout << "Query: " << p->query << '\n';
01628 TEST_STRINGS_EQUAL(parsed, expect);
01629 }
01630 return true;
01631 }
01632
01633 static const test test_value_daterange2_queries[] = {
01634 { "created:12/03/99..12/04/01", "VALUE_RANGE 1 19991203 20011204" },
01635 { "modified:03-12-99..04-14-01", "VALUE_RANGE 2 19990312 20010414" },
01636 { "accessed:01/30/70..02/02/69", "VALUE_RANGE 3 19700130 20690202" },
01637
01638 { "deleted:12/03/99..12/04/01", "VALUE_RANGE 4 19990312 20010412" },
01639 { "1999-03-12..2001-04-14", "Unknown range operation" },
01640 { "12/03/99..created:12/04/01", "Unknown range operation" },
01641 { "12/03/99created:..12/04/01", "Unknown range operation" },
01642 { "12/03/99..12/04/01created:", "Unknown range operation" },
01643 { "12/03/99..02", "Unknown range operation" },
01644 { "1999-03-12..2001", "Unknown range operation" },
01645 { NULL, NULL }
01646 };
01647
01648
01649 static bool test_qp_value_daterange2()
01650 {
01651 Xapian::QueryParser qp;
01652 Xapian::DateValueRangeProcessor vrp_cdate(1, "created:", true, true, 1970);
01653 Xapian::DateValueRangeProcessor vrp_mdate(2, "modified:", true, true, 1970);
01654 Xapian::DateValueRangeProcessor vrp_adate(3, "accessed:", true, true, 1970);
01655
01656
01657
01658 Xapian::DateValueRangeProcessor vrp_ddate(4, "deleted:");
01659 qp.add_valuerangeprocessor(&vrp_cdate);
01660 qp.add_valuerangeprocessor(&vrp_mdate);
01661 qp.add_valuerangeprocessor(&vrp_adate);
01662 qp.add_valuerangeprocessor(&vrp_ddate);
01663 for (const test *p = test_value_daterange2_queries; p->query; ++p) {
01664 string expect, parsed;
01665 if (p->expect)
01666 expect = p->expect;
01667 else
01668 expect = "parse error";
01669 try {
01670 Xapian::Query qobj = qp.parse_query(p->query);
01671 parsed = qobj.get_description();
01672 expect = string("Xapian::Query(") + expect + ')';
01673 } catch (const Xapian::QueryParserError &e) {
01674 parsed = e.get_msg();
01675 } catch (const Xapian::Error &e) {
01676 parsed = e.get_description();
01677 } catch (...) {
01678 parsed = "Unknown exception!";
01679 }
01680 tout << "Query: " << p->query << '\n';
01681 TEST_STRINGS_EQUAL(parsed, expect);
01682 }
01683 return true;
01684 }
01685
01686 static const test test_value_stringrange1_queries[] = {
01687 { "tag:bar..foo", "VALUE_RANGE 1 bar foo" },
01688 { "bar..foo", "VALUE_RANGE 0 bar foo" },
01689 { NULL, NULL }
01690 };
01691
01692
01693 static bool test_qp_value_stringrange1()
01694 {
01695 Xapian::QueryParser qp;
01696 Xapian::StringValueRangeProcessor vrp_default(0);
01697 Xapian::StringValueRangeProcessor vrp_tag(1, "tag:", true);
01698 qp.add_valuerangeprocessor(&vrp_tag);
01699 qp.add_valuerangeprocessor(&vrp_default);
01700 for (const test *p = test_value_stringrange1_queries; p->query; ++p) {
01701 string expect, parsed;
01702 if (p->expect)
01703 expect = p->expect;
01704 else
01705 expect = "parse error";
01706 try {
01707 Xapian::Query qobj = qp.parse_query(p->query);
01708 parsed = qobj.get_description();
01709 expect = string("Xapian::Query(") + expect + ')';
01710 } catch (const Xapian::QueryParserError &e) {
01711 parsed = e.get_msg();
01712 } catch (const Xapian::Error &e) {
01713 parsed = e.get_description();
01714 } catch (...) {
01715 parsed = "Unknown exception!";
01716 }
01717 tout << "Query: " << p->query << '\n';
01718 TEST_STRINGS_EQUAL(parsed, expect);
01719 }
01720 return true;
01721 }
01722
01723 struct AuthorValueRangeProcessor : public Xapian::ValueRangeProcessor {
01724 AuthorValueRangeProcessor() {}
01725
01726 Xapian::valueno operator()(std::string &begin, std::string &end) {
01727 if (!startswith(begin, "author:"))
01728 return Xapian::BAD_VALUENO;
01729 begin.erase(0, 7);
01730 begin = Xapian::Unicode::tolower(begin);
01731 end = Xapian::Unicode::tolower(end);
01732 return 4;
01733 }
01734 };
01735
01736 static const test test_value_customrange1_queries[] = {
01737 { "mars author:Asimov..Bradbury", "(mars:(pos=1) FILTER VALUE_RANGE 4 asimov bradbury)" },
01738 { NULL, NULL }
01739 };
01740
01741
01742 static bool test_qp_value_customrange1()
01743 {
01744 Xapian::QueryParser qp;
01745 AuthorValueRangeProcessor vrp_author;
01746 qp.add_valuerangeprocessor(&vrp_author);
01747 for (const test *p = test_value_customrange1_queries; p->query; ++p) {
01748 string expect, parsed;
01749 if (p->expect)
01750 expect = p->expect;
01751 else
01752 expect = "parse error";
01753 try {
01754 Xapian::Query qobj = qp.parse_query(p->query);
01755 parsed = qobj.get_description();
01756 expect = string("Xapian::Query(") + expect + ')';
01757 } catch (const Xapian::QueryParserError &e) {
01758 parsed = e.get_msg();
01759 } catch (const Xapian::Error &e) {
01760 parsed = e.get_description();
01761 } catch (...) {
01762 parsed = "Unknown exception!";
01763 }
01764 tout << "Query: " << p->query << '\n';
01765 TEST_STRINGS_EQUAL(parsed, expect);
01766 }
01767 return true;
01768 }
01769
01770 static bool test_qp_stoplist1()
01771 {
01772 Xapian::QueryParser qp;
01773 const char * stopwords[] = { "a", "an", "the" };
01774 Xapian::SimpleStopper stop(stopwords, stopwords + 3);
01775 qp.set_stopper(&stop);
01776
01777 Xapian::TermIterator i;
01778
01779 Xapian::Query query1 = qp.parse_query("some mice");
01780 i = qp.stoplist_begin();
01781 TEST(i == qp.stoplist_end());
01782
01783 Xapian::Query query2 = qp.parse_query("the cat");
01784 i = qp.stoplist_begin();
01785 TEST(i != qp.stoplist_end());
01786 TEST_EQUAL(*i, "the");
01787 ++i;
01788 TEST(i == qp.stoplist_end());
01789
01790
01791
01792 Xapian::Query query3 = qp.parse_query("an aardvark");
01793 i = qp.stoplist_begin();
01794 TEST(i != qp.stoplist_end());
01795 TEST_EQUAL(*i, "an");
01796 ++i;
01797 TEST(i == qp.stoplist_end());
01798
01799 return true;
01800 }
01801
01802 static const test test_mispelled_queries[] = {
01803 { "doucment search", "document search" },
01804 { "doucment seeacrh", "document search" },
01805 { "docment seeacrh test", "document search test" },
01806 { "\"paragahp pineapple\"", "\"paragraph pineapple\"" },
01807 { "\"paragahp pineapple\"", "\"paragraph pineapple\"" },
01808 { "test S.E.A.R.C.", "" },
01809 { "this AND that", "" },
01810 { "documento", "document" },
01811 { "documento-documento", "document-document" },
01812 { "documento-searcho", "document-search" },
01813 { "test saerch", "test search" },
01814 { "paragraf search", "paragraph search" },
01815 { NULL, NULL }
01816 };
01817
01818
01819 static bool test_qp_spell1()
01820 {
01821 mkdir(".flint", 0755);
01822 string dbdir = ".flint/qp_spell1";
01823 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01824
01825 Xapian::Document doc;
01826 doc.add_term("document", 6);
01827 doc.add_term("search", 7);
01828 doc.add_term("saerch", 1);
01829 doc.add_term("paragraph", 8);
01830 doc.add_term("paragraf", 2);
01831 db.add_document(doc);
01832
01833 db.add_spelling("document");
01834 db.add_spelling("search");
01835 db.add_spelling("paragraph");
01836 db.add_spelling("band");
01837
01838 Xapian::QueryParser qp;
01839 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01840 qp.set_database(db);
01841
01842 for (const test *p = test_mispelled_queries; p->query; ++p) {
01843 Xapian::Query q;
01844 q = qp.parse_query(p->query,
01845 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01846 Xapian::QueryParser::FLAG_BOOLEAN );
01847 tout << "Query: " << p->query << endl;
01848 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01849 }
01850
01851 return true;
01852 }
01853
01854
01855 static bool test_qp_spell2()
01856 {
01857 mkdir(".flint", 0755);
01858 string dbdir = ".flint/qp_spell2";
01859 Xapian::WritableDatabase db1(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01860
01861 db1.add_spelling("document");
01862 db1.add_spelling("search");
01863 db1.commit();
01864
01865 dbdir = ".flint/qp_spell2b";
01866 Xapian::WritableDatabase db2(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01867
01868 db2.add_spelling("document");
01869 db2.add_spelling("paragraph");
01870 db2.add_spelling("band");
01871
01872 Xapian::Database db;
01873 db.add_database(db1);
01874 db.add_database(db2);
01875
01876 Xapian::QueryParser qp;
01877 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
01878 qp.set_database(db);
01879
01880 for (const test *p = test_mispelled_queries; p->query; ++p) {
01881 Xapian::Query q;
01882 q = qp.parse_query(p->query,
01883 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01884 Xapian::QueryParser::FLAG_BOOLEAN );
01885 tout << "Query: " << p->query << endl;
01886 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01887 }
01888
01889 return true;
01890 }
01891
01892 static const test test_mispelled_wildcard_queries[] = {
01893 { "doucment", "document" },
01894 { "doucment*", "" },
01895 { "doucment* seearch", "doucment* search" },
01896 { "doucment* search", "" },
01897 { NULL, NULL }
01898 };
01899
01900
01901
01902 static bool test_qp_spellwild1()
01903 {
01904 mkdir(".flint", 0755);
01905 string dbdir = ".flint/qp_spellwild1";
01906 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01907
01908 db.add_spelling("document");
01909 db.add_spelling("search");
01910 db.add_spelling("paragraph");
01911 db.add_spelling("band");
01912
01913 Xapian::QueryParser qp;
01914 qp.set_database(db);
01915
01916 const test *p;
01917 for (p = test_mispelled_queries; p->query; ++p) {
01918 Xapian::Query q;
01919 q = qp.parse_query(p->query,
01920 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01921 Xapian::QueryParser::FLAG_BOOLEAN |
01922 Xapian::QueryParser::FLAG_WILDCARD);
01923 tout << "Query: " << p->query << endl;
01924 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01925 }
01926 for (p = test_mispelled_wildcard_queries; p->query; ++p) {
01927 Xapian::Query q;
01928 q = qp.parse_query(p->query,
01929 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01930 Xapian::QueryParser::FLAG_BOOLEAN |
01931 Xapian::QueryParser::FLAG_WILDCARD);
01932 tout << "Query: " << p->query << endl;
01933 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01934 }
01935
01936 return true;
01937 }
01938
01939 static const test test_mispelled_partial_queries[] = {
01940 { "doucment", "" },
01941 { "doucment ", "document " },
01942 { "documen", "" },
01943 { "documen ", "document " },
01944 { "seearch documen", "search documen" },
01945 { "search documen", "" },
01946 { NULL, NULL }
01947 };
01948
01949
01950
01951 static bool test_qp_spellpartial1()
01952 {
01953 mkdir(".flint", 0755);
01954 string dbdir = ".flint/qp_spellpartial1";
01955 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
01956
01957 db.add_spelling("document");
01958 db.add_spelling("search");
01959 db.add_spelling("paragraph");
01960 db.add_spelling("band");
01961
01962 Xapian::QueryParser qp;
01963 qp.set_database(db);
01964
01965 for (const test *p = test_mispelled_partial_queries; p->query; ++p) {
01966 Xapian::Query q;
01967 q = qp.parse_query(p->query,
01968 Xapian::QueryParser::FLAG_SPELLING_CORRECTION |
01969 Xapian::QueryParser::FLAG_PARTIAL);
01970 tout << "Query: " << p->query << endl;
01971 TEST_STRINGS_EQUAL(qp.get_corrected_query_string(), p->expect);
01972 }
01973
01974 return true;
01975 }
01976
01977 static const test test_synonym_queries[] = {
01978 { "searching", "(Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1))" },
01979 { "search", "(Zsearch:(pos=1) SYNONYM find:(pos=1))" },
01980 { "Search", "(search:(pos=1) SYNONYM find:(pos=1))" },
01981 { "Searching", "searching:(pos=1)" },
01982 { "searching OR terms", "((Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1)) OR Zterm:(pos=2))" },
01983 { "search OR terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
01984 { "search +terms", "(Zterm:(pos=2) AND_MAYBE (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
01985 { "search -terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_NOT Zterm:(pos=2))" },
01986 { "+search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_MAYBE Zterm:(pos=2))" },
01987 { "-search terms", "(Zterm:(pos=2) AND_NOT (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
01988 { "search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
01989
01990 { "\"search terms\"", "(search:(pos=1) PHRASE 2 terms:(pos=2))" },
01991
01992
01993 { "regression test", "(Zregress:(pos=1) OR Ztest:(pos=2))" },
01994 { NULL, NULL }
01995 };
01996
01997
01998 static bool test_qp_synonym1()
01999 {
02000 mkdir(".flint", 0755);
02001 string dbdir = ".flint/qp_synonym1";
02002 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02003
02004 db.add_synonym("Zsearch", "Zfind");
02005 db.add_synonym("Zsearch", "Zlocate");
02006 db.add_synonym("search", "find");
02007 db.add_synonym("Zseek", "Zsearch");
02008 db.add_synonym("regression test", "magic");
02009
02010 db.commit();
02011
02012 Xapian::QueryParser qp;
02013 qp.set_stemmer(Xapian::Stem("english"));
02014 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02015 qp.set_database(db);
02016
02017 for (const test *p = test_synonym_queries; p->query; ++p) {
02018 string expect = "Xapian::Query(";
02019 expect += p->expect;
02020 expect += ')';
02021 Xapian::Query q;
02022 q = qp.parse_query(p->query, qp.FLAG_AUTO_SYNONYMS|qp.FLAG_DEFAULT);
02023 tout << "Query: " << p->query << endl;
02024 TEST_STRINGS_EQUAL(q.get_description(), expect);
02025 }
02026
02027 return true;
02028 }
02029
02030 static const test test_multi_synonym_queries[] = {
02031 { "sun OR tan OR cream", "(Zsun:(pos=1) OR Ztan:(pos=2) OR Zcream:(pos=3))" },
02032 { "sun tan", "((Zsun:(pos=1) OR Ztan:(pos=2)) SYNONYM bathe:(pos=1))" },
02033 { "sun tan cream", "((Zsun:(pos=1) OR Ztan:(pos=2) OR Zcream:(pos=3)) SYNONYM lotion:(pos=1))" },
02034 { "beach sun tan holiday", "(Zbeach:(pos=1) OR ((Zsun:(pos=2) OR Ztan:(pos=3)) SYNONYM bathe:(pos=2)) OR Zholiday:(pos=4))" },
02035 { "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)))" },
02036 { "single", "(Zsingl:(pos=1) SYNONYM record:(pos=1))" },
02037 { NULL, NULL }
02038 };
02039
02040
02041 static bool test_qp_synonym2()
02042 {
02043 mkdir(".flint", 0755);
02044 string dbdir = ".flint/qp_synonym2";
02045 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02046
02047 db.add_synonym("sun tan cream", "lotion");
02048 db.add_synonym("sun tan", "bathe");
02049 db.add_synonym("single", "record");
02050
02051 db.commit();
02052
02053 Xapian::QueryParser qp;
02054 qp.set_stemmer(Xapian::Stem("english"));
02055 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02056 qp.set_database(db);
02057
02058 for (const test *p = test_multi_synonym_queries; p->query; ++p) {
02059 string expect = "Xapian::Query(";
02060 expect += p->expect;
02061 expect += ')';
02062 Xapian::Query q;
02063 q = qp.parse_query(p->query,
02064 Xapian::QueryParser::FLAG_AUTO_MULTIWORD_SYNONYMS |
02065 Xapian::QueryParser::FLAG_DEFAULT);
02066 tout << "Query: " << p->query << endl;
02067 TEST_STRINGS_EQUAL(q.get_description(), expect);
02068 }
02069
02070 return true;
02071 }
02072
02073 static const test test_synonym_op_queries[] = {
02074 { "searching", "Zsearch:(pos=1)" },
02075 { "~searching", "(Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1))" },
02076 { "~search", "(Zsearch:(pos=1) SYNONYM find:(pos=1))" },
02077 { "~Search", "(search:(pos=1) SYNONYM find:(pos=1))" },
02078 { "~Searching", "searching:(pos=1)" },
02079 { "~searching OR terms", "((Zsearch:(pos=1) SYNONYM Zfind:(pos=1) SYNONYM Zlocate:(pos=1)) OR Zterm:(pos=2))" },
02080 { "~search OR terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
02081 { "~search +terms", "(Zterm:(pos=2) AND_MAYBE (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
02082 { "~search -terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_NOT Zterm:(pos=2))" },
02083 { "+~search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) AND_MAYBE Zterm:(pos=2))" },
02084 { "-~search terms", "(Zterm:(pos=2) AND_NOT (Zsearch:(pos=1) SYNONYM find:(pos=1)))" },
02085 { "~search terms", "((Zsearch:(pos=1) SYNONYM find:(pos=1)) OR Zterm:(pos=2))" },
02086
02087 { "~\"search terms\"", "(search:(pos=1) PHRASE 2 terms:(pos=2))" },
02088 { NULL, NULL }
02089 };
02090
02091
02092 static bool test_qp_synonym3()
02093 {
02094 mkdir(".flint", 0755);
02095 string dbdir = ".flint/qp_synonym3";
02096 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02097
02098 db.add_synonym("Zsearch", "Zfind");
02099 db.add_synonym("Zsearch", "Zlocate");
02100 db.add_synonym("search", "find");
02101 db.add_synonym("Zseek", "Zsearch");
02102
02103 db.commit();
02104
02105 Xapian::QueryParser qp;
02106 qp.set_stemmer(Xapian::Stem("english"));
02107 qp.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02108 qp.set_database(db);
02109
02110 for (const test *p = test_synonym_op_queries; p->query; ++p) {
02111 string expect = "Xapian::Query(";
02112 expect += p->expect;
02113 expect += ')';
02114 Xapian::Query q;
02115 q = qp.parse_query(p->query,
02116 Xapian::QueryParser::FLAG_SYNONYM |
02117 Xapian::QueryParser::FLAG_BOOLEAN |
02118 Xapian::QueryParser::FLAG_LOVEHATE |
02119 Xapian::QueryParser::FLAG_PHRASE );
02120 tout << "Query: " << p->query << endl;
02121 TEST_STRINGS_EQUAL(q.get_description(), expect);
02122 }
02123
02124 return true;
02125 }
02126
02127 static const test test_stem_all_queries[] = {
02128 { "\"chemical engineers\"", "(chemic:(pos=1) PHRASE 2 engin:(pos=2))" },
02129 { "chemical NEAR engineers", "(chemic:(pos=1) NEAR 11 engin:(pos=2))" },
02130 { "chemical engineers", "(chemic:(pos=1) OR engin:(pos=2))" },
02131 { "title:(chemical engineers)", "(XTchemic:(pos=1) OR XTengin:(pos=2))" },
02132 { NULL, NULL }
02133 };
02134
02135 static bool test_qp_stem_all1()
02136 {
02137 Xapian::QueryParser qp;
02138 qp.set_stemmer(Xapian::Stem("english"));
02139 qp.set_stemming_strategy(qp.STEM_ALL);
02140 qp.add_prefix("title", "XT");
02141 for (const test *p = test_stem_all_queries; p->query; ++p) {
02142 string expect, parsed;
02143 if (p->expect)
02144 expect = p->expect;
02145 else
02146 expect = "parse error";
02147 try {
02148 Xapian::Query qobj = qp.parse_query(p->query);
02149 parsed = qobj.get_description();
02150 expect = string("Xapian::Query(") + expect + ')';
02151 } catch (const Xapian::QueryParserError &e) {
02152 parsed = e.get_msg();
02153 } catch (const Xapian::Error &e) {
02154 parsed = e.get_description();
02155 } catch (...) {
02156 parsed = "Unknown exception!";
02157 }
02158 tout << "Query: " << p->query << '\n';
02159 TEST_STRINGS_EQUAL(parsed, expect);
02160 }
02161 return true;
02162 }
02163
02164 static const test test_stem_all_z_queries[] = {
02165 { "\"chemical engineers\"", "(Zchemic:(pos=1) PHRASE 2 Zengin:(pos=2))" },
02166 { "chemical NEAR engineers", "(Zchemic:(pos=1) NEAR 11 Zengin:(pos=2))" },
02167 { "chemical engineers", "(Zchemic:(pos=1) OR Zengin:(pos=2))" },
02168 { "title:(chemical engineers)", "(ZXTchemic:(pos=1) OR ZXTengin:(pos=2))" },
02169 { NULL, NULL }
02170 };
02171
02172 static bool test_qp_stem_all_z1()
02173 {
02174 Xapian::QueryParser qp;
02175 qp.set_stemmer(Xapian::Stem("english"));
02176 qp.set_stemming_strategy(qp.STEM_ALL_Z);
02177 qp.add_prefix("title", "XT");
02178 for (const test *p = test_stem_all_z_queries; p->query; ++p) {
02179 string expect, parsed;
02180 if (p->expect)
02181 expect = p->expect;
02182 else
02183 expect = "parse error";
02184 try {
02185 Xapian::Query qobj = qp.parse_query(p->query);
02186 parsed = qobj.get_description();
02187 expect = string("Xapian::Query(") + expect + ')';
02188 } catch (const Xapian::QueryParserError &e) {
02189 parsed = e.get_msg();
02190 } catch (const Xapian::Error &e) {
02191 parsed = e.get_description();
02192 } catch (...) {
02193 parsed = "Unknown exception!";
02194 }
02195 tout << "Query: " << p->query << '\n';
02196 TEST_STRINGS_EQUAL(parsed, expect);
02197 }
02198 return true;
02199 }
02200
02201 static double
02202 time_query_parse(const Xapian::Database & db, const string & q,
02203 int repetitions, unsigned flags)
02204 {
02205 Xapian::QueryParser qp;
02206 qp.set_database(db);
02207 CPUTimer timer;
02208 std::vector<Xapian::Query> qs;
02209 qs.reserve(repetitions);
02210 for (int i = 0; i != repetitions; ++i) {
02211 qs.push_back(qp.parse_query(q, flags));
02212 }
02213 if (repetitions > 1) {
02214 Xapian::Query qc(Xapian::Query::OP_OR, qs.begin(), qs.end());
02215 }
02216 return timer.get_time();
02217 }
02218
02219 static void
02220 qp_scale1_helper(const Xapian::Database &db, const string & q, unsigned n,
02221 unsigned flags)
02222 {
02223 double time1;
02224 while (true) {
02225 time1 = time_query_parse(db, q, n, flags);
02226 if (time1 != 0.0) break;
02227
02228
02229
02230 unsigned n_new = n * 10;
02231 if (n_new < n)
02232 SKIP_TEST("Can't count enough repetitions to be able to time test");
02233 n = n_new;
02234 }
02235
02236 string q_n;
02237 q_n.reserve(q.size() * n);
02238 for (unsigned i = n; i != 0; --i) {
02239 q_n += q;
02240 }
02241
02242 double time2 = time_query_parse(db, q_n, 1, flags);
02243 tout << "small=" << time1 << "s, large=" << time2 << "s\n";
02244
02245
02246
02247 TEST_REL(time2,<,time1 * 2.15);
02248 }
02249
02250
02251
02252 static bool test_qp_scale1()
02253 {
02254 mkdir(".flint", 0755);
02255 string dbdir = ".flint/qp_scale1";
02256 Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OVERWRITE);
02257
02258 db.add_synonym("foo", "bar");
02259 db.commit();
02260
02261 string q1("foo ");
02262 string q1b("baz ");
02263 const unsigned repetitions = 5000;
02264
02265
02266 string syn;
02267 for (int j = 60; j != 0; --j) {
02268 syn += q1;
02269 }
02270 syn.resize(syn.size() - 1);
02271
02272 unsigned synflags = Xapian::QueryParser::FLAG_DEFAULT |
02273 Xapian::QueryParser::FLAG_SYNONYM |
02274 Xapian::QueryParser::FLAG_AUTO_MULTIWORD_SYNONYMS;
02275
02276
02277 qp_scale1_helper(db, q1, repetitions, Xapian::QueryParser::FLAG_DEFAULT);
02278
02279
02280
02281 qp_scale1_helper(db, q1b, repetitions, synflags);
02282
02283
02284 qp_scale1_helper(db, q1, repetitions, synflags);
02285
02286
02287 db.add_synonym(syn, "bar");
02288 db.commit();
02289
02290 qp_scale1_helper(db, q1, repetitions, synflags);
02291
02292 return true;
02293 }
02294
02295 static const test test_near_queries[] = {
02296 { "simple-example", "(simple:(pos=1) PHRASE 2 example:(pos=2))" },
02297 { "stock -cooking", "(Zstock:(pos=1) AND_NOT Zcook:(pos=2))" },
02298
02299
02300
02301 { "foo bar", "(foo:(pos=1) NEAR 11 bar:(pos=2))" },
02302 { "foo bar baz", "(foo:(pos=1) NEAR 12 bar:(pos=2) NEAR 12 baz:(pos=3))" },
02303 { "gtk+ -gnome", "(Zgtk+:(pos=1) AND_NOT Zgnome:(pos=2))" },
02304 { "c++ -d--", "(Zc++:(pos=1) AND_NOT Zd:(pos=2))" },
02305 { "\"c++ library\"", "(c++:(pos=1) PHRASE 2 library:(pos=2))" },
02306 { "author:orwell animal farm", "(Aorwell:(pos=1) NEAR 12 animal:(pos=2) NEAR 12 farm:(pos=3))" },
02307 { "author:Orwell Animal Farm", "(Aorwell:(pos=1) NEAR 12 animal:(pos=2) NEAR 12 farm:(pos=3))" },
02308 { "beer NOT \"orange juice\"", "(Zbeer:(pos=1) AND_NOT (orange:(pos=2) PHRASE 2 juice:(pos=3)))" },
02309 { "beer AND NOT lager", "(Zbeer:(pos=1) AND_NOT Zlager:(pos=2))" },
02310 { "A OR B NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02311 { "A OR B AND NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02312 { "A OR B XOR C", "(a:(pos=1) OR (b:(pos=2) XOR c:(pos=3)))" },
02313 { "A XOR B NOT C", "(a:(pos=1) XOR (b:(pos=2) AND_NOT c:(pos=3)))" },
02314 { "one AND two", "(Zone:(pos=1) AND Ztwo:(pos=2))" },
02315 { "NOT windows", "Syntax: <expression> NOT <expression>" },
02316 { "a AND (NOT b)", "Syntax: <expression> NOT <expression>" },
02317 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
02318 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
02319 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
02320 { "foo OR (something AND)", "Syntax: <expression> AND <expression>" },
02321 { "OR foo", "Syntax: <expression> OR <expression>" },
02322 { "XOR", "Syntax: <expression> XOR <expression>" },
02323 { "hard\xa0space", "(hard:(pos=1) NEAR 11 space:(pos=2))" },
02324 { NULL, NULL }
02325 };
02326
02327 static bool test_qp_near1()
02328 {
02329 Xapian::QueryParser queryparser;
02330 queryparser.set_stemmer(Xapian::Stem("english"));
02331 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02332 queryparser.add_prefix("author", "A");
02333 queryparser.add_prefix("writer", "A");
02334 queryparser.add_prefix("title", "XT");
02335 queryparser.add_prefix("subject", "XT");
02336 queryparser.add_prefix("authortitle", "A");
02337 queryparser.add_prefix("authortitle", "XT");
02338 queryparser.add_boolean_prefix("site", "H");
02339 queryparser.add_boolean_prefix("site2", "J");
02340 queryparser.add_boolean_prefix("multisite", "H");
02341 queryparser.add_boolean_prefix("multisite", "J");
02342 queryparser.add_boolean_prefix("category", "XCAT", false);
02343 queryparser.set_default_op(Xapian::Query::OP_NEAR);
02344 for (const test *p = test_near_queries; p->query; ++p) {
02345 string expect, parsed;
02346 if (p->expect)
02347 expect = p->expect;
02348 else
02349 expect = "parse error";
02350 try {
02351 Xapian::Query qobj = queryparser.parse_query(p->query);
02352 parsed = qobj.get_description();
02353 expect = string("Xapian::Query(") + expect + ')';
02354 } catch (const Xapian::QueryParserError &e) {
02355 parsed = e.get_msg();
02356 } catch (const Xapian::Error &e) {
02357 parsed = e.get_description();
02358 } catch (...) {
02359 parsed = "Unknown exception!";
02360 }
02361 tout << "Query: " << p->query << '\n';
02362 TEST_STRINGS_EQUAL(parsed, expect);
02363 }
02364 return true;
02365 }
02366
02367 static const test test_phrase_queries[] = {
02368 { "simple-example", "(simple:(pos=1) PHRASE 2 example:(pos=2))" },
02369 { "stock -cooking", "(Zstock:(pos=1) AND_NOT Zcook:(pos=2))" },
02370
02371
02372
02373 { "foo bar", "(foo:(pos=1) PHRASE 11 bar:(pos=2))" },
02374 { "foo bar baz", "(foo:(pos=1) PHRASE 12 bar:(pos=2) PHRASE 12 baz:(pos=3))" },
02375 { "gtk+ -gnome", "(Zgtk+:(pos=1) AND_NOT Zgnome:(pos=2))" },
02376 { "c++ -d--", "(Zc++:(pos=1) AND_NOT Zd:(pos=2))" },
02377 { "\"c++ library\"", "(c++:(pos=1) PHRASE 2 library:(pos=2))" },
02378 { "author:orwell animal farm", "(Aorwell:(pos=1) PHRASE 12 animal:(pos=2) PHRASE 12 farm:(pos=3))" },
02379 { "author:Orwell Animal Farm", "(Aorwell:(pos=1) PHRASE 12 animal:(pos=2) PHRASE 12 farm:(pos=3))" },
02380 { "beer NOT \"orange juice\"", "(Zbeer:(pos=1) AND_NOT (orange:(pos=2) PHRASE 2 juice:(pos=3)))" },
02381 { "beer AND NOT lager", "(Zbeer:(pos=1) AND_NOT Zlager:(pos=2))" },
02382 { "A OR B NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02383 { "A OR B AND NOT C", "(a:(pos=1) OR (b:(pos=2) AND_NOT c:(pos=3)))" },
02384 { "A OR B XOR C", "(a:(pos=1) OR (b:(pos=2) XOR c:(pos=3)))" },
02385 { "A XOR B NOT C", "(a:(pos=1) XOR (b:(pos=2) AND_NOT c:(pos=3)))" },
02386 { "one AND two", "(Zone:(pos=1) AND Ztwo:(pos=2))" },
02387 { "NOT windows", "Syntax: <expression> NOT <expression>" },
02388 { "a AND (NOT b)", "Syntax: <expression> NOT <expression>" },
02389 { "AND NOT windows", "Syntax: <expression> AND NOT <expression>" },
02390 { "gordian NOT", "Syntax: <expression> NOT <expression>" },
02391 { "gordian AND NOT", "Syntax: <expression> AND NOT <expression>" },
02392 { "foo OR (something AND)", "Syntax: <expression> AND <expression>" },
02393 { "OR foo", "Syntax: <expression> OR <expression>" },
02394 { "XOR", "Syntax: <expression> XOR <expression>" },
02395 { "hard\xa0space", "(hard:(pos=1) PHRASE 11 space:(pos=2))" },
02396
02397
02398 { "(one AND two) three", "((Zone:(pos=1) PHRASE 11 Zthree:(pos=3)) AND (Ztwo:(pos=2) PHRASE 11 Zthree:(pos=3)))" },
02399 { NULL, NULL }
02400 };
02401
02402 static bool test_qp_phrase1()
02403 {
02404 Xapian::QueryParser queryparser;
02405 queryparser.set_stemmer(Xapian::Stem("english"));
02406 queryparser.set_stemming_strategy(Xapian::QueryParser::STEM_SOME);
02407 queryparser.add_prefix("author", "A");
02408 queryparser.add_prefix("writer", "A");
02409 queryparser.add_prefix("title", "XT");
02410 queryparser.add_prefix("subject", "XT");
02411 queryparser.add_prefix("authortitle", "A");
02412 queryparser.add_prefix("authortitle", "XT");
02413 queryparser.add_boolean_prefix("site", "H");
02414 queryparser.add_boolean_prefix("site2", "J");
02415 queryparser.add_boolean_prefix("multisite", "H");
02416 queryparser.add_boolean_prefix("multisite", "J");
02417 queryparser.add_boolean_prefix("category", "XCAT", false);
02418 queryparser.set_default_op(Xapian::Query::OP_PHRASE);
02419 for (const test *p = test_phrase_queries; p->query; ++p) {
02420 string expect, parsed;
02421 if (p->expect)
02422 expect = p->expect;
02423 else
02424 expect = "parse error";
02425 try {
02426 Xapian::Query qobj = queryparser.parse_query(p->query);
02427 parsed = qobj.get_description();
02428 expect = string("Xapian::Query(") + expect + ')';
02429 } catch (const Xapian::QueryParserError &e) {
02430 parsed = e.get_msg();
02431 } catch (const Xapian::Error &e) {
02432 parsed = e.get_description();
02433 } catch (...) {
02434 parsed = "Unknown exception!";
02435 }
02436 tout << "Query: " << p->query << '\n';
02437 TEST_STRINGS_EQUAL(parsed, expect);
02438 }
02439 return true;
02440 }
02441
02442 static const test test_stopword_group_or_queries[] = {
02443 { "this is a test", "test:(pos=4)" },
02444 { "test*", "(test:(pos=1) SYNONYM testable:(pos=1) SYNONYM tester:(pos=1))" },
02445 { "a test*", "(test:(pos=2) SYNONYM testable:(pos=2) SYNONYM tester:(pos=2))" },
02446 { "is a test*", "(test:(pos=3) SYNONYM testable:(pos=3) SYNONYM tester:(pos=3))" },
02447 { "this is a test*", "(test:(pos=4) SYNONYM testable:(pos=4) SYNONYM tester:(pos=4))" },
02448 { "this is a us* test*", "(user:(pos=4) OR (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02449 { "this is a user test*", "(user:(pos=4) OR (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02450 { NULL, NULL }
02451 };
02452
02453 static const test test_stopword_group_and_queries[] = {
02454 { "this is a test", "test:(pos=4)" },
02455 { "test*", "(test:(pos=1) SYNONYM testable:(pos=1) SYNONYM tester:(pos=1))" },
02456 { "a test*", "(test:(pos=2) SYNONYM testable:(pos=2) SYNONYM tester:(pos=2))" },
02457
02458 { "is a test*", "(test:(pos=3) SYNONYM testable:(pos=3) SYNONYM tester:(pos=3))" },
02459
02460 { "this is a test*", "(test:(pos=4) SYNONYM testable:(pos=4) SYNONYM tester:(pos=4))" },
02461
02462 { "this is a us* test*", "(user:(pos=4) AND (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02463 { "this is a user test*", "(user:(pos=4) AND (test:(pos=5) SYNONYM testable:(pos=5) SYNONYM tester:(pos=5)))" },
02464 { NULL, NULL }
02465 };
02466
02467
02468 static bool test_qp_stopword_group1()
02469 {
02470 #ifndef XAPIAN_HAS_INMEMORY_BACKEND
02471 SKIP_TEST("Testcase requires the InMemory backend which is disabled");
02472 #else
02473 Xapian::WritableDatabase db(Xapian::InMemory::open());
02474 Xapian::Document doc;
02475 doc.add_term("test");
02476 doc.add_term("tester");
02477 doc.add_term("testable");
02478 doc.add_term("user");
02479 db.add_document(doc);
02480
02481 Xapian::SimpleStopper stopper;
02482 stopper.add("this");
02483 stopper.add("is");
02484 stopper.add("a");
02485
02486 Xapian::QueryParser qp;
02487 qp.set_stopper(&stopper);
02488 qp.set_database(db);
02489
02490
02491 qp.set_default_op(Xapian::Query::OP_OR);
02492 const test *p = test_stopword_group_or_queries;
02493 for (int i = 1; i <= 2; ++i) {
02494 for ( ; p->query; ++p) {
02495 string expect, parsed;
02496 if (p->expect)
02497 expect = p->expect;
02498 else
02499 expect = "parse error";
02500 try {
02501 Xapian::Query qobj = qp.parse_query(p->query, qp.FLAG_WILDCARD);
02502 parsed = qobj.get_description();
02503 expect = string("Xapian::Query(") + expect + ')';
02504 } catch (const Xapian::QueryParserError &e) {
02505 parsed = e.get_msg();
02506 } catch (const Xapian::Error &e) {
02507 parsed = e.get_description();
02508 } catch (...) {
02509 parsed = "Unknown exception!";
02510 }
02511 tout << "Query: " << p->query << '\n';
02512 TEST_STRINGS_EQUAL(parsed, expect);
02513 }
02514
02515 qp.set_default_op(Xapian::Query::OP_AND);
02516 p = test_stopword_group_and_queries;
02517 }
02518
02519 return true;
02520 #endif
02521 }
02522
02524
02525 static bool test_qp_default_op2()
02526 {
02527 Xapian::QueryParser qp;
02528 static const Xapian::Query::op ops[] = {
02529 Xapian::Query::OP_AND_NOT,
02530 Xapian::Query::OP_AND_MAYBE,
02531 Xapian::Query::OP_FILTER,
02532 Xapian::Query::OP_VALUE_RANGE,
02533 Xapian::Query::OP_SCALE_WEIGHT,
02534 Xapian::Query::OP_VALUE_GE,
02535 Xapian::Query::OP_VALUE_LE
02536 };
02537 const Xapian::Query::op * p;
02538 for (p = ops; p - ops != sizeof(ops) / sizeof(*ops); ++p) {
02539 tout << *p << endl;
02540 qp.set_default_op(*p);
02541
02542
02543 TEST_EXCEPTION(Xapian::InvalidArgumentError,
02544 qp.parse_query("a-b NEAR c NEAR d"));
02545 }
02546 return true;
02547 }
02548
02550 static const test_desc tests[] = {
02551 TESTCASE(queryparser1),
02552 TESTCASE(qp_default_op1),
02553 TESTCASE(qp_odd_chars1),
02554 TESTCASE(qp_flag_wildcard1),
02555 TESTCASE(qp_flag_wildcard2),
02556 TESTCASE(qp_flag_wildcard3),
02557 TESTCASE(qp_flag_partial1),
02558 TESTCASE(qp_flag_bool_any_case1),
02559 TESTCASE(qp_stopper1),
02560 TESTCASE(qp_flag_pure_not1),
02561 TESTCASE(qp_unstem_boolean_prefix),
02562 TESTCASE(qp_default_prefix1),
02563 TESTCASE(qp_default_prefix2),
02564 TESTCASE(value_range_serialise1),
02565 TESTCASE(qp_value_range1),
02566 TESTCASE(qp_value_range2),
02567 TESTCASE(qp_value_range3),
02568 TESTCASE(qp_value_range4),
02569 TESTCASE(qp_value_daterange1),
02570 TESTCASE(qp_value_daterange2),
02571 TESTCASE(qp_value_stringrange1),
02572 TESTCASE(qp_value_customrange1),
02573 TESTCASE(qp_stoplist1),
02574 TESTCASE(qp_spell1),
02575 TESTCASE(qp_spell2),
02576 TESTCASE(qp_spellwild1),
02577 TESTCASE(qp_spellpartial1),
02578 TESTCASE(qp_synonym1),
02579 TESTCASE(qp_synonym2),
02580 TESTCASE(qp_synonym3),
02581 TESTCASE(qp_stem_all1),
02582 TESTCASE(qp_stem_all_z1),
02583 TESTCASE(qp_scale1),
02584 TESTCASE(qp_near1),
02585 TESTCASE(qp_phrase1),
02586 TESTCASE(qp_stopword_group1),
02587 TESTCASE(qp_default_op2),
02588 END_OF_TESTCASES
02589 };
02590
02591 int main(int argc, char **argv)
02592 try {
02593
02594 #ifdef __WIN32__
02595 _putenv_s("XAPIAN_CJK_NGRAM", "1");
02596 #elif defined HAVE_SETENV
02597 setenv("XAPIAN_CJK_NGRAM", "1", 1);
02598 #else
02599 putenv(const_cast<char*>("XAPIAN_CJK_NGRAM=1"));
02600 #endif
02601 test_driver::parse_command_line(argc, argv);
02602 return test_driver::run(tests);
02603 } catch (const char * e) {
02604 cout << e << endl;
02605 return 1;
02606 }