@@ -110,6 +110,15 @@ WOQLQuery.prototype.rawVar = function(varb) {
110
110
return varb
111
111
}
112
112
113
+ WOQLQuery . prototype . rawVarList = function ( vl ) {
114
+ let ret = [ ]
115
+ for ( var i = 0 ; i < vl . length ; i ++ ) {
116
+ let co = this . rawVar ( vl [ i ] )
117
+ ret . push ( co )
118
+ }
119
+ return ret
120
+ }
121
+
113
122
/**
114
123
* Transforms a javascript representation of a query into a json object if needs be
115
124
*/
@@ -181,19 +190,64 @@ WOQLQuery.prototype.arop = function(arg) {
181
190
if ( typeof arg == 'object' ) {
182
191
return arg . json ? arg . json ( ) : arg
183
192
}
184
- return this . cleanArithmeticObject ( arg , 'xsd:decimal' )
193
+ return this . cleanArithmeticValue ( arg , 'xsd:decimal' )
194
+ }
195
+
196
+ /**
197
+ * takes input that can be either a string (variable name)
198
+ * or an array - each element of the array is a member of the list
199
+ */
200
+ WOQLQuery . prototype . wlist = function ( wvar , string_only ) {
201
+ if ( typeof wvar == 'string' ) return this . expandDataVariable ( wvar , true )
202
+ if ( Array . isArray ( wvar ) ) {
203
+ let ret = [ ]
204
+ for ( var i = 0 ; i < wvar . length ; i ++ ) {
205
+ let co = this . cleanDataValue ( wvar [ i ] )
206
+ if ( typeof co == 'string' ) co = { node : co }
207
+ ret . push ( co )
208
+ }
209
+ return ret
210
+ }
211
+ }
212
+
213
+ /**
214
+ * takes a list of input that can be any value
215
+ */
216
+ WOQLQuery . prototype . valueList = function ( wvar , string_only ) {
217
+ if ( typeof wvar == 'string' ) return this . expandValueVariable ( wvar , true )
218
+ if ( Array . isArray ( wvar ) ) {
219
+ let ret = [ ]
220
+ for ( var i = 0 ; i < wvar . length ; i ++ ) {
221
+ let co = this . cleanObject ( wvar [ i ] )
222
+ if ( typeof co == 'string' ) co = { node : co }
223
+ ret . push ( co )
224
+ }
225
+ return ret
226
+ }
185
227
}
186
228
187
229
/**
188
- * Wraps value lists in the appropriate json-ld
230
+ * creates an unadorned variable name list
189
231
*/
190
232
WOQLQuery . prototype . vlist = function ( list ) {
191
- vlist = [ ]
192
- for ( i = 0 ; i ++ ; i < list . length ) {
193
- v = this . expandVariable ( list [ i ] )
194
- vlist . push ( v )
233
+ let vl = [ ]
234
+ for ( var i = 0 ; i < list . length ; i ++ ) {
235
+ let v = this . expandValueVariable ( list [ i ] )
236
+ vl . push ( v [ 'variable' ] )
195
237
}
196
- return vlist
238
+ return vl
239
+ }
240
+
241
+ /**
242
+ * Wraps data values
243
+ */
244
+ WOQLQuery . prototype . dataValueList = function ( list ) {
245
+ let dvl = [ ]
246
+ for ( var i = 0 ; i < list . length ; i ++ ) {
247
+ let o = this . cleanDataValue ( list [ i ] )
248
+ dvl . push ( o )
249
+ }
250
+ return dvl
197
251
}
198
252
199
253
/**
@@ -208,8 +262,7 @@ WOQLQuery.prototype.cleanSubject = function(s) {
208
262
return s
209
263
} else if ( typeof s === 'string' ) {
210
264
if ( s . indexOf ( 'v:' ) !== - 1 ) subj = s
211
- //else if (this.vocab && this.vocab[s]) subj = this.vocab[s]
212
- else subj = s //'doc:' + s
265
+ else subj = s
213
266
return this . expandNodeVariable ( subj )
214
267
}
215
268
this . parameterError ( 'Subject must be a URI string' )
@@ -265,6 +318,8 @@ WOQLQuery.prototype.cleanObject = function(o, t) {
265
318
return this . cleanClass ( o )
266
319
} else if ( this . vocab && this . vocab [ o ] ) {
267
320
return this . cleanClass ( this . vocab [ o ] )
321
+ } else if ( s . indexOf ( 'v:' ) !== - 1 ) {
322
+ return this . expandValueVariable ( o )
268
323
} else {
269
324
obj [ 'data' ] = this . jlt ( o , t )
270
325
}
@@ -278,10 +333,14 @@ WOQLQuery.prototype.cleanObject = function(o, t) {
278
333
return obj
279
334
}
280
335
281
- WOQLQuery . prototype . cleanDataObject = function ( o , t ) {
336
+ WOQLQuery . prototype . cleanDataValue = function ( o , t ) {
282
337
let obj = { '@type' : 'DataValue' }
283
338
if ( typeof o === 'string' ) {
284
- obj [ 'data' ] = this . jlt ( o , t )
339
+ if ( o . indexOf ( 'v:' ) !== - 1 ) {
340
+ return this . expandDataVariable ( o )
341
+ } else {
342
+ obj [ 'data' ] = this . jlt ( o , t )
343
+ }
285
344
} else if ( typeof o == 'number' ) {
286
345
t = t || 'xsd:decimal'
287
346
obj [ 'data' ] = this . jlt ( o , t )
@@ -292,10 +351,14 @@ WOQLQuery.prototype.cleanDataObject = function(o, t) {
292
351
return obj
293
352
}
294
353
295
- WOQLQuery . prototype . cleanArithmeticObject = function ( o , t ) {
354
+ WOQLQuery . prototype . cleanArithmeticValue = function ( o , t ) {
296
355
let obj = { '@type' : 'ArithmeticValue' }
297
356
if ( typeof o === 'string' ) {
298
- obj [ 'data' ] = this . jlt ( o , t )
357
+ if ( o . indexOf ( 'v:' ) !== - 1 ) {
358
+ return this . expandArithmeticVariable ( o )
359
+ } else {
360
+ obj [ 'data' ] = this . jlt ( o , t )
361
+ }
299
362
} else if ( typeof o == 'number' ) {
300
363
t = t || 'xsd:decimal'
301
364
obj [ 'data' ] = this . jlt ( o , t )
@@ -306,12 +369,27 @@ WOQLQuery.prototype.cleanArithmeticObject = function(o, t) {
306
369
return obj
307
370
}
308
371
372
+ WOQLQuery . prototype . cleanNodeValue = function ( o , t ) {
373
+ let obj = { '@type' : 'NodeValue' }
374
+ if ( typeof o === 'string' ) {
375
+ if ( o . indexOf ( 'v:' ) !== - 1 ) {
376
+ return this . expandNodeVariable ( o )
377
+ } else {
378
+ obj [ 'node' ] = o
379
+ }
380
+ } else if ( typeof o == 'object' && o ) {
381
+ if ( o [ '@value' ] ) obj [ 'data' ] = o
382
+ else return o
383
+ }
384
+ return obj
385
+ }
386
+
309
387
/*
310
388
* check if can be a class in the object
311
389
*/
312
390
WOQLQuery . prototype . looksLikeClass = function ( o ) {
313
391
//if it is like User or Person it is a class
314
- if ( o . indexOf ( 'v:' ) === - 1 ) return true
392
+ if ( o . indexOf ( 'v:' ) === - 1 ) return true
315
393
316
394
let pref = o . split ( ':' ) [ 0 ]
317
395
if (
@@ -339,61 +417,45 @@ WOQLQuery.prototype.cleanGraph = function(g) {
339
417
* Transforms strings that start with v: into variable json-ld structures
340
418
* @param varname - will be transformed if it starts with v:
341
419
*/
342
- WOQLQuery . prototype . expandVariable = function ( varname , always ) {
420
+ WOQLQuery . prototype . expandVariable = function ( varname , type , always ) {
343
421
if ( varname . substring ( 0 , 2 ) == 'v:' || always ) {
344
422
if ( varname . substring ( 0 , 2 ) == 'v:' ) varname = varname . substring ( 2 )
345
423
return {
346
- '@type' : 'Value' ,
424
+ '@type' : type ,
347
425
'variable' : varname
348
426
}
349
427
} else {
350
428
return {
351
- '@type' : 'Value' ,
429
+ '@type' : type ,
352
430
'node' : varname ,
353
431
}
354
432
}
355
- //return varname
433
+ }
434
+
435
+ WOQLQuery . prototype . expandValueVariable = function ( varname , always ) {
436
+ return this . expandVariable ( varname , 'Value' , always )
356
437
}
357
438
358
439
WOQLQuery . prototype . expandNodeVariable = function ( varname , always ) {
359
- if ( varname . substring ( 0 , 2 ) == 'v:' || always ) {
360
- if ( varname . substring ( 0 , 2 ) == 'v:' ) varname = varname . substring ( 2 )
361
- return {
362
- '@type' : 'NodeValue' ,
363
- 'variable' : varname ,
364
- }
365
- } else {
366
- return {
367
- '@type' : 'NodeValue' ,
368
- 'node' : varname ,
369
- }
370
- }
371
- //return varname
440
+ return this . expandVariable ( varname , 'NodeValue' , always )
372
441
}
373
442
374
443
WOQLQuery . prototype . expandDataVariable = function ( varname , always ) {
375
- if ( varname . substring ( 0 , 2 ) == 'v:' || always ) {
376
- if ( varname . substring ( 0 , 2 ) == 'v:' ) varname = varname . substring ( 2 )
377
- return {
378
- '@type' : 'Value' ,
379
- 'variable' : varname
380
- }
381
- } else {
382
- return {
383
- '@type' : 'Value' ,
384
- 'node' : varname ,
385
- }
386
- }
387
- //return varname
444
+ return this . expandVariable ( varname , 'DataValue' , always )
388
445
}
389
446
447
+ WOQLQuery . prototype . expandArithmeticVariable = function ( varname , always ) {
448
+ return this . expandVariable ( varname , 'ArithmeticValue' , always )
449
+ }
450
+
451
+
390
452
WOQLQuery . prototype . cleanClass = function ( c , stringonly ) {
391
453
if ( typeof c !== 'string' ) return ''
392
454
if ( c . indexOf ( ':' ) === - 1 ) {
393
455
if ( this . vocab && this . vocab [ c ] ) c = this . vocab [ c ]
394
456
else c = c //'scm:' + c
395
457
}
396
- return stringonly ? c : this . expandVariable ( c )
458
+ return stringonly ? c : this . expandValueVariable ( c )
397
459
}
398
460
399
461
WOQLQuery . prototype . cleanType = function ( t , stringonly ) {
@@ -724,11 +786,16 @@ function tokensToJSON(seq, q) {
724
786
function copyJSON ( orig , rollup ) {
725
787
if ( Array . isArray ( orig ) ) return orig
726
788
if ( rollup ) {
727
- if ( [ 'And' , 'Or' ] . indexOf ( orig [ '@type' ] ) != - 1 ) {
728
- if ( ! orig [ 'query_list' ] || ! orig [ 'query_list' ] . length ) return { }
729
- if ( orig [ 'query_list' ] . length == 1 )
730
- return copyJSON ( orig [ 'query_list' ] [ 0 ] [ 'query' ] , rollup )
789
+ if ( orig [ '@type' ] == 'And' ) {
790
+ if ( ! orig [ 'and' ] || ! orig [ 'and' ] . length ) return { }
791
+ if ( orig [ 'and' ] . length == 1 )
792
+ return copyJSON ( orig [ 'and' ] [ 0 ] , rollup )
793
+ } else if ( orig [ '@type' ] == 'Or' ) {
794
+ if ( ! orig [ 'or' ] || ! orig [ 'or' ] . length ) return { }
795
+ if ( orig [ 'or' ] . length == 1 )
796
+ return copyJSON ( orig [ 'or' ] [ 0 ] , rollup )
731
797
}
798
+
732
799
if ( typeof orig [ 'query' ] != 'undefined' && orig [ '@type' ] != 'Comment' ) {
733
800
if ( ! orig [ 'query' ] [ '@type' ] ) return { }
734
801
} else if ( orig [ '@type' ] == 'Comment' && orig [ 'comment' ] ) {
0 commit comments