1
- //! Handler for resources of type Sparql (java script object notation ).
1
+ //! Handler for resources of type SPARQL (SPARQL query language for RDF) ).
2
2
3
3
use spargebra:: Query ;
4
4
use std:: sync:: Arc ;
5
5
6
6
use nemo_physical:: datavalues:: { AnyDataValue , DataValue } ;
7
7
use oxiri:: Iri ;
8
8
9
- //use reader::DsvReader;
10
- //use value_format::DsvValueFormats;
11
- //use writer::DsvWriter;
12
-
13
9
use crate :: {
14
10
io:: format_builder:: {
15
11
format_parameter, format_tag, value_type_matches, AnyImportExportBuilder , FormatParameter ,
@@ -39,18 +35,12 @@ format_parameter! {
39
35
Base ( name = attribute:: BASE , supported_types = & [ ValueType :: Constant ] ) ,
40
36
Endpoint ( name = attribute:: ENDPOINT , supported_types = & [ ValueType :: Constant ] ) ,
41
37
Query ( name = attribute:: QUERY , supported_types = & [ ValueType :: String ] ) ,
42
- IgnoreHeaders ( name = attribute:: IGNORE_HEADERS , supported_types = & [ ValueType :: Boolean ] ) ,
43
-
44
38
}
45
39
}
46
40
47
41
impl FormatParameter < SparqlTag > for SparqlParameter {
48
42
fn required_for ( & self , tag : SparqlTag ) -> bool {
49
- if matches ! ( tag, SparqlTag :: Sparql ) {
50
- matches ! ( self , SparqlParameter :: Endpoint ) && matches ! ( self , SparqlParameter :: Query )
51
- } else {
52
- false
53
- }
43
+ matches ! ( tag, SparqlTag :: Sparql ) && matches ! ( self , Self :: Endpoint | Self :: Query )
54
44
}
55
45
56
46
fn is_value_valid ( & self , value : AnyDataValue ) -> Result < ( ) , ValidationErrorKind > {
@@ -67,10 +57,9 @@ impl FormatParameter<SparqlTag> for SparqlParameter {
67
57
SparqlParameter :: Base => Ok ( ( ) ) ,
68
58
SparqlParameter :: Format => DsvValueFormats :: try_from ( value) . and ( Ok ( ( ) ) ) . map_err ( |_| {
69
59
ValidationErrorKind :: ImportExportValueFormat {
70
- file_format : "rdf " . to_string ( ) ,
60
+ file_format : "sparql " . to_string ( ) ,
71
61
}
72
62
} ) ,
73
- SparqlParameter :: IgnoreHeaders => Ok ( ( ) ) ,
74
63
SparqlParameter :: Endpoint => value
75
64
. to_iri ( )
76
65
. ok_or ( ValidationErrorKind :: ImportExportInvalidIri )
@@ -79,27 +68,23 @@ impl FormatParameter<SparqlTag> for SparqlParameter {
79
68
. map ( |_| ( ) )
80
69
. map_err ( |_| ValidationErrorKind :: ImportExportInvalidIri )
81
70
} ) ,
82
- SparqlParameter :: Query => value
83
- . to_plain_string ( )
84
- . ok_or ( ValidationErrorKind :: ImportExportLimitNegative )
85
- . and_then ( |query| {
86
- Query :: parse ( query. as_str ( ) , None ) . map ( |_| ( ) ) . map_err ( |e| {
87
- ValidationErrorKind :: ImportExportInvalidSparqlQuery {
88
- oxi_error : e. to_string ( ) ,
89
- }
71
+ SparqlParameter :: Query => {
72
+ Query :: parse ( value. to_plain_string_unchecked ( ) . as_str ( ) , None )
73
+ . map ( |_| ( ) )
74
+ . map_err ( |e| ValidationErrorKind :: ImportExportInvalidSparqlQuery {
75
+ oxi_error : e. to_string ( ) ,
90
76
} )
91
- } ) ,
77
+ }
92
78
}
93
79
}
94
80
}
95
81
96
82
#[ derive( Clone ) ]
97
83
pub ( crate ) struct SparqlBuilder {
98
84
limit : Option < u64 > ,
99
- delimiter : u8 ,
100
85
value_formats : Option < DsvValueFormats > ,
101
- ignore_headers : bool ,
102
- parsed_query : Query ,
86
+ endpoint : Iri < String > ,
87
+ query : Query ,
103
88
}
104
89
105
90
impl From < SparqlBuilder > for AnyImportExportBuilder {
@@ -114,52 +99,53 @@ impl FormatBuilder for SparqlBuilder {
114
99
_tag : Self :: Tag ,
115
100
parameters : & Parameters < SparqlBuilder > ,
116
101
_direction : Direction ,
117
- ) -> Result < ( Self , Option < ResourceSpec > ) , ValidationErrorKind > {
102
+ ) -> Result < Self , ValidationErrorKind > {
118
103
// Copied from DsvBuilder
119
104
let value_formats = parameters
120
105
. get_optional ( SparqlParameter :: Format )
121
- . map ( |value| DsvValueFormats :: try_from ( value) . unwrap ( ) ) ;
106
+ . map ( |value| DsvValueFormats :: try_from ( value) . expect ( "value formats have already been validated" ) ) ;
122
107
123
108
let limit = parameters
124
109
. get_optional ( SparqlParameter :: Limit )
125
110
. map ( |value| value. to_u64_unchecked ( ) ) ;
126
111
127
- let ignore_headers = parameters
128
- . get_optional ( SparqlParameter :: IgnoreHeaders )
129
- . as_ref ( )
130
- . map ( AnyDataValue :: to_boolean_unchecked)
131
- . unwrap_or ( false ) ;
132
-
133
- // Sparql-specific fields
112
+ // SPARQL-specific fields
134
113
let endpoint = Iri :: parse_unchecked (
135
114
parameters
136
- . get_required ( SparqlParameter :: Endpoint . into ( ) )
115
+ . get_required ( SparqlParameter :: Endpoint )
137
116
. to_iri_unchecked ( ) ,
138
117
) ;
139
118
140
119
let query = parameters
141
- . get_required ( SparqlParameter :: Query . into ( ) )
120
+ . get_required ( SparqlParameter :: Query )
142
121
. to_plain_string_unchecked ( ) ;
143
122
144
- let parsed_query = Query :: parse ( query. as_str ( ) , None ) . unwrap ( ) ;
123
+ let query = Query :: parse ( query. as_str ( ) , None ) . expect ( "query has already been validated" ) ;
145
124
146
125
// Create and return a new ResourceSpec to replace the existing ResourceSpec
147
- let resource = ResourceSpec :: from_endpoint ( endpoint, query) ;
148
- Ok ( (
149
- Self {
150
- delimiter : b'\t' ,
151
- value_formats,
152
- limit,
153
- ignore_headers,
154
- parsed_query,
155
- } ,
156
- Some ( resource) ,
157
- ) )
126
+ Ok ( Self {
127
+ value_formats,
128
+ limit,
129
+ endpoint,
130
+ query,
131
+ } )
132
+ }
133
+
134
+ // TODO: do we need to parse parameters here again? that would be annoying
135
+ fn override_resource_spec ( & self , direction : Direction ) -> Option < ResourceSpec > {
136
+ if matches ! ( direction, Direction :: Export ) {
137
+ None
138
+ } else {
139
+ Some ( ResourceSpec :: from_endpoint (
140
+ self . endpoint . clone ( ) ,
141
+ self . query . to_sse ( ) ,
142
+ ) )
143
+ }
158
144
}
159
145
160
146
fn expected_arity ( & self ) -> Option < usize > {
161
147
let mut var_count: usize = 0 ;
162
- match & self . parsed_query {
148
+ match & self . query {
163
149
Query :: Select { pattern, .. }
164
150
| Query :: Describe { pattern, .. }
165
151
| Query :: Construct { pattern, .. }
@@ -170,17 +156,17 @@ impl FormatBuilder for SparqlBuilder {
170
156
171
157
fn build_import ( & self , arity : usize ) -> Arc < dyn ImportHandler + Send + Sync + ' static > {
172
158
Arc :: new ( DsvHandler {
173
- delimiter : self . delimiter ,
159
+ delimiter : b'\t' ,
174
160
value_formats : self
175
161
. value_formats
176
162
. clone ( )
177
163
. unwrap_or ( DsvValueFormats :: default ( arity) ) ,
178
164
limit : self . limit ,
179
- ignore_headers : self . ignore_headers ,
165
+ ignore_headers : true ,
180
166
} )
181
167
}
182
168
183
169
fn build_export ( & self , _arity : usize ) -> Arc < dyn ExportHandler + Send + Sync + ' static > {
184
- unimplemented ! ( "Sparql export is currently not supported" )
170
+ unimplemented ! ( "SPARQL export is currently not supported" )
185
171
}
186
172
}
0 commit comments