1use strict;
2
3package main;
4
5use Test;
6use DBI;
7use Carp;
8
9use Text::Query;
10
11require "t/$::db_type.pl";
12
13my($db);
14
15sub builddb {
16    my($schema) = t1_schema();
17
18    if(!$schema) {
19	print STDERR "DBI_DSN not set for $::db_type ";
20	plan test => 0;
21	exit(0);
22    }
23    $db = DBI->connect(undef, undef, undef, dbi_args());
24    if(!$db) {
25	print STDERR "cannot connect $DBI::errstr (check DBI_DSN, DBI_USER and DBI_PASS) ";
26	plan test => 0;
27	exit(0);
28    }
29
30    if(!$db->do($schema)) {
31	print STDERR "cannot execute $schema $DBI::errstr (check DBI_DSN, DBI_USER and DBI_PASS) ";
32	plan test => 0;
33	exit(0);
34    }
35    my($i);
36    for($i = 0; $i < 200; $i++) {
37	my($sql) = "insert into t1 values ('$i', '" . ($i - 1) . " " . $i . " " . ($i + 1) . "')";
38	$db->do($sql) or croak("cannot execute $sql : $DBI::errstr");
39    }
40
41    my($postamble) = t1_postamble();
42    if($postamble) {
43	$db->do($postamble) or croak("cannot execute $postamble : $DBI::errstr");
44    }
45}
46
47sub destroydb {
48    my($sql) = t1_drop();
49
50    $db->do($sql) or croak("cannot execute $sql : $DBI::errstr");
51}
52
53builddb();
54
55plan test => 14;
56
57#
58# Simple search
59#
60{
61    my(@rows);
62    my($question);
63    my($builder) = builder();
64    my($rel) = relevance_info();
65    my($query) = Text::Query->new('blurk',
66				  -parse => 'Text::Query::ParseSimple',
67				  -build => $builder,
68				  -solve => 'Text::Query::SolveSQL',
69				  -fields_searched => 'field2',
70				  -select => "select $rel->{'select'}field1 from t1 where __WHERE__ order by $rel->{'order'}field1 asc",
71				  );
72
73    $question = "20";
74    $query->prepare($question);
75    @rows = $query->match($db);
76    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')},$rows[2]->{upperlower('field1')}\n";
77    ok(@rows == 3 &&
78       $rows[0]->{upperlower('field1')} eq '19' &&
79       $rows[1]->{upperlower('field1')} eq '20' &&
80       $rows[2]->{upperlower('field1')} eq '21'
81       , 1, $query->matchstring());
82
83    $question = "20 -21";
84    $query->prepare($question);
85    @rows = $query->match($db);
86    print scalar(@rows) . " => $rows[0]->{upperlower('field1')}\n";
87    ok(@rows == 1 &&
88       $rows[0]->{upperlower('field1')} eq '19', 1, $query->matchstring());
89
90    $question = "20 +21";
91    $query->prepare($question);
92    @rows = $query->match($db);
93    if($rel->{'field'}) {
94	print scalar(@rows) . "values => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')},$rows[2]->{upperlower('field1')}\n";
95	print scalar(@rows) . "relevance => $rows[0]->{upperlower($rel->{'field'})},$rows[1]->{upperlower($rel->{'field'})},$rows[2]->{upperlower($rel->{'field'})}\n";
96	ok(@rows == 3 &&
97	   $rows[0]->{upperlower('field1')} eq '20' &&
98	   $rows[1]->{upperlower('field1')} eq '21' &&
99	   $rows[2]->{upperlower('field1')} eq '22'
100	   , 1, $query->matchstring());
101    } else {
102	print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')}\n";
103	ok(@rows == 2 &&
104	   $rows[0]->{upperlower('field1')} eq '20', 1, $query->matchstring());
105    }
106}
107
108#
109# Advanced search
110#
111{
112    my(@rows);
113    my($question);
114    my($builder) = builder();
115    my($query) = Text::Query->new('blurk',
116				  -parse => 'Text::Query::ParseAdvanced',
117				  -build => $builder,
118				  -solve => 'Text::Query::SolveSQL',
119				  -fields_searched => 'field2',
120				  -select => 'select field1 from t1 where __WHERE__ order by field1 asc',
121				  );
122
123    $question = "20";
124    $query->prepare($question);
125    @rows = $query->match($db);
126    print scalar(@rows) . " => $rows[0]->{upperlower('field1')}\n";
127    ok(@rows == 3 &&
128       $rows[0]->{upperlower('field1')} eq '19', 1, $query->matchstring());
129
130    $question = "21 and 20";
131    $query->prepare($question);
132    @rows = $query->match($db);
133    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')}\n";
134    ok(@rows == 2 &&
135       $rows[0]->{upperlower('field1')} eq '20' &&
136       $rows[1]->{upperlower('field1')} eq '21'
137       , 1, $query->matchstring());
138
139    $question = "21 or 20";
140    $query->prepare($question);
141    @rows = $query->match($db);
142    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')}...\n";
143    ok(@rows == 4 &&
144       $rows[0]->{upperlower('field1')} eq '19' &&
145       $rows[1]->{upperlower('field1')} eq '20' &&
146       $rows[2]->{upperlower('field1')} eq '21' &&
147       $rows[3]->{upperlower('field1')} eq '22'
148       , 1, $query->matchstring());
149
150    $question = "21 or 30 and 32";
151    $query->prepare($question);
152    @rows = $query->match($db);
153    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')},$rows[2]->{upperlower('field1')},$rows[3]->{upperlower('field1')}\n";
154    ok(@rows == 4 &&
155       $rows[0]->{upperlower('field1')} eq '20' &&
156       $rows[1]->{upperlower('field1')} eq '21' &&
157       $rows[2]->{upperlower('field1')} eq '22' &&
158       $rows[3]->{upperlower('field1')} eq '31'
159       , 1, $query->matchstring());
160
161    $question = "(21 or 30) and 19";
162    $query->prepare($question);
163    @rows = $query->match($db);
164    print scalar(@rows) . " => $rows[0]->{upperlower('field1')}\n";
165    ok(@rows == 1 &&
166       $rows[0]->{upperlower('field1')} eq '20'
167       , 1, $query->matchstring());
168
169
170    $question = "20 21";
171    $query->prepare($question);
172    @rows = $query->match($db);
173    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')}\n";
174    ok(@rows == 2 &&
175       $rows[0]->{upperlower('field1')} eq '20' &&
176       $rows[1]->{upperlower('field1')} eq '21'
177       , 1, $query->matchstring());
178
179    $question = "(20) (21)";
180    $query->prepare($question);
181    @rows = $query->match($db);
182    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')}\n";
183    ok(@rows == 2 &&
184       $rows[0]->{upperlower('field1')} eq '20' &&
185       $rows[1]->{upperlower('field1')} eq '21'
186       , 1, $query->matchstring());
187
188    $question = "20 and not 21";
189    $query->prepare($question);
190    @rows = $query->match($db);
191    print scalar(@rows) . " => $rows[0]->{upperlower('field1')}\n";
192    ok(@rows == 1 &&
193       $rows[0]->{upperlower('field1')} eq '19'
194       , 1, $query->matchstring());
195
196    $question = "20 near 21";
197    $query->prepare($question);
198    @rows = $query->match($db);
199    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')}\n";
200    ok(@rows == 2 &&
201       $rows[0]->{upperlower('field1')} eq '20' &&
202       $rows[1]->{upperlower('field1')} eq '21'
203       , 1, $query->matchstring());
204
205    $question = 'field2: ( 20 and 21 ) or field1: 100 or "field2:"';
206    $query->prepare($question);
207    @rows = $query->match($db);
208    print scalar(@rows) . " => $rows[0]->{upperlower('field1')},$rows[1]->{upperlower('field1')},$rows[2]->{upperlower('field1')}\n";
209    ok(@rows == 3 &&
210       $rows[0]->{upperlower('field1')} eq '100' &&
211       $rows[1]->{upperlower('field1')} eq '20' &&
212       $rows[2]->{upperlower('field1')} eq '21'
213       , 1, $query->matchstring());
214
215    $question = "21 or 30 and 32";
216    $query->prepare($question);
217    @rows = $query->match($db);
218
219    $question = 'field2: ( 20 and 21 or field1: 21 ) or field1: 100 or "field2:" and 30 near 40';
220    $query->prepare($question);
221    @rows = $query->match($db);
222    print scalar(@rows) . "\n";
223    ok(@rows > 1, 1, $query->matchstring());
224}
225
226destroydb();
227
228# Local Variables: ***
229# mode: perl ***
230# End: ***
231