1#!/usr/bin/env perl 2use strict; 3use Test::More tests => 33; 4 5use_ok('Search::QueryParser::SQL'); 6 7ok( my $parser = Search::QueryParser::SQL->new( 8 columns => [qw( foo color name )], 9 default_column => 'name' 10 ), 11 "new parser" 12); 13 14ok( my $query1 = $parser->parse('foo=bar'), "query1" ); 15 16cmp_ok( $query1, 'eq', "foo='bar'", "query1 string" ); 17 18ok( my $query2 = $parser->parse('foo:bar'), "query2" ); 19 20cmp_ok( $query2, 'eq', "foo='bar'", "query2 string" ); 21 22ok( my $query3 = $parser->parse( 'foo bar', 1 ), "query3" ); 23 24cmp_ok( $query3, 'eq', "name='foo' AND name='bar'", "query3 string" ); 25 26ok( my $query4 = $parser->parse('-color:red (name:john OR foo:bar)'), 27 "query4" ); 28 29cmp_ok( 30 $query4, 'eq', 31 "(name='john' OR foo='bar') AND color!='red'", 32 "query4 string" 33); 34 35ok( my $parser2 = Search::QueryParser::SQL->new( 36 columns => [qw( first_name last_name email )], 37 ), 38 "parser2" 39); 40 41ok( my $query5 = $parser2->parse("joe smith"), "query5" ); 42 43cmp_ok( 44 $query5, 45 'eq', 46 "(email='joe' OR first_name='joe' OR last_name='joe') OR (email='smith' OR first_name='smith' OR last_name='smith')", 47 "query5 string" 48); 49 50ok( my $query6 = $parser2->parse('"joe smith"'), "query6" ); 51 52cmp_ok( 53 $query6, 54 'eq', 55 "(email='joe smith' OR first_name='joe smith' OR last_name='joe smith')", 56 "query6 string" 57); 58 59ok( my $parser3 = Search::QueryParser::SQL->new( 60 columns => [qw( foo bar )], 61 quote_columns => '`', 62 ), 63 "parser3" 64); 65 66ok( my $query7 = $parser3->parse('green'), "query7" ); 67 68cmp_ok( $query7, 'eq', "(`bar`='green' OR `foo`='green')", "query7 string" ); 69 70ok( my $parser4 = Search::QueryParser::SQL->new( 71 columns => [qw( foo )], 72 strict => 1, 73 ), 74 "strict parser4" 75); 76 77eval { $parser4->parse('bar=123') }; 78 79ok( $@ && $@ =~ m/^invalid column name: bar/, "croak on invalid query" ); 80 81ok( my $parser5 = Search::QueryParser::SQL->new( 82 columns => { foo => 'char', bar => 'int' }, 83 like => 'like', 84 fuzzify => 1, 85 strict => 1 86 ), 87 "parser5" 88); 89 90ok( my $query8 = $parser5->parse('foo:bar'), "query8" ); 91 92cmp_ok( $query8, 'eq', "foo like 'bar%'", "query8 string" ); 93 94ok( $query8 = $parser5->parse('bar=1*'), "query8 fuzzy int with wildcard" ); 95 96cmp_ok( $query8, 'eq', "bar>=1", "query8 fuzzy int with wildcard string" ); 97 98ok( $query8 = $parser5->parse('bar=1'), "query8 fuzzy int no wildcard" ); 99 100cmp_ok( $query8, 'eq', "bar>=1", "query8 fuzzy int no wildcard string" ); 101 102ok( my $parser6 = Search::QueryParser::SQL->new( 103 columns => [qw( foo )], 104 like => 'like', 105 fuzzify2 => 1, 106 strict => 1 107 ), 108 "parser6" 109); 110 111ok( my $query9 = $parser6->parse('foo:bar'), "query9" ); 112 113cmp_ok( $query9, 'eq', "foo like '%bar%'", "query9 string" ); 114 115# test lower feature 116ok( my $parser7 = Search::QueryParser::SQL->new( 117 columns => [qw( foo )], 118 lower => 1, 119 like => 'like', 120 fuzzify2 => 1, 121 strict => 1 122 ), 123 "parser7" 124); 125 126ok( my $query10 = $parser7->parse('foo:bar'), "query10" ); 127 128cmp_ok( $query10, 'eq', "lower(foo) like lower('%bar%')", "query10 string" ); 129 130