[isidorus-cvs] r379 - trunk/src/TM-SPARQL
Lukas Giessmann
lgiessmann at common-lisp.net
Mon Dec 20 18:28:01 UTC 2010
Author: lgiessmann
Date: Mon Dec 20 13:28:01 2010
New Revision: 379
Log:
TM-SPARQL: fixed a bug when invoking filters => all functions are explicit wrapped in the filter-functions package by using the prefix 'filter-functions::' in the filter stirng.
Modified:
trunk/src/TM-SPARQL/filter_wrappers.lisp
trunk/src/TM-SPARQL/sparql.lisp
trunk/src/TM-SPARQL/sparql_filter.lisp
trunk/src/TM-SPARQL/sparql_parser.lisp
Modified: trunk/src/TM-SPARQL/filter_wrappers.lisp
==============================================================================
--- trunk/src/TM-SPARQL/filter_wrappers.lisp (original)
+++ trunk/src/TM-SPARQL/filter_wrappers.lisp Mon Dec 20 13:28:01 2010
@@ -9,7 +9,8 @@
(defpackage :filter-functions
- (:use :base-tools :constants :tm-sparql))
+ (:use :base-tools :constants :tm-sparql)
+ (:import-from :cl progn handler-case let))
(defun filter-functions::not(x)
Modified: trunk/src/TM-SPARQL/sparql.lisp
==============================================================================
--- trunk/src/TM-SPARQL/sparql.lisp (original)
+++ trunk/src/TM-SPARQL/sparql.lisp Mon Dec 20 13:28:01 2010
@@ -252,33 +252,50 @@
(push variable-name (variables construct)))))
+(defgeneric generate-let-variable-string (construct value)
+ (:documentation "Returns a list if the form (:string <var-string>
+ :variable-names (<?var-name-as-string>
+ <$var-name-as-string>)).")
+ (:method ((construct SPARQL-Triple-Elem) value)
+ (when (variable-p construct)
+ (let* ((var-value (write-to-string value))
+ (var-name (value construct))
+ (lisp-str
+ (concatenate 'string "(?" var-name " " var-value ")"
+ "($" var-name " " var-value ")"))
+ (vars
+ (concatenate 'string "?" var-name " $" var-name)))
+ (list :string lisp-str
+ :variable-names vars)))))
+
+
(defgeneric invoke-filter (construct filter-string)
(:documentation "Invokes the passed filter on the construct that
represents a sparql result.")
(:method ((construct SPARQL-Triple) (filter-string String))
(let ((results nil)) ;a list of the form (:subject x :predicate y :object z)
(dotimes (row-idx (length (subject-result construct)))
- (let* ((subj-var
- (when (variable-p (subject construct))
- (concatenate 'string "(" (value (subject construct))
- " " (elt (subject-result construct) row-idx) ")")))
- (pred-var
- (when (variable-p (predicate construct))
- (concatenate 'string "(" (value (predicate construct))
- " " (elt (predicate-result construct) row-idx) ")")))
- (obj-var
- (when (variable-p (object construct))
- (concatenate 'string "(" (value (object construct))
- " " (elt (object-result construct) row-idx) ")")))
- (var-let
- (concatenate 'string "(let ((true t) (false nil) "
- subj-var pred-var obj-var ")"))
+ (let* ((subj-elem
+ (generate-let-variable-string
+ (subject construct) (elt (subject-result construct) row-idx)))
+ (pred-elem
+ (generate-let-variable-string
+ (predicate construct) (elt (predicate-result construct) row-idx)))
+ (obj-elem
+ (generate-let-variable-string
+ (object construct) (elt (object-result construct) row-idx)))
(expression
- (concatenate 'string var-let "(cl:handler-case "
- filter-string
- "(exception:sparql-parser-error (err) "
- "(cl:in-package :cl-user) "
- "(error err)))")))
+ (concatenate 'string
+ "(let* ((true t)(false nil)"
+ (getf subj-elem :string)
+ (getf pred-elem :string)
+ (getf obj-elem :string)
+ "(result " filter-string "))"
+ "(declare (ignorable true false "
+ (getf subj-elem :variable-names) " "
+ (getf pred-elem :variable-names) " "
+ (getf obj-elem :variable-names) "))"
+ "result)")))
(when (eval (read-from-string expression))
(push (list :subject (elt (subject-result construct) row-idx)
:predicate (elt (predicate-result construct) row-idx)
Modified: trunk/src/TM-SPARQL/sparql_filter.lisp
==============================================================================
--- trunk/src/TM-SPARQL/sparql_filter.lisp (original)
+++ trunk/src/TM-SPARQL/sparql_filter.lisp Mon Dec 20 13:28:01 2010
@@ -128,20 +128,27 @@
(defgeneric scan-filter-for-deprecated-calls (construct filter-string
original-filter)
- (:documentation "Returns the passed filter-string or throws a
- sparql-parser-error of there is an unallowed
- function call.")
+ (:documentation "Returns the passed filter-string where all functions
+ are explicit wrapped in the filter-functions package
+ or throws a sparql-parser-error of there is an
+ unallowed function call.")
(:method ((construct SPARQL-Query) (filter-string String)
(original-filter String))
- (dotimes (idx (length filter-string) filter-string)
- (when-do fun-name (return-function-name (subseq filter-string idx))
- (unless (string-starts-with-one-of fun-name *supported-functions*)
+ (let ((result ""))
+ (dotimes (idx (length filter-string) result)
+ (let ((fun-name (return-function-name (subseq filter-string idx))))
+ (cond ((not fun-name)
+ (push-string (subseq filter-string idx (1+ idx)) result))
+ ((string-starts-with-one-of fun-name *allowed-filter-calls*)
+ (push-string "(filter-functions::" result)
+ (push-string fun-name result)
+ (incf idx (length fun-name)))
+ (t
(error
(make-condition
'exceptions:sparql-parser-error
- :message (format nil "Invalid filter: the filter \"~a\" evaluated to \"~a\" which contains the depricated function ~a!"
- filter-string original-filter fun-name))))))))
-
+ :message (format nil "Invalid filter: the filter \"~a\" evaluated to \"~a\" which contains the deprecated function ~a!"
+ filter-string original-filter fun-name))))))))))
(defun return-function-name (filter-string)
Modified: trunk/src/TM-SPARQL/sparql_parser.lisp
==============================================================================
--- trunk/src/TM-SPARQL/sparql_parser.lisp (original)
+++ trunk/src/TM-SPARQL/sparql_parser.lisp Mon Dec 20 13:28:01 2010
@@ -117,7 +117,7 @@
trimmed-str (original-query construct)
"FILTER, BASE, or triple. Grouping is currently no implemented.")))
((string-starts-with trimmed-str "FILTER")
- (parse-filter (string-after trimmed-str "FILTER") construct))
+ (parse-filter construct (string-after trimmed-str "FILTER")))
((string-starts-with trimmed-str "OPTIONAL")
(error (make-sparql-parser-condition
trimmed-str (original-query construct)
More information about the Isidorus-cvs
mailing list