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