tripod 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +1 -0
- data/.rspec +1 -0
- data/Gemfile +2 -1
- data/README.md +27 -16
- data/lib/tripod/criteria/execution.rb +100 -0
- data/lib/tripod/criteria.rb +56 -0
- data/lib/tripod/errors/bad_data_request.rb +15 -0
- data/lib/tripod/errors/bad_sparql_request.rb +15 -0
- data/lib/tripod/errors/rdf_parse_failed.rb +7 -0
- data/lib/tripod/errors/rdf_type_not_set.rb +9 -0
- data/lib/tripod/errors.rb +6 -1
- data/lib/tripod/finders.rb +21 -76
- data/lib/tripod/persistence.rb +4 -4
- data/lib/tripod/resource.rb +3 -1
- data/lib/tripod/sparql_client.rb +45 -13
- data/lib/tripod/sparql_query.rb +86 -0
- data/lib/tripod/version.rb +1 -1
- data/lib/tripod.rb +5 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/tripod/criteria_execution_spec.rb +118 -0
- data/spec/tripod/criteria_spec.rb +65 -0
- data/spec/tripod/finders_spec.rb +66 -46
- data/spec/tripod/resource_spec.rb +4 -2
- data/spec/tripod/sparql_client_spec.rb +46 -0
- data/spec/tripod/sparql_query_spec.rb +133 -0
- metadata +37 -20
data/spec/spec_helper.rb
CHANGED
@@ -6,11 +6,13 @@ $LOAD_PATH.unshift(MODELS)
|
|
6
6
|
|
7
7
|
require 'tripod'
|
8
8
|
require 'rspec'
|
9
|
+
require 'webmock/rspec'
|
9
10
|
|
10
11
|
RSpec.configure do |config|
|
11
12
|
config.mock_with :rspec
|
12
13
|
|
13
14
|
config.before(:each) do
|
15
|
+
WebMock.disable!
|
14
16
|
# delete from all graphs.
|
15
17
|
Tripod::SparqlClient::Update.update('
|
16
18
|
# delete from default graph:
|
@@ -26,6 +28,7 @@ end
|
|
26
28
|
Tripod.configure do |config|
|
27
29
|
config.update_endpoint = 'http://127.0.0.1:3030/tripod-test/update'
|
28
30
|
config.query_endpoint = 'http://127.0.0.1:3030/tripod-test/sparql'
|
31
|
+
config.data_endpoint = 'http://127.0.0.1:3030/tripod-test/data'
|
29
32
|
end
|
30
33
|
|
31
34
|
# Autoload every model for the test suite that sits in spec/app/models.
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::Criteria do
|
4
|
+
|
5
|
+
let(:person_criteria) do
|
6
|
+
c = Tripod::Criteria.new(Person)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:resource_criteria) do
|
10
|
+
c = Tripod::Criteria.new(Resource)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:john) do
|
14
|
+
p = Person.new('http://john', 'http://people')
|
15
|
+
p.name = "John"
|
16
|
+
p
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:barry) do
|
20
|
+
p = Person.new('http://barry', 'http://people')
|
21
|
+
p.name = "Barry"
|
22
|
+
p
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#build_select_query" do
|
26
|
+
|
27
|
+
context "for a class with an rdf_type" do
|
28
|
+
it "should return a SELECT query based with an rdf type restriction" do
|
29
|
+
person_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri a <http://person> } }"
|
30
|
+
end
|
31
|
+
|
32
|
+
context "and extra restrictions" do
|
33
|
+
before { person_criteria.where("[pattern]") }
|
34
|
+
|
35
|
+
it "should return a SELECT query with the extra restriction and rdf type restriction" do
|
36
|
+
person_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri a <http://person> . [pattern] } }"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "for a class without an rdf_type" do
|
42
|
+
it "should return a SELECT query without an rdf_type restriction" do
|
43
|
+
resource_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri ?p ?o } }"
|
44
|
+
end
|
45
|
+
|
46
|
+
context "and extra restrictions" do
|
47
|
+
before { resource_criteria.where("[pattern]") }
|
48
|
+
|
49
|
+
it "should return a SELECT query with the extra restrictions" do
|
50
|
+
resource_criteria.send(:build_select_query).should == "SELECT ?uri ?graph WHERE { GRAPH ?graph { ?uri ?p ?o . [pattern] } }"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#resources" do
|
57
|
+
|
58
|
+
before do
|
59
|
+
john.save!
|
60
|
+
barry.save!
|
61
|
+
end
|
62
|
+
|
63
|
+
context "with no extra restrictions" do
|
64
|
+
it "should return a set of hydrated objects for the type" do
|
65
|
+
person_criteria.resources.should == [john, barry]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "with extra restrictions" do
|
70
|
+
|
71
|
+
before { person_criteria.where("?uri <http://name> 'John'") }
|
72
|
+
|
73
|
+
it "should return a set of hydrated objects for the type and restrictions" do
|
74
|
+
person_criteria.resources.should == [john]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#first" do
|
81
|
+
|
82
|
+
before do
|
83
|
+
john.save!
|
84
|
+
barry.save!
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should return the first resource for the criteria" do
|
88
|
+
person_criteria.first.should == john
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should call Query.select with the 'first sparql'" do
|
92
|
+
sparql = Tripod::SparqlQuery.new(person_criteria.send(:build_select_query)).as_first_query_str
|
93
|
+
Tripod::SparqlClient::Query.should_receive(:select).with(sparql).and_call_original
|
94
|
+
person_criteria.first
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#count" do
|
99
|
+
|
100
|
+
before do
|
101
|
+
john.save!
|
102
|
+
barry.save!
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return a set of hydrated objects for the criteria" do
|
106
|
+
person_criteria.count.should == 2
|
107
|
+
person_criteria.where("?uri <http://name> 'John'").count.should ==1
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should call Query.select with the 'count sparql'" do
|
111
|
+
sparql = Tripod::SparqlQuery.new(person_criteria.send(:build_select_query)).as_count_query_str
|
112
|
+
Tripod::SparqlClient::Query.should_receive(:select).with(sparql).and_call_original
|
113
|
+
person_criteria.count
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::Criteria do
|
4
|
+
|
5
|
+
let(:person_criteria) { Tripod::Criteria.new(Person) }
|
6
|
+
|
7
|
+
let(:resource_criteria) { Tripod::Criteria.new(Resource) }
|
8
|
+
|
9
|
+
describe "#initialize" do
|
10
|
+
|
11
|
+
it "should set the resource class accessor" do
|
12
|
+
person_criteria.resource_class.should == Person
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should initialize the extra clauses to a blank array" do
|
16
|
+
person_criteria.extra_clauses.should == []
|
17
|
+
end
|
18
|
+
|
19
|
+
context "with rdf_type set on the class" do
|
20
|
+
it "should initialize the where clauses to include a type restriction" do
|
21
|
+
person_criteria.where_clauses.should == ["?uri a <http://person>"]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "with no rdf_type set on the class" do
|
26
|
+
it "should initialize the where clauses to ?uri ?p ?o" do
|
27
|
+
resource_criteria.where_clauses.should == ["?uri ?p ?o"]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#where" do
|
33
|
+
|
34
|
+
it "should add the sparql snippet to the where clauses" do
|
35
|
+
resource_criteria.where("blah")
|
36
|
+
resource_criteria.where_clauses.should == ["?uri ?p ?o", "blah"]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return an instance of Criteria" do
|
40
|
+
resource_criteria.where("blah").class == Tripod::Criteria
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should return an instance of Criteria with the where clauses added" do
|
44
|
+
resource_criteria.where("blah").where_clauses.should == ["?uri ?p ?o", "blah"]
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#extras" do
|
50
|
+
|
51
|
+
it "should add the sparql snippet to the extra clauses" do
|
52
|
+
resource_criteria.extras("bleh")
|
53
|
+
resource_criteria.extra_clauses.should == ["bleh"]
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return an instance of Criteria" do
|
57
|
+
resource_criteria.extras("bleh").class == Tripod::Criteria
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return an instance of Criteria with the extra clauses added" do
|
61
|
+
resource_criteria.extras("bleh").extra_clauses.should == ["bleh"]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
data/spec/tripod/finders_spec.rb
CHANGED
@@ -3,43 +3,25 @@ require "spec_helper"
|
|
3
3
|
describe Tripod::Finders do
|
4
4
|
|
5
5
|
let(:ric) do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
stmt = RDF::Statement.new
|
10
|
-
stmt.subject = RDF::URI.new(@ric_uri)
|
11
|
-
stmt.predicate = RDF::URI.new('http://name')
|
12
|
-
stmt.object = "ric"
|
13
|
-
stmts << stmt
|
14
|
-
|
15
|
-
stmt = RDF::Statement.new
|
16
|
-
stmt.subject = RDF::URI.new(@ric_uri)
|
17
|
-
stmt.predicate = RDF::URI.new('http://knows')
|
18
|
-
stmt.object = RDF::URI.new('http://bill')
|
19
|
-
stmts << stmt
|
20
|
-
|
21
|
-
r = Person.new(@ric_uri)
|
22
|
-
r.hydrate!(:graph => stmts)
|
23
|
-
r.save
|
6
|
+
r = Person.new('http://example.com/people/id/ric')
|
7
|
+
r.name = "ric"
|
8
|
+
r.knows = RDF::URI.new("http://bill")
|
24
9
|
r
|
25
10
|
end
|
26
11
|
|
27
12
|
let(:bill) do
|
28
|
-
|
29
|
-
|
30
|
-
stmt = RDF::Statement.new
|
31
|
-
stmt.subject = RDF::URI.new(@bill_uri)
|
32
|
-
stmt.predicate = RDF::URI.new('http://name')
|
33
|
-
stmt.object = "bill"
|
34
|
-
stmts << stmt
|
35
|
-
b = Person.new(@bill_uri)
|
36
|
-
b.hydrate!(:graph => stmts)
|
37
|
-
b.save
|
13
|
+
b = Person.new('http://example.com/people/id/bill')
|
14
|
+
b.name = "bill"
|
38
15
|
b
|
39
16
|
end
|
40
17
|
|
41
18
|
describe '.find' do
|
42
19
|
|
20
|
+
before do
|
21
|
+
ric.save!
|
22
|
+
bill.save!
|
23
|
+
end
|
24
|
+
|
43
25
|
context 'when record exists' do
|
44
26
|
let(:person) { Person.find(ric.uri) }
|
45
27
|
|
@@ -65,39 +47,77 @@ describe Tripod::Finders do
|
|
65
47
|
end
|
66
48
|
end
|
67
49
|
|
68
|
-
context 'with
|
50
|
+
context 'with graph_uri supplied' do
|
51
|
+
it 'should use that graph to call new' do
|
52
|
+
ric # trigger the lazy load
|
53
|
+
Person.should_receive(:new).with(ric.uri, 'http://graphx').and_call_original
|
54
|
+
Person.find(ric.uri, "http://graphx")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'with no graph_uri supplied' do
|
59
|
+
it 'should look up the graph to call new' do
|
60
|
+
ric # trigger the lazy load
|
61
|
+
Person.should_receive(:new).with(ric.uri, Person._GRAPH_URI).and_call_original
|
62
|
+
Person.find(ric.uri, Person._GRAPH_URI)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
69
66
|
|
67
|
+
describe ".all" do
|
68
|
+
it "should make and return a new criteria for the current class" do
|
69
|
+
Person.all.should == Tripod::Criteria.new(Person)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
describe
|
73
|
+
describe ".where" do
|
74
|
+
|
75
|
+
let(:criteria) { Person.where("[pattern]") }
|
74
76
|
|
77
|
+
it "should make and return a criteria for the current class" do
|
78
|
+
criteria.class.should == Tripod::Criteria
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should apply the where clause" do
|
82
|
+
criteria.where_clauses.should include("[pattern]")
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "count" do
|
75
88
|
before do
|
76
|
-
|
77
|
-
bill
|
78
|
-
ric
|
89
|
+
ric.save!
|
90
|
+
bill.save!
|
79
91
|
end
|
80
92
|
|
81
|
-
it
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
93
|
+
it "should just call count on the all criteria" do
|
94
|
+
all_crit = Tripod::Criteria.new(Person)
|
95
|
+
Person.should_receive(:all).and_return(all_crit)
|
96
|
+
all_crit.should_receive(:count).and_call_original
|
97
|
+
Person.count
|
98
|
+
end
|
86
99
|
|
87
|
-
|
88
|
-
|
100
|
+
it 'should return the count of all resources of this type' do
|
101
|
+
Person.count.should == 2
|
89
102
|
end
|
103
|
+
end
|
90
104
|
|
91
|
-
|
92
|
-
|
93
|
-
|
105
|
+
describe "first" do
|
106
|
+
before do
|
107
|
+
ric.save!
|
108
|
+
bill.save!
|
94
109
|
end
|
95
110
|
|
96
|
-
it "
|
97
|
-
|
98
|
-
|
111
|
+
it "should just call count on the all criteria" do
|
112
|
+
all_crit = Tripod::Criteria.new(Person)
|
113
|
+
Person.should_receive(:all).and_return(all_crit)
|
114
|
+
all_crit.should_receive(:first).and_call_original
|
115
|
+
Person.first
|
99
116
|
end
|
100
117
|
|
118
|
+
it 'should return the first resources of this type' do
|
119
|
+
Person.first.should == ric
|
120
|
+
end
|
101
121
|
end
|
102
122
|
|
103
123
|
end
|
@@ -21,8 +21,10 @@ describe Tripod::Resource do
|
|
21
21
|
person.graph_uri.should == RDF::URI.new('http://graph')
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
context "with rdf_type specified at class level" do
|
25
|
+
it "sets the rdf type from the class" do
|
26
|
+
person.rdf_type.to_s.should == 'http://person'
|
27
|
+
end
|
26
28
|
end
|
27
29
|
|
28
30
|
it "initialises a repo" do
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::SparqlClient do
|
4
|
+
describe Data do
|
5
|
+
let(:data) { 'some-data-goes-here' }
|
6
|
+
|
7
|
+
describe "Data#append" do
|
8
|
+
it "should add the graph uri to the configured data endpoint" do
|
9
|
+
RestClient::Request.should_receive(:execute).with(hash_including(url: 'http://127.0.0.1:3030/tripod-test/data?graph=http://foo'))
|
10
|
+
Tripod::SparqlClient::Data.append('http://foo', data)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should send the data as the payload" do
|
14
|
+
RestClient::Request.should_receive(:execute).with(hash_including(payload: data))
|
15
|
+
Tripod::SparqlClient::Data.append('http://foo', data)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should HTTP POST the data" do
|
19
|
+
RestClient::Request.should_receive(:execute).with(hash_including(method: :post))
|
20
|
+
Tripod::SparqlClient::Data.append('http://foo', data)
|
21
|
+
end
|
22
|
+
|
23
|
+
context "which fails with a 400 error" do
|
24
|
+
before do
|
25
|
+
WebMock.enable!
|
26
|
+
stub_http_request(:post, 'http://127.0.0.1:3030/tripod-test/data?graph=http://foo').to_return(body: 'Error 400: Trousers missing', status: 400)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should raise a 'parse failed' exception" do
|
30
|
+
lambda { Tripod::SparqlClient::Data.append('http://foo', data) }.should raise_error(Tripod::Errors::BadDataRequest)
|
31
|
+
end
|
32
|
+
|
33
|
+
after do
|
34
|
+
WebMock.disable!
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "Data#replace" do
|
40
|
+
it "should HTTP PUT the data" do
|
41
|
+
RestClient::Request.should_receive(:execute).with(hash_including(method: :put))
|
42
|
+
Tripod::SparqlClient::Data.replace('http://foo', data)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Tripod::SparqlQuery do
|
4
|
+
|
5
|
+
describe '#initialize' do
|
6
|
+
context 'given a query without prefixes' do
|
7
|
+
it 'should assign the given query to the body attribute' do
|
8
|
+
q = Tripod::SparqlQuery.new('SELECT xyz')
|
9
|
+
q.body.should == 'SELECT xyz'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'given a query with prefixes' do
|
14
|
+
it 'should separate the query into prefixes and body' do
|
15
|
+
q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT xyz')
|
16
|
+
q.prefixes.should == 'PREFIX e: <http://example.com>'
|
17
|
+
q.body.should == 'SELECT xyz'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#has_prefixes?" do
|
23
|
+
|
24
|
+
context "for a query with prefixes" do
|
25
|
+
it "should return true" do
|
26
|
+
q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT xyz')
|
27
|
+
q.has_prefixes?.should be_true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "for a query without prefixes" do
|
32
|
+
it "should return false" do
|
33
|
+
q = Tripod::SparqlQuery.new('SELECT xyz')
|
34
|
+
q.has_prefixes?.should be_false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#query_type" do
|
41
|
+
|
42
|
+
it 'should return :select given a SELECT query' do
|
43
|
+
q = Tripod::SparqlQuery.new('SELECT xyz')
|
44
|
+
q.query_type.should == :select
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should return :construct given a CONSTRUCT query' do
|
48
|
+
q = Tripod::SparqlQuery.new('CONSTRUCT <xyz>')
|
49
|
+
q.query_type.should == :construct
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should return :construct given a DESCRIBE query' do
|
53
|
+
q = Tripod::SparqlQuery.new('DESCRIBE <xyz>')
|
54
|
+
q.query_type.should == :describe
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should return :ask given an ASK query' do
|
58
|
+
q = Tripod::SparqlQuery.new('ASK <xyz>')
|
59
|
+
q.query_type.should == :ask
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return :unknown given an unknown type" do
|
63
|
+
q = Tripod::SparqlQuery.new('FOO <xyz>')
|
64
|
+
q.query_type.should == :unknown
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#extract_prefixes' do
|
69
|
+
it 'should return the prefixes and query body separately' do
|
70
|
+
q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT xyz')
|
71
|
+
p, b = q.extract_prefixes
|
72
|
+
p.should == 'PREFIX e: <http://example.com>'
|
73
|
+
b.should == 'SELECT xyz'
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe '#as_count_query_str' do
|
78
|
+
context "for non-selects" do
|
79
|
+
it "should throw an exception" do
|
80
|
+
lambda {
|
81
|
+
q = Tripod::SparqlQuery.new('ASK { ?s ?p ?o }')
|
82
|
+
q.as_count_query_str
|
83
|
+
}.should raise_error(Tripod::SparqlQueryError)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "for selects" do
|
88
|
+
context 'without prefixes' do
|
89
|
+
it "should return a new SparqlQuery with the original query wrapped in a count" do
|
90
|
+
q = Tripod::SparqlQuery.new('SELECT ?s WHERE { ?s ?p ?o }')
|
91
|
+
q.as_count_query_str.should == 'SELECT COUNT(*) { SELECT ?s WHERE { ?s ?p ?o } }'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'with prefixes' do
|
96
|
+
it "should move the prefixes to the start" do
|
97
|
+
q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT ?s WHERE { ?s ?p ?o }')
|
98
|
+
q.as_count_query_str.should == 'PREFIX e: <http://example.com> SELECT COUNT(*) { SELECT ?s WHERE { ?s ?p ?o } }'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#as_first_query_str" do
|
105
|
+
context "for non-selects" do
|
106
|
+
it "should throw an exception" do
|
107
|
+
lambda {
|
108
|
+
q = Tripod::SparqlQuery.new('ASK { ?s ?p ?o }')
|
109
|
+
q.as_first_query_str
|
110
|
+
}.should raise_error(Tripod::SparqlQueryError)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "for selects" do
|
115
|
+
context 'without prefixes' do
|
116
|
+
it "should return a new SparqlQuery with the original query wrapped in a count" do
|
117
|
+
q = Tripod::SparqlQuery.new('SELECT ?s WHERE { ?s ?p ?o }')
|
118
|
+
q.as_first_query_str.should == 'SELECT * { SELECT ?s WHERE { ?s ?p ?o } } LIMIT 1'
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'with prefixes' do
|
123
|
+
it "should move the prefixes to the start" do
|
124
|
+
q = Tripod::SparqlQuery.new('PREFIX e: <http://example.com> SELECT ?s WHERE { ?s ?p ?o }')
|
125
|
+
q.as_first_query_str.should == 'PREFIX e: <http://example.com> SELECT * { SELECT ?s WHERE { ?s ?p ?o } } LIMIT 1'
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|