sparql 3.1.2 → 3.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -12
  3. data/VERSION +1 -1
  4. data/bin/sparql +20 -11
  5. data/lib/sinatra/sparql.rb +1 -1
  6. data/lib/sparql.rb +5 -6
  7. data/lib/sparql/algebra.rb +4 -4
  8. data/lib/sparql/algebra/aggregate.rb +1 -1
  9. data/lib/sparql/algebra/evaluatable.rb +4 -4
  10. data/lib/sparql/algebra/expression.rb +46 -31
  11. data/lib/sparql/algebra/extensions.rb +52 -25
  12. data/lib/sparql/algebra/operator.rb +22 -17
  13. data/lib/sparql/algebra/operator/abs.rb +1 -1
  14. data/lib/sparql/algebra/operator/avg.rb +8 -1
  15. data/lib/sparql/algebra/operator/bgp.rb +1 -1
  16. data/lib/sparql/algebra/operator/bnode.rb +1 -1
  17. data/lib/sparql/algebra/operator/ceil.rb +1 -1
  18. data/lib/sparql/algebra/operator/compare.rb +39 -33
  19. data/lib/sparql/algebra/operator/construct.rb +2 -1
  20. data/lib/sparql/algebra/operator/contains.rb +1 -1
  21. data/lib/sparql/algebra/operator/count.rb +1 -1
  22. data/lib/sparql/algebra/operator/dataset.rb +1 -1
  23. data/lib/sparql/algebra/operator/datatype.rb +1 -1
  24. data/lib/sparql/algebra/operator/day.rb +1 -1
  25. data/lib/sparql/algebra/operator/delete.rb +2 -2
  26. data/lib/sparql/algebra/operator/delete_where.rb +1 -1
  27. data/lib/sparql/algebra/operator/divide.rb +1 -1
  28. data/lib/sparql/algebra/operator/encode_for_uri.rb +1 -1
  29. data/lib/sparql/algebra/operator/equal.rb +1 -1
  30. data/lib/sparql/algebra/operator/extend.rb +2 -12
  31. data/lib/sparql/algebra/operator/floor.rb +1 -1
  32. data/lib/sparql/algebra/operator/graph.rb +1 -1
  33. data/lib/sparql/algebra/operator/greater_than.rb +3 -2
  34. data/lib/sparql/algebra/operator/greater_than_or_equal.rb +2 -2
  35. data/lib/sparql/algebra/operator/group_concat.rb +1 -1
  36. data/lib/sparql/algebra/operator/hours.rb +1 -1
  37. data/lib/sparql/algebra/operator/insert.rb +1 -1
  38. data/lib/sparql/algebra/operator/iri.rb +1 -1
  39. data/lib/sparql/algebra/operator/is_blank.rb +1 -1
  40. data/lib/sparql/algebra/operator/is_iri.rb +1 -1
  41. data/lib/sparql/algebra/operator/is_literal.rb +1 -1
  42. data/lib/sparql/algebra/operator/is_numeric.rb +1 -1
  43. data/lib/sparql/algebra/operator/is_triple.rb +30 -0
  44. data/lib/sparql/algebra/operator/lang.rb +1 -1
  45. data/lib/sparql/algebra/operator/lang_matches.rb +1 -1
  46. data/lib/sparql/algebra/operator/lcase.rb +1 -1
  47. data/lib/sparql/algebra/operator/left_join.rb +4 -0
  48. data/lib/sparql/algebra/operator/less_than.rb +3 -2
  49. data/lib/sparql/algebra/operator/less_than_or_equal.rb +2 -2
  50. data/lib/sparql/algebra/operator/max.rb +8 -1
  51. data/lib/sparql/algebra/operator/md5.rb +1 -1
  52. data/lib/sparql/algebra/operator/min.rb +8 -1
  53. data/lib/sparql/algebra/operator/minutes.rb +1 -1
  54. data/lib/sparql/algebra/operator/month.rb +1 -1
  55. data/lib/sparql/algebra/operator/multiply.rb +1 -1
  56. data/lib/sparql/algebra/operator/negate.rb +1 -1
  57. data/lib/sparql/algebra/operator/not.rb +1 -1
  58. data/lib/sparql/algebra/operator/not_equal.rb +3 -1
  59. data/lib/sparql/algebra/operator/now.rb +1 -1
  60. data/lib/sparql/algebra/operator/object.rb +27 -0
  61. data/lib/sparql/algebra/operator/order.rb +7 -1
  62. data/lib/sparql/algebra/operator/plus.rb +1 -1
  63. data/lib/sparql/algebra/operator/predicate.rb +27 -0
  64. data/lib/sparql/algebra/operator/rand.rb +1 -1
  65. data/lib/sparql/algebra/operator/regex.rb +1 -1
  66. data/lib/sparql/algebra/operator/replace.rb +1 -1
  67. data/lib/sparql/algebra/operator/round.rb +1 -1
  68. data/lib/sparql/algebra/operator/same_term.rb +1 -1
  69. data/lib/sparql/algebra/operator/sample.rb +9 -2
  70. data/lib/sparql/algebra/operator/seconds.rb +1 -1
  71. data/lib/sparql/algebra/operator/sha1.rb +1 -1
  72. data/lib/sparql/algebra/operator/sha256.rb +1 -1
  73. data/lib/sparql/algebra/operator/sha384.rb +1 -1
  74. data/lib/sparql/algebra/operator/sha512.rb +1 -1
  75. data/lib/sparql/algebra/operator/str.rb +1 -1
  76. data/lib/sparql/algebra/operator/strafter.rb +1 -1
  77. data/lib/sparql/algebra/operator/strbefore.rb +1 -1
  78. data/lib/sparql/algebra/operator/strdt.rb +1 -1
  79. data/lib/sparql/algebra/operator/strends.rb +1 -1
  80. data/lib/sparql/algebra/operator/strlang.rb +1 -1
  81. data/lib/sparql/algebra/operator/strlen.rb +1 -1
  82. data/lib/sparql/algebra/operator/strstarts.rb +1 -1
  83. data/lib/sparql/algebra/operator/struuid.rb +1 -1
  84. data/lib/sparql/algebra/operator/subject.rb +29 -0
  85. data/lib/sparql/algebra/operator/substr.rb +1 -1
  86. data/lib/sparql/algebra/operator/subtract.rb +1 -1
  87. data/lib/sparql/algebra/operator/sum.rb +1 -1
  88. data/lib/sparql/algebra/operator/timezone.rb +1 -1
  89. data/lib/sparql/algebra/operator/triple.rb +27 -0
  90. data/lib/sparql/algebra/operator/tz.rb +1 -1
  91. data/lib/sparql/algebra/operator/ucase.rb +1 -1
  92. data/lib/sparql/algebra/operator/uuid.rb +1 -1
  93. data/lib/sparql/algebra/operator/with.rb +1 -1
  94. data/lib/sparql/algebra/operator/year.rb +1 -1
  95. data/lib/sparql/extensions.rb +6 -12
  96. data/lib/sparql/grammar.rb +2 -28
  97. data/lib/sparql/grammar/meta.rb +5739 -2365
  98. data/lib/sparql/grammar/parser11.rb +119 -59
  99. data/lib/sparql/grammar/terminals11.rb +3 -0
  100. data/lib/sparql/results.rb +17 -9
  101. metadata +31 -42
@@ -23,6 +23,7 @@ module SPARQL::Grammar
23
23
  STRAFTER STRBEFORE STRDT STRENDS STRLANG STRLEN STRSTARTS STRUUID STR
24
24
  TIMEZONE TZ UCASE URI UUID YEAR
25
25
  isBLANK isIRI isURI isLITERAL isNUMERIC sameTerm
26
+ isTRIPLE TRIPLE SUBJECT PREDICATE OBJECT
26
27
  }.map {|s| s.downcase.to_sym}.freeze
27
28
 
28
29
  BUILTIN_RULES = [:aggregate, :regex, :substr, :replace, :exists, :notexists].freeze
@@ -184,6 +185,7 @@ module SPARQL::Grammar
184
185
  |STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|STRUUID|SUBSTR|STR|SUM
185
186
  |TIMEZONE|TZ|UCASE|UNDEF|URI|UUID|YEAR
186
187
  |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
188
+ |isTRIPLE|TRIPLE|SUBJECT|PREDICATE|OBJECT
187
189
  }x
188
190
  add_prod_datum(token.value.downcase.to_sym, token.value.downcase.to_sym)
189
191
  else
@@ -586,7 +588,7 @@ module SPARQL::Grammar
586
588
  production(:GroupGraphPatternSub) do |input, data, callback|
587
589
  debug("GroupGraphPatternSub") {"q #{data[:query].inspect}"}
588
590
 
589
- res = case data[:query].length
591
+ res = case Array(data[:query]).length
590
592
  when 0 then SPARQL::Algebra::Operator::BGP.new
591
593
  when 1 then data[:query].first
592
594
  when 2
@@ -647,7 +649,7 @@ module SPARQL::Grammar
647
649
  data[:input_query] = input.delete(:query) || [SPARQL::Algebra::Operator::BGP.new]
648
650
  end
649
651
  production(:GraphPatternNotTriples) do |input, data, callback|
650
- lhs = data[:input_query].first
652
+ lhs = Array(data[:input_query]).first
651
653
 
652
654
  # Filter trickls up to GroupGraphPatternSub
653
655
  add_prod_datum(:filter, data[:filter])
@@ -701,9 +703,9 @@ module SPARQL::Grammar
701
703
  end
702
704
  end
703
705
 
704
- # [60] Bind ::= 'BIND' '(' (Expression || EmbTP) 'AS' Var ')'
706
+ # [60] Bind ::= 'BIND' '(' Expression 'AS' Var ')'
705
707
  production(:Bind) do |input, data, callback|
706
- add_prod_datum :extend, [(data[:Expression] || data[:pattern]).unshift(data[:Var].first)]
708
+ add_prod_datum :extend, [data[:Expression].unshift(data[:Var].first)]
707
709
  end
708
710
 
709
711
  # [61] InlineData ::= 'VALUES' DataBlock
@@ -752,7 +754,7 @@ module SPARQL::Grammar
752
754
  end
753
755
  end
754
756
 
755
- # [65] DataBlockValue ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF'
757
+ # [65] DataBlockValue ::= EmbTD | iri | RDFLiteral | NumericLiteral | BooleanLiteral | 'UNDEF'
756
758
  production(:DataBlockValue) do |input, data, callback|
757
759
  add_prod_datum :DataBlockValue, data.values.first
758
760
  end
@@ -831,7 +833,7 @@ module SPARQL::Grammar
831
833
  add_prod_datum(:ConstructTemplate, data[:ConstructTemplate])
832
834
  end
833
835
 
834
- # [75] TriplesSameSubject ::= VarOrTerm PropertyListNotEmpty
836
+ # [75] TriplesSameSubject ::= VarOrTermOrEmbTP PropertyListNotEmpty
835
837
  # | TriplesNode PropertyList
836
838
  production(:TriplesSameSubject) do |input, data, callback|
837
839
  add_prod_datum(:pattern, data[:pattern])
@@ -840,8 +842,8 @@ module SPARQL::Grammar
840
842
  # [77] PropertyListNotEmpty ::= Verb ObjectList
841
843
  # ( ';' ( Verb ObjectList )? )*
842
844
  start_production(:PropertyListNotEmpty) do |input, data, callback|
843
- subject = input[:VarOrTerm] || input[:TriplesNode] || input[:GraphNode]
844
- error(nil, "Expected VarOrTerm or TriplesNode or GraphNode", production: :PropertyListNotEmpty) if validate? && !subject
845
+ subject = input[:VarOrTermOrEmbTP] || input[:TriplesNode] || input[:GraphNode]
846
+ error(nil, "Expected VarOrTermOrEmbTP or TriplesNode or GraphNode", production: :PropertyListNotEmpty) if validate? && !subject
845
847
  data[:Subject] = subject
846
848
  end
847
849
  production(:PropertyListNotEmpty) do |input, data, callback|
@@ -867,13 +869,17 @@ module SPARQL::Grammar
867
869
  add_prod_datum(:path, data[:path])
868
870
  end
869
871
 
870
- # [80] Object ::= GraphNode
872
+ # [80] Object ::= GraphNode AnnotationPattern?
873
+ start_production(:Object) do |input, data, callback|
874
+ data[:Subject] = Array(input[:Subject]).first
875
+ data[:Verb] = Array(input[:Verb]).first
876
+ end
871
877
  production(:Object) do |input, data, callback|
872
- object = data[:VarOrTerm] || data[:TriplesNode] || data[:GraphNode]
878
+ object = data[:GraphNode]
879
+ add_prod_datum(:pattern, data[:pattern])
873
880
  if object
874
881
  if prod_data[:Verb]
875
882
  add_pattern(:Object, subject: prod_data[:Subject], predicate: prod_data[:Verb], object: object)
876
- add_prod_datum(:pattern, data[:pattern])
877
883
  elsif prod_data[:VerbPath]
878
884
  add_prod_datum(:path,
879
885
  SPARQL::Algebra::Expression(:path,
@@ -883,8 +889,17 @@ module SPARQL::Grammar
883
889
  end
884
890
  end
885
891
  end
892
+ start_production(:_Object_1) do |input, data, callback|
893
+ pattern = RDF::Query::Pattern.new(input[:Subject], input[:Verb], input[:GraphNode].first)
894
+ error("ObjectPath", "Expected Verb",
895
+ production: :_Object_1) unless input[:Verb]
896
+ data[:TriplesNode] = [pattern]
897
+ end
898
+ production(:_Object_1) do |input, data, callback|
899
+ add_prod_datum(:pattern, data[:pattern])
900
+ end
886
901
 
887
- # [81] TriplesSameSubjectPath ::= VarOrTerm PropertyListPathNotEmpty | TriplesNode PropertyListPath
902
+ # [81] TriplesSameSubjectPath ::= VarOrTermOrEmbTP PropertyListPathNotEmpty | TriplesNode PropertyListPath
888
903
  production(:TriplesSameSubjectPath) do |input, data, callback|
889
904
  add_prod_datum(:pattern, data[:pattern])
890
905
  add_prod_datum(:path, data[:path])
@@ -892,8 +907,8 @@ module SPARQL::Grammar
892
907
 
893
908
  # [83] PropertyListPathNotEmpty ::= ( VerbPath | VerbSimple ) ObjectList ( ';' ( ( VerbPath | VerbSimple ) ObjectList )? )*
894
909
  start_production(:PropertyListPathNotEmpty) do |input, data, callback|
895
- subject = input[:VarOrTerm] || input[:TriplesNode] || input[:GraphNode]
896
- error(nil, "Expected VarOrTerm, got nothing", production: :PropertyListPathNotEmpty) if validate? && !subject
910
+ subject = input[:VarOrTermOrEmbTP] || input[:TriplesNode] || input[:GraphNode]
911
+ error(nil, "Expected VarOrTermOrEmbTP, got nothing", production: :PropertyListPathNotEmpty) if validate? && !subject
897
912
  data[:Subject] = subject
898
913
  end
899
914
  production(:PropertyListPathNotEmpty) do |input, data, callback|
@@ -933,9 +948,13 @@ module SPARQL::Grammar
933
948
  add_prod_datum(:path, data[:path])
934
949
  end
935
950
 
936
- # [87] ObjectPath ::= GraphNodePath
951
+ # [87] ObjectPath ::= GraphNodePath AnnotationPatternPath?
952
+ start_production(:ObjectPath) do |input, data, callback|
953
+ data[:Subject] = Array(input[:Subject]).first
954
+ data[:Verb] = Array(input[:Verb]).first
955
+ end
937
956
  production(:ObjectPath) do |input, data, callback|
938
- object = data[:VarOrTerm] || data[:TriplesNode] || data[:GraphNode]
957
+ object = data[:VarOrTermOrEmbTP] || data[:TriplesNode] || data[:GraphNode]
939
958
  if object
940
959
  if prod_data[:Verb]
941
960
  if data[:pattern] && data[:path]
@@ -943,6 +962,9 @@ module SPARQL::Grammar
943
962
  data[:pattern].unshift(RDF::Query::Pattern.new(prod_data[:Subject].first, prod_data[:Verb], object.first))
944
963
  bgp = SPARQL::Algebra::Expression[:bgp, data[:pattern]]
945
964
  add_prod_datum(:path, SPARQL::Algebra::Expression[:sequence, bgp, *data[:path]])
965
+ elsif data[:path]
966
+ # AnnotationPatternPath case
967
+ add_prod_datum(:path, data[:path])
946
968
  else
947
969
  add_pattern(:Object, subject: prod_data[:Subject], predicate: prod_data[:Verb], object: object)
948
970
  add_prod_datum(:pattern, data[:pattern])
@@ -956,6 +978,16 @@ module SPARQL::Grammar
956
978
  end
957
979
  end
958
980
  end
981
+ start_production(:_ObjectPath_1) do |input, data, callback|
982
+ pattern = RDF::Query::Pattern.new(input[:Subject], input[:Verb], input[:GraphNode].first)
983
+ error("ObjectPath", "Expected Verb",
984
+ production: :_ObjectPath_1) unless input[:Verb]
985
+ data[:TriplesNode] = [pattern]
986
+ end
987
+ production(:_ObjectPath_1) do |input, data, callback|
988
+ add_prod_datum(:pattern, data[:pattern])
989
+ end
990
+
959
991
  # [88] Path ::= PathAlternative
960
992
  # output is a :Path or :iri
961
993
  production(:Path) do |input, data, callback|
@@ -1084,29 +1116,24 @@ module SPARQL::Grammar
1084
1116
  add_prod_datum(:path, data[:path])
1085
1117
  end
1086
1118
 
1087
- # [104] GraphNode ::= VarOrTerm | TriplesNode
1119
+ # [104] GraphNode ::= VarOrTermOrEmbTP | TriplesNode
1088
1120
  production(:GraphNode) do |input, data, callback|
1089
- term = data[:VarOrTerm] || data[:TriplesNode]
1121
+ term = data[:VarOrTermOrEmbTP] || data[:TriplesNode]
1090
1122
  add_prod_datum(:pattern, data[:pattern])
1091
1123
  add_prod_datum(:GraphNode, term)
1092
1124
  end
1093
1125
 
1094
- # [105] GraphNodePath ::= VarOrTerm | TriplesNodePath
1126
+ # [105] GraphNodePath ::= VarOrTermOrEmbTP | TriplesNodePath
1095
1127
  production(:GraphNodePath) do |input, data, callback|
1096
- term = data[:VarOrTerm] || data[:TriplesNode]
1128
+ term = data[:VarOrTermOrEmbTP] || data[:TriplesNode]
1097
1129
  add_prod_datum(:pattern, data[:pattern])
1098
1130
  add_prod_datum(:path, data[:path])
1099
1131
  add_prod_datum(:GraphNode, term)
1100
1132
  end
1101
1133
 
1102
- # [106] VarOrTerm ::= Var | GraphTerm
1103
- production(:VarOrTerm) do |input, data, callback|
1104
- data.values.each {|v| add_prod_datum(:VarOrTerm, v)}
1105
- end
1106
-
1107
1134
  # [106s] VarOrTermOrEmbTP ::= Var | GraphTerm | EmbTP
1108
1135
  production(:VarOrTermOrEmbTP) do |input, data, callback|
1109
- data.values.each {|v| add_prod_datum(:VarOrTerm, v)}
1136
+ data.values.each {|v| add_prod_datum(:VarOrTermOrEmbTP, v)}
1110
1137
  end
1111
1138
 
1112
1139
  # [107] VarOrIri ::= Var | iri
@@ -1114,11 +1141,6 @@ module SPARQL::Grammar
1114
1141
  data.values.each {|v| add_prod_datum(:VarOrIri, v)}
1115
1142
  end
1116
1143
 
1117
- # [107s] VarOrBlankNodeOrIriOrEmbTP ::= Var | BlankNode| iri | EmbTP
1118
- production(:VarOrBlankNodeOrIriOrEmbTP) do |input, data, callback|
1119
- data.values.each {|v| add_prod_datum(:VarOrBlankNodeOrIriOrEmbTP, v)}
1120
- end
1121
-
1122
1144
  # [109] GraphTerm ::= iri | RDFLiteral | NumericLiteral
1123
1145
  # | BooleanLiteral | BlankNode | NIL
1124
1146
  production(:GraphTerm) do |input, data, callback|
@@ -1129,17 +1151,22 @@ module SPARQL::Grammar
1129
1151
  data[:NIL])
1130
1152
  end
1131
1153
 
1132
- # [1xx] EmbTP ::= '<<' VarOrBlankNodeOrIriOrEmbTP Verb VarOrTermOrEmbTP '>>'
1154
+ # [174] EmbTP ::= '<<' EmbSubjectOrObject Verb EmbSubjectOrObject '>>'
1133
1155
  production(:EmbTP) do |input, data, callback|
1134
- subject = data[:VarOrBlankNodeOrIriOrEmbTP]
1156
+ subject, object = data[:EmbSubjectOrObject]
1135
1157
  predicate = data[:Verb]
1136
- object = data[:VarOrTerm]
1137
1158
  add_pattern(:EmbTP,
1138
1159
  subject: subject,
1139
1160
  predicate: predicate,
1140
1161
  object: object)
1141
1162
  end
1142
1163
 
1164
+ # [175] EmbSubjectOrObject ::= Var | BlankNode | iri | RDFLiteral
1165
+ # | NumericLiteral | BooleanLiteral | EmbTP
1166
+ production(:EmbSubjectOrObject) do |input, data, callback|
1167
+ data.values.each {|v| add_prod_datum(:EmbSubjectOrObject, v)}
1168
+ end
1169
+
1143
1170
  # [110] Expression ::= ConditionalOrExpression
1144
1171
  production(:Expression) do |input, data, callback|
1145
1172
  add_prod_datum(:Expression, data[:Expression])
@@ -1279,6 +1306,7 @@ module SPARQL::Grammar
1279
1306
  # | iriOrFunction | RDFLiteral
1280
1307
  # | NumericLiteral | BooleanLiteral
1281
1308
  # | Var
1309
+ # | ExprEmbTP
1282
1310
  production(:PrimaryExpression) do |input, data, callback|
1283
1311
  if data[:Expression]
1284
1312
  add_prod_datum(:Expression, data[:Expression])
@@ -1292,12 +1320,29 @@ module SPARQL::Grammar
1292
1320
  add_prod_datum(:Expression, data[:literal])
1293
1321
  elsif data[:Var]
1294
1322
  add_prod_datum(:Expression, data[:Var])
1323
+ elsif data[:pattern]
1324
+ add_prod_datum(:Expression, data[:pattern])
1295
1325
  end
1296
1326
 
1297
1327
  # Keep track of this for parent UnaryExpression production
1298
1328
  add_prod_datum(:UnaryExpression, data[:UnaryExpression])
1299
1329
  end
1300
1330
 
1331
+ # [119a] ExprEmbTP ::= '<<' ExprVarOrTerm Verb ExprVarOrTerm '>>'
1332
+ production(:ExprEmbTP) do |input, data, callback|
1333
+ subject, object = data[:ExprVarOrTerm]
1334
+ predicate = data[:Verb]
1335
+ add_pattern(:ExprEmbTP,
1336
+ subject: subject,
1337
+ predicate: predicate,
1338
+ object: object)
1339
+ end
1340
+
1341
+ # [119b] ExprVarOrTerm ::= iri | RDFLiteral | NumericLiteral | BooleanLiteral | Var | ExprEmbTP
1342
+ production(:ExprVarOrTerm) do |input, data, callback|
1343
+ data.values.each {|v| add_prod_datum(:ExprVarOrTerm, v)}
1344
+ end
1345
+
1301
1346
  # [121] BuiltInCall ::= Aggregate
1302
1347
  # | 'STR' '(' Expression ')'
1303
1348
  # | 'LANG' '(' Expression ')'
@@ -1462,6 +1507,43 @@ module SPARQL::Grammar
1462
1507
  add_prod_datum(:UnaryExpression, data[:UnaryExpression])
1463
1508
  end
1464
1509
 
1510
+ # [177] AnnotationPattern ::= '{|' PropertyListNotEmpty '|}'
1511
+ #start_production(:AnnotationPattern) do |input, data, callback|
1512
+ # data[:TriplesNode] = prod_data[:TriplesNode].first
1513
+ #end
1514
+ #production(:AnnotationPattern) do |input, data, callback|
1515
+ # add_prod_datum(:pattern, data[:pattern])
1516
+ #end
1517
+
1518
+ # [178] AnnotationPatternPath ::= '{|' PropertyListPathNotEmpty '|}'
1519
+ start_production(:AnnotationPatternPath) do |input, data, callback|
1520
+ data[:TriplesNode] = input[:TriplesNode]
1521
+ end
1522
+ production(:AnnotationPatternPath) do |input, data, callback|
1523
+ if data[:pattern]
1524
+ add_prod_datum(:pattern, data[:pattern])
1525
+ elsif data[:path]
1526
+ # Replace the subject in the path with the node being annotated.
1527
+ data[:path].first.operands[0] = data[:TriplesNode]
1528
+ add_prod_datum(:path, data[:path])
1529
+ end
1530
+ end
1531
+
1532
+ # [179] EmbTD ::= '<<' DataValueTerm ( iri | 'a' ) DataValueTerm '>>'
1533
+ production(:EmbTD) do |input, data, callback|
1534
+ subject, object = data[:DataValueTerm]
1535
+ predicate = data[:iri]
1536
+ add_pattern(:EmbTD,
1537
+ subject: subject,
1538
+ predicate: predicate,
1539
+ object: object)
1540
+ end
1541
+
1542
+ # [180] DataValueTerm ::= EmbTD | iri | RDFLiteral | NumericLiteral | BooleanLiteral
1543
+ production(:DataValueTerm) do |input, data, callback|
1544
+ add_prod_datum :DataValueTerm, data.values.first
1545
+ end
1546
+
1465
1547
  ##
1466
1548
  # Initializes a new parser instance.
1467
1549
  #
@@ -1479,10 +1561,8 @@ module SPARQL::Grammar
1479
1561
  # definitions.
1480
1562
  # @option options [Boolean] :validate (false)
1481
1563
  # whether to validate the parsed statements and values
1482
- # @option options [Boolean] :progress
1483
- # Show progress of parser productions
1484
- # @option options [Boolean] :debug
1485
- # Detailed debug output
1564
+ # @option options [Logger, #write, #<<] :logger
1565
+ # Record error/info/debug output
1486
1566
  # @yield [parser] `self`
1487
1567
  # @yieldparam [SPARQL::Grammar::Parser] parser
1488
1568
  # @yieldreturn [void] ignored
@@ -1494,10 +1574,6 @@ module SPARQL::Grammar
1494
1574
  end
1495
1575
  @input.encode!(Encoding::UTF_8) if @input.respond_to?(:encode!)
1496
1576
  @options = {anon_base: "b0", validate: false}.merge(options)
1497
- @options[:debug] ||= case
1498
- when options[:progress] then 2
1499
- when options[:validate] then 1
1500
- end
1501
1577
 
1502
1578
  debug("base IRI") {base_uri.inspect}
1503
1579
  debug("validate") {validate?.inspect}
@@ -1558,23 +1634,7 @@ module SPARQL::Grammar
1558
1634
  follow: FOLLOW,
1559
1635
  whitespace: WS,
1560
1636
  **@options
1561
- ) do |context, *data|
1562
- case context
1563
- when :trace
1564
- level, lineno, depth, *args = data
1565
- message = args.to_sse
1566
- d_str = depth > 100 ? ' ' * 100 + '+' : ' ' * depth
1567
- str = "[#{lineno}](#{level})#{d_str}#{message}".chop
1568
- case @options[:debug]
1569
- when Array
1570
- @options[:debug] << str unless level > 2
1571
- when TrueClass
1572
- $stderr.puts str
1573
- when Integer
1574
- $stderr.puts(str) if level <= @options[:debug]
1575
- end
1576
- end
1577
- end
1637
+ )
1578
1638
 
1579
1639
  # The last thing on the @prod_data stack is the result
1580
1640
  @result = case
@@ -108,9 +108,11 @@ module SPARQL::Grammar
108
108
  |TIMEZONE|TO|TZ|UCASE|UNDEF|UNION|URI|USING|UUID|VALUES
109
109
  |WHERE|WITH|YEAR
110
110
  |isBLANK|isIRI|isURI|isLITERAL|isNUMERIC|sameTerm
111
+ |isTRIPLE|TRIPLE|SUBJECT|PREDICATE|OBJECT
111
112
  |true
112
113
  |false
113
114
  |<<|>>
115
+ |\{\||\|\}
114
116
  |&&|!=|!|<=|>=|\^\^|\|\||[\(\),.;\[\]\{\}\+\-=<>\?\^\|\*\/a]
115
117
  )xim.freeze
116
118
 
@@ -132,6 +134,7 @@ module SPARQL::Grammar
132
134
  TIMEZONE TO TZ UCASE UNDEF UNION URI USING UUID
133
135
  VALUES WHERE WITH YEAR
134
136
  isBLANK isIRI isURI isLITERAL isNUMERIC sameTerm
137
+ isTRIPLE TRIPLE SUBJECT PREDICATE OBJECT
135
138
  true false
136
139
  } + [
137
140
  "DELETE DATA",
@@ -34,9 +34,9 @@ module SPARQL
34
34
  {
35
35
  type: 'triple',
36
36
  value: {
37
- s: format.call(value.subject),
38
- p: format.call(value.predicate),
39
- o: format.call(value.object)
37
+ subject: format.call(value.subject),
38
+ predicate: format.call(value.predicate),
39
+ object: format.call(value.object)
40
40
  }
41
41
  }
42
42
  end
@@ -81,9 +81,9 @@ module SPARQL
81
81
  end
82
82
  when RDF::Statement
83
83
  xml.triple do
84
- xml.s {format.call(s.subject)}
85
- xml.p {format.call(s.predicate)}
86
- xml.o {format.call(s.object)}
84
+ xml.subject {format.call(s.subject)}
85
+ xml.predicate {format.call(s.predicate)}
86
+ xml.object {format.call(s.object)}
87
87
  end
88
88
  end
89
89
  end
@@ -140,9 +140,8 @@ module SPARQL
140
140
  # Generate Solutions as CSV
141
141
  # @return [String]
142
142
  # @see https://www.w3.org/TR/2013/REC-sparql11-results-csv-tsv-20130321/
143
- def to_csv
143
+ def to_csv(bnode_map: {})
144
144
  require 'csv' unless defined?(::CSV)
145
- bnode_map = {}
146
145
  bnode_gen = "_:a"
147
146
  CSV.generate(row_sep: "\r\n") do |csv|
148
147
  csv << variable_names.to_a
@@ -155,6 +154,10 @@ module SPARQL
155
154
  bnode_gen = bnode_gen.succ
156
155
  this
157
156
  end
157
+ when RDF::Statement
158
+ RDF::Query::Solutions(
159
+ RDF::Query::Solution.new(subject: term.subject, predicate: term.predicate, object: term.object)
160
+ ).to_csv(bnode_map: bnode_map).split.last.strip
158
161
  else
159
162
  solution[n].to_s.strip
160
163
  end
@@ -175,10 +178,15 @@ module SPARQL
175
178
  case term = solution[n]
176
179
  when RDF::Literal::Integer, RDF::Literal::Decimal, RDF::Literal::Double
177
180
  term.canonicalize.to_s
181
+ when RDF::Statement
182
+ emb_stmt = RDF::Query::Solutions(
183
+ RDF::Query::Solution.new(subject: term.subject, predicate: term.predicate, object: term.object)
184
+ ).to_tsv.split("\n").last.strip
185
+ emb_stmt.gsub(/[\t\n\r]/, "\t" => '\t', "\n" => '\n', "\r" => '\r')
178
186
  when nil
179
187
  ""
180
188
  else
181
- RDF::NTriples.serialize(term).strip
189
+ RDF::NTriples.serialize(term).strip.gsub(/[\t\n\r]/, "\t" => '\t', "\n" => '\n', "\r" => '\r')
182
190
  end
183
191
  end.join("\t")
184
192
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparql
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
4
+ version: 3.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
8
8
  - Arto Bendiken
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-06-16 00:00:00.000000000 Z
12
+ date: 2021-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdf
@@ -20,7 +20,7 @@ dependencies:
20
20
  version: '3.1'
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 3.1.2
23
+ version: 3.1.14
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,7 +30,7 @@ dependencies:
30
30
  version: '3.1'
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.1.2
33
+ version: 3.1.14
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: rdf-aggregate-repo
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -49,16 +49,16 @@ dependencies:
49
49
  name: ebnf
50
50
  requirement: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.1'
54
+ version: '2.1'
55
55
  type: :runtime
56
56
  prerelease: false
57
57
  version_requirements: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.1'
61
+ version: '2.1'
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: builder
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,9 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3.1'
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 3.1.2
97
100
  type: :runtime
98
101
  prerelease: false
99
102
  version_requirements: !ruby/object:Gem::Requirement
@@ -101,6 +104,9 @@ dependencies:
101
104
  - - "~>"
102
105
  - !ruby/object:Gem::Version
103
106
  version: '3.1'
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 3.1.2
104
110
  - !ruby/object:Gem::Dependency
105
111
  name: rdf-xsd
106
112
  requirement: !ruby/object:Gem::Requirement
@@ -177,48 +183,28 @@ dependencies:
177
183
  requirements:
178
184
  - - "~>"
179
185
  - !ruby/object:Gem::Version
180
- version: '3.0'
181
- type: :development
182
- prerelease: false
183
- version_requirements: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - "~>"
186
- - !ruby/object:Gem::Version
187
- version: '3.0'
188
- - !ruby/object:Gem::Dependency
189
- name: open-uri-cached
190
- requirement: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - "~>"
193
- - !ruby/object:Gem::Version
194
- version: '0.0'
195
- - - ">="
196
- - !ruby/object:Gem::Version
197
- version: 0.0.5
186
+ version: '3.1'
198
187
  type: :development
199
188
  prerelease: false
200
189
  version_requirements: !ruby/object:Gem::Requirement
201
190
  requirements:
202
191
  - - "~>"
203
192
  - !ruby/object:Gem::Version
204
- version: '0.0'
205
- - - ">="
206
- - !ruby/object:Gem::Version
207
- version: 0.0.5
193
+ version: '3.1'
208
194
  - !ruby/object:Gem::Dependency
209
195
  name: rspec
210
196
  requirement: !ruby/object:Gem::Requirement
211
197
  requirements:
212
198
  - - "~>"
213
199
  - !ruby/object:Gem::Version
214
- version: '3.9'
200
+ version: '3.10'
215
201
  type: :development
216
202
  prerelease: false
217
203
  version_requirements: !ruby/object:Gem::Requirement
218
204
  requirements:
219
205
  - - "~>"
220
206
  - !ruby/object:Gem::Version
221
- version: '3.9'
207
+ version: '3.10'
222
208
  - !ruby/object:Gem::Dependency
223
209
  name: rspec-its
224
210
  requirement: !ruby/object:Gem::Requirement
@@ -239,18 +225,16 @@ dependencies:
239
225
  requirements:
240
226
  - - "~>"
241
227
  - !ruby/object:Gem::Version
242
- version: 0.9.20
228
+ version: '0.9'
243
229
  type: :development
244
230
  prerelease: false
245
231
  version_requirements: !ruby/object:Gem::Requirement
246
232
  requirements:
247
233
  - - "~>"
248
234
  - !ruby/object:Gem::Version
249
- version: 0.9.20
250
- description: |2-
251
-
252
- Implements SPARQL grammar parsing to SPARQL Algebra, SPARQL Algebra processing
253
- and includes SPARQL Client for accessing remote repositories.
235
+ version: '0.9'
236
+ description: SPARQL Implements SPARQL 1.1 Query, Update and result formats for the
237
+ Ruby RDF.rb library suite.
254
238
  email: public-rdf-ruby@w3.org
255
239
  executables:
256
240
  - sparql
@@ -328,6 +312,7 @@ files:
328
312
  - lib/sparql/algebra/operator/is_iri.rb
329
313
  - lib/sparql/algebra/operator/is_literal.rb
330
314
  - lib/sparql/algebra/operator/is_numeric.rb
315
+ - lib/sparql/algebra/operator/is_triple.rb
331
316
  - lib/sparql/algebra/operator/join.rb
332
317
  - lib/sparql/algebra/operator/lang.rb
333
318
  - lib/sparql/algebra/operator/lang_matches.rb
@@ -352,6 +337,7 @@ files:
352
337
  - lib/sparql/algebra/operator/notin.rb
353
338
  - lib/sparql/algebra/operator/notoneof.rb
354
339
  - lib/sparql/algebra/operator/now.rb
340
+ - lib/sparql/algebra/operator/object.rb
355
341
  - lib/sparql/algebra/operator/or.rb
356
342
  - lib/sparql/algebra/operator/order.rb
357
343
  - lib/sparql/algebra/operator/path.rb
@@ -359,6 +345,7 @@ files:
359
345
  - lib/sparql/algebra/operator/path_plus.rb
360
346
  - lib/sparql/algebra/operator/path_star.rb
361
347
  - lib/sparql/algebra/operator/plus.rb
348
+ - lib/sparql/algebra/operator/predicate.rb
362
349
  - lib/sparql/algebra/operator/prefix.rb
363
350
  - lib/sparql/algebra/operator/project.rb
364
351
  - lib/sparql/algebra/operator/rand.rb
@@ -386,11 +373,13 @@ files:
386
373
  - lib/sparql/algebra/operator/strlen.rb
387
374
  - lib/sparql/algebra/operator/strstarts.rb
388
375
  - lib/sparql/algebra/operator/struuid.rb
376
+ - lib/sparql/algebra/operator/subject.rb
389
377
  - lib/sparql/algebra/operator/substr.rb
390
378
  - lib/sparql/algebra/operator/subtract.rb
391
379
  - lib/sparql/algebra/operator/sum.rb
392
380
  - lib/sparql/algebra/operator/table.rb
393
381
  - lib/sparql/algebra/operator/timezone.rb
382
+ - lib/sparql/algebra/operator/triple.rb
394
383
  - lib/sparql/algebra/operator/tz.rb
395
384
  - lib/sparql/algebra/operator/ucase.rb
396
385
  - lib/sparql/algebra/operator/union.rb
@@ -414,7 +403,7 @@ homepage: https://github.com/ruby-rdf/sparql
414
403
  licenses:
415
404
  - Unlicense
416
405
  metadata: {}
417
- post_install_message:
406
+ post_install_message:
418
407
  rdoc_options: []
419
408
  require_paths:
420
409
  - lib
@@ -429,8 +418,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
429
418
  - !ruby/object:Gem::Version
430
419
  version: '0'
431
420
  requirements: []
432
- rubygems_version: 3.1.3
433
- signing_key:
421
+ rubygems_version: 3.2.15
422
+ signing_key:
434
423
  specification_version: 4
435
424
  summary: SPARQL Query and Update library for Ruby.
436
425
  test_files: []