[isidorus-cvs] r342 - trunk/src/TM-SPARQL
Lukas Giessmann
lgiessmann at common-lisp.net
Fri Nov 19 09:29:07 UTC 2010
Author: lgiessmann
Date: Fri Nov 19 04:29:06 2010
New Revision: 342
Log:
TM-SPARQL: added parsing of BASE statements
Modified:
trunk/src/TM-SPARQL/sparql.lisp
trunk/src/TM-SPARQL/sparql_parser.lisp
Modified: trunk/src/TM-SPARQL/sparql.lisp
==============================================================================
--- trunk/src/TM-SPARQL/sparql.lisp (original)
+++ trunk/src/TM-SPARQL/sparql.lisp Fri Nov 19 04:29:06 2010
@@ -19,7 +19,8 @@
(defclass SPARQL-Query ()
((original-query :initarg :query
- :reader original-query
+ :accessor original-query ;this value is only for internal
+ ;purposes and mustn't be reset
:type String
:initform (error
(make-condition
@@ -27,19 +28,29 @@
:message "From TM-Query(): original-query must be set"))
:documentation "Containst the original received querry as string")
(prefix-list :initarg :prefix-list
- :reader prefix-list
+ :accessor prefix-list ;this value is only for internal purposes
+ ;purposes and mustn't be reset
:type List
:initform nil
:documentation "A list of the form
((:label 'id' :value 'prefix'))")
+ (base-value :initarg :base-value ;initialy the requester's address
+ :accessor base-value ;this value is only for internal purposes
+ ;purposes and mustn't be reset
+ :type String
+ :initform nil
+ :documentation "Contains the last set base-value.")
(variables :initarg :variables
- :accessor :variables
+ :accessor variables ;this value is only for internal purposes
+ ;purposes and mustn't be reset
:type List
:documentation "A list of the form ((:variable var-symbol
:value value-object)), that contains tuples
for each variable and its result.")
(select-statements :initarg :select-statements
- :accessor select-statements
+ :accessor select-statements ;this value is only for
+ ;internal purposes purposes
+ ;and mustn't be reset
:type List
:documentation "A list of the form ((:statement 'statement'
:value value-object))")))
@@ -57,7 +68,7 @@
(if existing-tuple
(setf (getf existing-tuple :value) prefix-value)
(push (list :label prefix-label :value prefix-value)
- (slot-value construct 'prefix-list))))))
+ (prefix-list construct))))))
Modified: trunk/src/TM-SPARQL/sparql_parser.lisp
==============================================================================
--- trunk/src/TM-SPARQL/sparql_parser.lisp (original)
+++ trunk/src/TM-SPARQL/sparql_parser.lisp Fri Nov 19 04:29:06 2010
@@ -9,6 +9,7 @@
(in-package :TM-SPARQL)
+
(defun make-sparql-parser-condition(rest-of-query entire-query expected)
"Creates a spqrql-parser-error object."
(declare (String rest-of-query entire-query expected))
@@ -20,7 +21,6 @@
(make-condition 'sparql-parser-error :message message)))
-
(defgeneric parser-start(construct query-string)
(:documentation "The entry point of the SPARQL-parser.")
(:method ((construct SPARQL-Query) (query-string String))
@@ -31,38 +31,53 @@
(parse-prefixes construct
(string-after trimmed-query-string "PREFIX")))
((string-starts-with trimmed-query-string "BASE")
- nil) ;TODO: implement
+ (parse-base construct (string-after trimmed-query-string "BASE")
+ #'parser-start))
+ ((= (length trimmed-query-string) 0) ;TODO: remove, only for debugging purposes
+ construct)
(t
(error (make-sparql-parser-condition
trimmed-query-string (original-query construct)
"SELECT, PREFIX or BASE")))))))
+(defgeneric parse-base (construct query-string next-fun)
+ (:documentation "Parses the Base statment and sets the corresponding
+ attribute in the query-construct. Since the BASE statement
+ may appear in different states the next-fun defines the next
+ call function that calls the next transitions and states.")
+ (:method ((construct SPARQL-Query) (query-string String) (next-fun Function))
+ (let* ((trimmed-str (trim-whitespace-left query-string))
+ (result (parse-bracketed-value trimmed-str construct)))
+ (setf (base-value construct) (getf result :value))
+ (funcall next-fun construct (getf result :next-query)))))
+
+
(defgeneric parse-prefixes (construct query-string)
(:documentation "Sets the correponding prefix-tuples in the passed object.")
(:method ((construct SPARQL-Query) (query-string String))
(let ((trimmed-string (trim-whitespace-left query-string)))
(if (string-starts-with trimmed-string ":")
(let ((results
- (parse-bracket-value (subseq trimmed-string 1) construct)))
+ (parse-bracketed-value (subseq trimmed-string 1) construct)))
(add-prefix construct *empty-label* (getf results :value))
- (parser-start construct (getf results :query-string)))
+ (parser-start construct (getf results :next-query)))
(let* ((label-name
(trim-whitespace-right (string-until trimmed-string ":")))
(next-query-str
(trim-whitespace-left (string-after trimmed-string ":")))
- (results (parse-bracket-value next-query-str construct)))
+ (results (parse-bracketed-value next-query-str construct)))
(when (string= label-name trimmed-string)
(error (make-sparql-parser-condition
trimmed-string (original-query construct) ":")))
(add-prefix construct label-name (getf results :value))
- (parser-start construct (getf results :query-string)))))))
+ (parser-start construct (getf results :next-query)))))))
-(defun parse-bracket-value(query-string query-object &key (open "<") (close ">"))
+(defun parse-bracketed-value(query-string query-object &key (open "<") (close ">"))
"A helper function that checks the value of a statement within
two brackets, i.e. <prefix-value>. A list of the
- form (:query-string string :value string) is returned."
+ form (:next-query string :value string) is returned."
(declare (String query-string open close)
(SPARQL-Query query-object))
(let ((trimmed-string (trim-whitespace-left query-string)))
@@ -73,7 +88,7 @@
(error (make-sparql-parser-condition
trimmed-string (original-query query-object)
close)))
- (list :query-string next-query-str
+ (list :next-query next-query-str
:value pref-url))
(error (make-sparql-parser-condition
trimmed-string (original-query query-object)
More information about the Isidorus-cvs
mailing list