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