Minor (mostly notes to myself)
[pazpar2-moved-to-github.git] / heikki / queries / process2.pl
1 #!/usr/bin/perl -w
2 # Analyzing DBC's example queries
3 # Step 2: Count identical queries, and query types
4 # Assumes x2 is the result of process1.pl, sorted alphabetically
5
6
7
8 open F, "x2" or die "could not open x2: $!\n";
9
10 open OUT, "| sort -n -r > x3" or die "could not open sort>x3 for writing: $!\n";
11 print OUT "#count ; query \n";
12
13 my $thisquery = "";
14 my $count = 1; # how many times seen the same query
15 my $totalqueries = 0;
16 my $booleans = 0; # queries that contain a boolean operator
17 my $fields = 0; # queries that start with field=, f.ex. title or author
18 my $multifields = 0; # queries that contain more than one field
19 my $simplequeries = 0; # queries without booleans or fields
20 my $uniquequeries = 0;
21 my $singlehits = 0;
22 my $singleterms = 0;
23 my $doubleterms = 0;
24 my $tripleterms = 0;
25 my $manyterms = 0;
26 my %field;
27 while ( <F> ) {
28     next if /^#/;
29     my ( $query, $hits, $pages ) = split (';');
30     next if ( $hits =~ /["a-z]/); # semicolons in original query, ignore
31     if ( $thisquery eq $query ){
32         $count ++;
33     } else {
34         print OUT "$count ; $thisquery \n";
35         $totalqueries += $count;
36         $uniquequeries += 1;
37         $singlehits += 1 if ($hits <= 1 );
38         my $is_simple = 1;
39         my $is_boolean = 0;
40         if ( / og /i || / eller /i || / ikke /i ) {
41             $booleans++;
42             $is_simple = 0;
43             $is_boolean = 1;
44         }
45         my $fieldcount = 0;
46         while ( $query =~ /([^ (=%'"]+)=\s*([^ ]+)/g ) {
47             if (++$fieldcount >1 ) {
48                 $is_simple = 0;
49                 print "OOPS: $fieldcount $query \n" unless $is_boolean;
50                 $multifields += $count;
51             }
52             my $fld = $1;
53             $fields += $count;
54             #print "Field loop: '$fld' $query \n";
55             $fld = lc($fld);
56             $field{$fld} = 0 unless defined($field{$fld});
57             $field{$fld} += $count;
58         }
59         if ($is_simple) {
60             $simplequeries += $count;
61         }
62         my $q2 = $query;
63         $q2 =~ s/\S+=//; # remove fields
64         $q2 =~ s/ og //;
65         $q2 =~ s/ eller //;
66         $q2 =~ s/ ikke //;
67         $singleterms += $count if ($q2 =~ /^\s*\S+\s*$/ );
68         $doubleterms += $count if ($q2 =~ /^\s*\S+\s+\S+\s*$/ );
69         $tripleterms += $count if ($q2 =~ /^\s*\S+\s+\S+\s+\S+\s*$/ );
70         $manyterms   += $count if ($q2 =~ /^\s*\S+\s+\S+\s+\S+\s+\S+/ );
71         #print "$query ; $hits ; $pagecount\n";
72         $count = 1;
73         $thisquery = $query;
74     }
75 }
76 close OUT;
77
78 open OUT, ">x4" or die "could not open x4 for writing summary: $!\n";
79
80 sub line {
81     my ($capt, $number, $dopercent ) = @_;
82     my $percents = "";
83     if ( $dopercent ) {
84         $percents = "". int( $number*1000 / $totalqueries ) / 10 . "%" ;
85     }
86     while (length($percents) < 6 ) { $percents = " $percents"; }
87     print OUT sprintf("%-20s %7d %s\n", $capt, $number, $percents);
88 }
89
90 line "Total queries", $totalqueries, 0;
91 line "Unique queries", $uniquequeries, 1;
92
93 line "Boolean queries",  $booleans, 1;
94 line "Fielded queries",  $fields, 1;
95 line "Multiple fields",  $multifields, 1;
96 line "Simple queries",  $simplequeries, 1;
97 line "One-hit queries", $singlehits, 1;
98 print OUT "\n";
99 line "Single term",  $singleterms, 1;
100 line "Double terms",  $doubleterms, 1;
101 line "Triple terms",  $tripleterms, 1;
102 line "Many terms",  $manyterms, 1;
103
104 print OUT "\nFields\n";
105 for my $k (sort{ $field{$b} <=> $field{$a} } keys(%field) ) {
106     line "  $k", $field{$k}, 1 if ($field{$k} > 100);
107 }