[Koha-cvs] koha/misc kohaQuery2PQF.pl [dev_week]

Joshua Ferraro jmf at kados.org
Sat Aug 19 21:47:15 CEST 2006


CVSROOT:	/sources/koha
Module name:	koha
Branch:		dev_week
Changes by:	Joshua Ferraro <kados>	06/08/19 19:47:15

Added files:
	misc           : kohaQuery2PQF.pl 

Log message:
	The start of a query parser that takes incoming KohaQuery queries and
	converts them to multi-leaf nodes in PQF format

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/misc/kohaQuery2PQF.pl?cvsroot=koha&only_with_tag=dev_week&rev=1.1.2.1

Patches:
Index: kohaQuery2PQF.pl
===================================================================
RCS file: kohaQuery2PQF.pl
diff -N kohaQuery2PQF.pl
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ kohaQuery2PQF.pl	19 Aug 2006 19:47:15 -0000	1.1.2.1
@@ -0,0 +1,86 @@
+#!/usr/bin/perl -s
+use strict;
+use Parse::RecDescent;
+$::RD_WARN   = 1;
+$::RD_ERRORS = 1;
+$::RD_HINT = 1;
+#$::RD_TRACE =1;
+#my $incoming_query = "harry and potter"; #ti=(Harry potter) not goblet";
+
+# Create and compile the source file
+#
+our %opmap = (
+	'+' => '@and',
+	'|' => '@or',
+	'-' => '@not'
+);
+
+sub transform_ops {
+	if (@_ == 1) {
+		return $_[0];
+	} elsif (@_ < 3) {
+		die "Bad juju";
+	}
+
+	my $right = pop @_;
+	my $op = pop @_;
+
+	return [ $opmap{$op} , transform_ops(@_), $right ]
+}
+
+my $parser = Parse::RecDescent->new(q(
+KohaQuery : <leftop: Elements Op Elements> {
+	  $return = main::transform_ops( @{ $item[1] } );
+	  }
+
+      Op :  "+" | "|"  | "-"
+
+      Elements : Qualifiers Relation Terms 
+		{ $return = ['@attr', {
+			qlist => $item[1], 
+			relation => $item[2],
+			value => $item[3] } ]
+		}
+			| Qualifiers Relation "(" KohaQuery ")"
+		{ $return = ['@attr', {
+			qlist => $item[1], 
+			relation => $item[2], 
+			subquery => $item[4] } ]
+		}
+			| Qualifiers "=" string "-" string
+		{ $return = ['@attr', {
+			qlist => $item[1],
+			relation => $item[2],
+			range => [$item[3], $item[5]] }]
+		}
+		| "(" KohaQuery ")" { $return = $item[2] }
+		| Terms
+
+	  Terms: <leftop: Term Prox Term>
+#      -- Proximity of terms.
+
+	  Term: string(s) { $return = join " ", @{$item[1]}; 
+		$return = qq{"$return"} if $return =~ /\s/;
+		}
+#      -- This basically means that a term may include a blank
+
+	  Qualifiers: string(s /,/)
+#      -- Qualifiers is a list of strings separated by comma
+
+      Relation : "=" | ">=" | "<=" | "<>" | ">" | "<"
+
+      Prox : "%" | "!"
+#      -- Proximity operator
+#
+      string : /[A-Za-z]\w*/
+
+	  ));
+
+#Test it on lines of user input
+
+while (defined (my $line = <>)) {
+	my $result = $parser->KohaQuery(\$line);
+	print "Leftover: $line\n";
+	use Data::Dumper;
+	print Dumper($result), "\n";
+}





More information about the Koha-cvs mailing list