]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/support-scripts/test-scripts/query_parser.pl
LP#1744385: Search and Result Display improvements
[working/Evergreen.git] / Open-ILS / src / support-scripts / test-scripts / query_parser.pl
1 #!/usr/bin/perl
2 require '../oils_header.pl';
3 use warnings;
4 use strict;
5 use OpenILS::Application::Storage::Driver::Pg::QueryParser;
6 use JSON::XS;
7 use Getopt::Long;
8 use Data::Dumper;
9 $Data::Dumper::Indent = 1;
10 use Time::HiRes qw/time/;
11 use OpenILS::Utils::CStoreEditor;
12
13 OpenILS::Application::Storage::Driver::Pg::QueryParser->TEST_SETUP;
14
15 my $query = '#available title: foo bar* || (-baz || (subject:"1900'.
16                         '-1910 junk" "and another thing" se:stuff #available '.
17                         'statuses(0,7,12))) && && && au:malarky || au|'.
18                         'corporate|personal:gonzo && dc.identifier:+123456789X'.
19                         ' dc.contributor=rowling #metarecord estimation_'.
20                         'strategy(exclusion) item_type(a, t) item_form(d) '.
21                         'bib.subjectTitle=potter bib.subjectName=harry '.
22                         'keyword|mapscale:1:250000';
23
24 #$query = 'concerto #available filter_group_entry(1,2,3) filter_group_entry(4,5)';
25 #$query = 'concerto || filter_group_entry(4) || filter_group_entry(3)';
26 #$query = 'concerto (audience(a) || (item_type(a) && item_form(b)))';
27 #$query = 'concerto || (piano && (item_type(a) || audience(a)))';
28
29 #$query = '(concerto item_type(a)) || (piano item_type(b))';
30 #$query = 'audience(a) (concerto || item_type(a) || (piano music item_form(b)))';
31 #$query = 'concerto && (item_type(a) || piano) && (item_form(b) || music)';
32 $query = 'concerto && (piano || item_type(a)) && (music || item_form(b))';
33
34 my $superpage = 1;
35 my $superpage_size = 1000;
36 my $core_limit = 25000;
37 my $noconnect;
38 my $debug;
39 my $config = '/openils/conf/opensrf_core.xml';
40 my $quiet = 0;
41
42 GetOptions(
43     'superpage=i' => \$superpage,
44     'superpage-size=i' => \$superpage_size,
45     'core-limit=i' => \$core_limit,
46     'query=s' => \$query,
47     'no-connect' => \$noconnect,
48     'debug' => \$debug,
49     'quiet' => \$quiet,
50     'config=s' => \$config
51 );
52
53 my $parser = OpenILS::Application::Storage::Driver::Pg::QueryParser->new( 
54     superpage_size => $superpage_size, 
55     superpage => $superpage, 
56     core_limit => $core_limit, 
57     query => $query, 
58     debug => $debug 
59 );
60
61 if (!$noconnect) {
62     osrf_connect($config);
63
64     # load the parser config
65     my $cstore = OpenSRF::AppSession->create( 'open-ils.cstore' );
66     $parser->initialize(
67         config_record_attr_index_norm_map =>
68             $cstore->request(
69                 'open-ils.cstore.direct.config.record_attr_index_norm_map.search.atomic',
70                 { id => { "!=" => undef } },
71                 { flesh => 1, flesh_fields => { crainm => [qw/norm/] }, order_by => [{ class => "crainm", field => "pos" }] }
72             )->gather(1),
73         search_relevance_adjustment         =>
74             $cstore->request(
75                 'open-ils.cstore.direct.search.relevance_adjustment.search.atomic',
76                 { id => { "!=" => undef } }
77             )->gather(1),
78         config_metabib_field                =>
79             $cstore->request(
80                 'open-ils.cstore.direct.config.metabib_field.search.atomic',
81                 { id => { "!=" => undef } }
82             )->gather(1),
83         config_metabib_field_virtual_map    =>
84             $cstore->request(
85                 'open-ils.cstore.direct.config.metabib_field_virtual_map.search.atomic',
86                 { id => { "!=" => undef } }
87             )->gather(1),
88         config_metabib_search_alias         =>
89             $cstore->request(
90                 'open-ils.cstore.direct.config.metabib_search_alias.search.atomic',
91                 { alias => { "!=" => undef } }
92             )->gather(1),
93         config_metabib_field_index_norm_map =>
94             $cstore->request(
95                 'open-ils.cstore.direct.config.metabib_field_index_norm_map.search.atomic',
96                 { id => { "!=" => undef } },
97                 { flesh => 1, flesh_fields => { cmfinm => [qw/norm/] }, order_by => [{ class => "cmfinm", field => "pos" }] }
98             )->gather(1),
99         config_record_attr_definition       =>
100             $cstore->request(
101                 'open-ils.cstore.direct.config.record_attr_definition.search.atomic',
102                 { name => { "!=" => undef } }
103             )->gather(1),
104     );
105 }
106
107 $parser->parse;
108 my $sql = $parser->toSQL;
109 $sql =~ s/^\s*$//gm;
110
111 print "Parsed query tree:\n" . Dumper($parser) unless $quiet;
112 print "Abstract query:\n" . Dumper($parser->parse_tree->to_abstract_query) unless $quiet;
113
114 print "SQL:\n$sql\n\n" unless $quiet;
115