]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/extras/fts-replacement.pl
QueryParser Driver: Much work
[working/Evergreen.git] / Open-ILS / src / extras / fts-replacement.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use OpenILS::Application::Storage::Driver::Pg::QueryParser;
5 use JSON::XS;
6 use Getopt::Long;
7 use Data::Dumper;
8 $Data::Dumper::Indent = 1;
9 use Time::HiRes qw/time/;
10
11 OpenILS::Application::Storage::Driver::Pg::QueryParser->TEST_SETUP;
12
13 my $query = '#available title: foo bar* || (-baz || (subject:"1900'.
14                         '-1910 junk" "and another thing" se:stuff #available '.
15                         'statuses(0,7,12))) && && && au:malarky || au|'.
16                         'corporate|personal:gonzo && dc.identifier:+123456789X'.
17                         ' dc.contributor=rowling #metarecord estimation_'.
18                         'strategy(exclusion) item_type(a, t) item_form(d) '.
19                         'bib.subjectTitle=potter bib.subjectName=harry '.
20                         'keyword|mapscale:1:250000';
21 my $superpage = 1;
22 my $superpage_size = 1000;
23 my $core_limit = 25000;
24 my $debug;
25 my $quiet;
26 my $runs = 100;
27
28 GetOptions(
29     'superpage=i' => \$superpage,
30     'superpage-size=i' => \$superpage_size,
31     'core-limit=i' => \$core_limit,
32     'query=s' => \$query,
33     'debug' => \$debug,
34     'quiet' => \$quiet,
35     'runs=i' => \$runs
36 );
37
38
39 my $start = time();
40 OpenILS::Application::Storage::Driver::Pg::QueryParser->new( superpage_size => $superpage_size, superpage => $superpage, core_limit => $core_limit, debug => $debug, query => $query )->parse->parse_tree for (1 .. $runs);
41 my $end = time();
42
43 my $plan = OpenILS::Application::Storage::Driver::Pg::QueryParser->new( superpage_size => $superpage_size, superpage => $superpage, core_limit => $core_limit, query => $query, debug => $debug );
44 $plan->parse;
45 print "Parsed query tree:\n" .  Dumper( $plan->parse_tree) if (!$quiet);
46 #print "Parsed query tree:\n" .  Dumper( QueryParser->new( superpage_size => $superpage_size, superpage => $superpage, core_limit => $core_limit, query => $query, debug => $debug )->parse->parse_tree);
47 my $sql = $plan->toSQL;
48 $sql =~ s/^\s*$//gm;
49 print "SQL:\n$sql\n\n" if (!$quiet);
50
51 my $abstract_query = $plan->parse_tree->to_abstract_query(with_config => 0);
52 print "abstract_query: " . Dumper($abstract_query) . "\n";
53 print "Original query: $query\n";
54 print "Canonicalized query: ".$plan->canonicalize()."\n";
55 print "Simple plan: " . ($plan->simple_plan ? 'yes' : 'no') . "\n"; 
56 print "Total parse time, $runs runs: " . ($end - $start) . "s\n";
57 print "Average parse time, $runs runs: " . sprintf('%0.3f',(($end - $start) / $runs) * 1000) . "ms\n";
58