Skip to content

Commit be65768

Browse files
author
Olaf Hartig
committed
changed the request processor classes to use the new generic TriplePatternElement interface
1 parent 0ab596a commit be65768

File tree

4 files changed

+106
-71
lines changed

4 files changed

+106
-71
lines changed

src/org/linkeddatafragments/datasource/AbstractRequestProcessorForTriplePatterns.java

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,52 @@
11
package org.linkeddatafragments.datasource;
22

3+
import com.hp.hpl.jena.rdf.model.Model;
4+
35
import org.linkeddatafragments.fragments.LinkedDataFragment;
46
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
7+
import org.linkeddatafragments.fragments.tpf.TriplePatternElement;
58
import org.linkeddatafragments.fragments.tpf.TriplePatternFragment;
69
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentImpl;
710
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
811

9-
import com.hp.hpl.jena.rdf.model.Model;
10-
1112
/**
1213
* Base class for implementations of {@link IFragmentRequestProcessor} that
1314
* process {@link TriplePatternFragmentRequest}s.
1415
*
16+
* @param <TermType> type for representing RDF terms in triple patterns
17+
* @param <VarType> type for representing specific variables in triple patterns
18+
*
1519
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
1620
*/
17-
public abstract class AbstractRequestProcessorForTriplePatterns
18-
extends AbstractRequestProcessor
21+
public abstract class
22+
AbstractRequestProcessorForTriplePatterns<TermType,VarType>
23+
extends AbstractRequestProcessor
1924
{
2025
@Override
21-
protected Worker getWorker( final LinkedDataFragmentRequest request )
26+
protected final Worker<TermType,VarType> getWorker(
27+
final LinkedDataFragmentRequest request )
2228
throws IllegalArgumentException
2329
{
24-
if ( request instanceof TriplePatternFragmentRequest )
25-
return getWorker( (TriplePatternFragmentRequest) request );
30+
if ( request instanceof TriplePatternFragmentRequest<?,?> ) {
31+
@SuppressWarnings("unchecked")
32+
final TriplePatternFragmentRequest<TermType,VarType> tpfRequest =
33+
(TriplePatternFragmentRequest<TermType,VarType>) request;
34+
return getTPFSpecificWorker( tpfRequest );
35+
}
2636
else
2737
throw new IllegalArgumentException( request.getClass().getName() );
2838
}
2939

30-
abstract protected Worker getWorker(
31-
final TriplePatternFragmentRequest request )
40+
abstract protected Worker<TermType,VarType> getTPFSpecificWorker(
41+
final TriplePatternFragmentRequest<TermType,VarType> request )
3242
throws IllegalArgumentException;
3343

3444

35-
abstract static protected class Worker
45+
abstract static protected class Worker<TermType,VarType>
3646
extends AbstractRequestProcessor.Worker
3747
{
38-
public Worker( final TriplePatternFragmentRequest request )
48+
public Worker(
49+
final TriplePatternFragmentRequest<TermType,VarType> request )
3950
{
4051
super( request );
4152
}
@@ -51,20 +62,22 @@ public LinkedDataFragment createRequestedFragment()
5162
else
5263
offset = 0L;
5364

54-
final TriplePatternFragmentRequest tpfRequest =
55-
(TriplePatternFragmentRequest) request;
65+
@SuppressWarnings("unchecked")
66+
final TriplePatternFragmentRequest<TermType,VarType> tpfRequest =
67+
(TriplePatternFragmentRequest<TermType,VarType>) request;
5668

5769
return createFragment( tpfRequest.getSubject(),
5870
tpfRequest.getPredicate(),
5971
tpfRequest.getObject(),
6072
offset, limit );
6173
}
6274

63-
abstract protected LinkedDataFragment createFragment( final String subj,
64-
final String pred,
65-
final String obj,
66-
final long offset,
67-
final long limit )
75+
abstract protected LinkedDataFragment createFragment(
76+
final TriplePatternElement<TermType,VarType> subj,
77+
final TriplePatternElement<TermType,VarType> pred,
78+
final TriplePatternElement<TermType,VarType> obj,
79+
final long offset,
80+
final long limit )
6881
throws IllegalArgumentException;
6982

7083
protected TriplePatternFragment createEmptyTriplePatternFragment()
@@ -78,17 +91,11 @@ protected TriplePatternFragment createTriplePatternFragment(
7891
final long totalSize,
7992
final boolean isLastPage )
8093
{
81-
final long pageNumber;
82-
if ( request.isPageRequest() )
83-
pageNumber = request.getPageNumber();
84-
else
85-
pageNumber = 1L;
86-
8794
return new TriplePatternFragmentImpl( triples,
8895
totalSize,
8996
request.getFragmentURL(),
9097
request.getDatasetURL(),
91-
pageNumber,
98+
request.getPageNumber(),
9299
isLastPage );
93100
}
94101

src/org/linkeddatafragments/datasource/hdt/HdtBasedRequestProcessorForTPFs.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
import java.io.IOException;
44

5-
import org.linkeddatafragments.datasource.AbstractJenaBasedRequestProcessorForTriplePatterns;
5+
import org.linkeddatafragments.datasource.AbstractRequestProcessorForTriplePatterns;
66
import org.linkeddatafragments.datasource.IFragmentRequestProcessor;
77
import org.linkeddatafragments.fragments.LinkedDataFragment;
8+
import org.linkeddatafragments.fragments.tpf.TriplePatternElement;
89
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
910
import org.rdfhdt.hdt.enums.TripleComponentRole;
1011
import org.rdfhdt.hdt.hdt.HDT;
@@ -16,9 +17,7 @@
1617
import com.hp.hpl.jena.graph.Triple;
1718
import com.hp.hpl.jena.rdf.model.Model;
1819
import com.hp.hpl.jena.rdf.model.ModelFactory;
19-
import com.hp.hpl.jena.rdf.model.Property;
2020
import com.hp.hpl.jena.rdf.model.RDFNode;
21-
import com.hp.hpl.jena.rdf.model.Resource;
2221

2322
/**
2423
* Implementation of {@link IFragmentRequestProcessor} that processes
@@ -28,7 +27,7 @@
2827
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
2928
*/
3029
public class HdtBasedRequestProcessorForTPFs
31-
extends AbstractJenaBasedRequestProcessorForTriplePatterns
30+
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String>
3231
{
3332
protected final HDT datasource;
3433
protected final NodeDictionary dictionary;
@@ -46,31 +45,38 @@ public HdtBasedRequestProcessorForTPFs( String hdtFile ) throws IOException
4645
}
4746

4847
@Override
49-
protected Worker getWorker( final TriplePatternFragmentRequest request )
48+
protected Worker getTPFSpecificWorker(
49+
final TriplePatternFragmentRequest<RDFNode,String> request )
5050
throws IllegalArgumentException
5151
{
5252
return new Worker( request );
5353
}
5454

5555

5656
protected class Worker
57-
extends AbstractJenaBasedRequestProcessorForTriplePatterns.Worker
57+
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String>
5858
{
59-
public Worker( final TriplePatternFragmentRequest request ) {
60-
super( request );
59+
public Worker( final TriplePatternFragmentRequest<RDFNode,String> req )
60+
{
61+
super( req );
6162
}
6263

6364
@Override
64-
protected LinkedDataFragment createFragment( final Resource subject,
65-
final Property predicate,
66-
final RDFNode object,
67-
final long offset,
68-
final long limit )
65+
protected LinkedDataFragment createFragment(
66+
final TriplePatternElement<RDFNode,String> subject,
67+
final TriplePatternElement<RDFNode,String> predicate,
68+
final TriplePatternElement<RDFNode,String> object,
69+
final long offset,
70+
final long limit )
6971
{
72+
// FIXME: The following algorithm is incorrect for cases in which
73+
// the requested triple pattern contains a specific variable
74+
// multiple times (e.g., ?x foaf:knows ?x ).
75+
7076
// look up the result from the HDT datasource)
71-
int subjectId = subject == null ? 0 : dictionary.getIntID(subject.asNode(), TripleComponentRole.SUBJECT);
72-
int predicateId = predicate == null ? 0 : dictionary.getIntID(predicate.asNode(), TripleComponentRole.PREDICATE);
73-
int objectId = object == null ? 0 : dictionary.getIntID(object.asNode(), TripleComponentRole.OBJECT);
77+
int subjectId = subject.isVariable() ? 0 : dictionary.getIntID(subject.asTerm().asNode(), TripleComponentRole.SUBJECT);
78+
int predicateId = predicate.isVariable() ? 0 : dictionary.getIntID(predicate.asTerm().asNode(), TripleComponentRole.PREDICATE);
79+
int objectId = object.isVariable() ? 0 : dictionary.getIntID(object.asTerm().asNode(), TripleComponentRole.OBJECT);
7480

7581
if (subjectId < 0 || predicateId < 0 || objectId < 0) {
7682
return createEmptyTriplePatternFragment();

src/org/linkeddatafragments/datasource/index/IndexRequestProcessorForTPFs.java

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
import com.hp.hpl.jena.rdf.model.Property;
66
import com.hp.hpl.jena.rdf.model.RDFNode;
77
import com.hp.hpl.jena.rdf.model.Resource;
8+
import com.hp.hpl.jena.rdf.model.ResourceFactory;
89
import com.hp.hpl.jena.rdf.model.StmtIterator;
910
import com.hp.hpl.jena.rdf.model.impl.PropertyImpl;
1011
import com.hp.hpl.jena.rdf.model.impl.ResourceImpl;
1112
import java.util.HashMap;
1213
import java.util.Map;
1314

14-
import org.linkeddatafragments.datasource.AbstractJenaBasedRequestProcessorForTriplePatterns;
15+
import org.linkeddatafragments.datasource.AbstractRequestProcessorForTriplePatterns;
1516
import org.linkeddatafragments.datasource.IDataSource;
1617
import org.linkeddatafragments.datasource.IFragmentRequestProcessor;
1718
import org.linkeddatafragments.fragments.LinkedDataFragment;
19+
import org.linkeddatafragments.fragments.tpf.TriplePatternElement;
1820
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
1921

2022
/**
@@ -26,7 +28,7 @@
2628
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
2729
*/
2830
public class IndexRequestProcessorForTPFs
29-
extends AbstractJenaBasedRequestProcessorForTriplePatterns
31+
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String>
3032
{
3133
final static String RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
3234
final static String RDFS = "http://www.w3.org/2000/01/rdf-schema#";
@@ -55,27 +57,41 @@ public IndexRequestProcessorForTPFs(
5557
}
5658

5759
@Override
58-
protected Worker getWorker( final TriplePatternFragmentRequest request )
60+
protected Worker getTPFSpecificWorker(
61+
final TriplePatternFragmentRequest<RDFNode,String> request )
5962
throws IllegalArgumentException
6063
{
6164
return new Worker( request );
6265
}
6366

6467

6568
protected class Worker
66-
extends AbstractJenaBasedRequestProcessorForTriplePatterns.Worker
69+
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String>
6770
{
68-
public Worker( final TriplePatternFragmentRequest request ) {
69-
super( request );
71+
public Worker( final TriplePatternFragmentRequest<RDFNode,String> req )
72+
{
73+
super( req );
7074
}
7175

7276
@Override
73-
protected LinkedDataFragment createFragment( final Resource subject,
74-
final Property predicate,
75-
final RDFNode object,
76-
final long offset,
77-
final long limit )
77+
protected LinkedDataFragment createFragment(
78+
final TriplePatternElement<RDFNode,String> s,
79+
final TriplePatternElement<RDFNode,String> p,
80+
final TriplePatternElement<RDFNode,String> o,
81+
final long offset,
82+
final long limit )
7883
{
84+
// FIXME: The following algorithm is incorrect for cases in which
85+
// the requested triple pattern contains a specific variable
86+
// multiple times (e.g., ?x foaf:knows ?x ).
87+
88+
final Resource subject = s.isVariable() ? null
89+
: s.asTerm().asResource();
90+
final Property predicate = p.isVariable() ? null
91+
: ResourceFactory.createProperty(p.asTerm().asResource().getURI());
92+
final RDFNode object = o.isVariable() ? null
93+
: o.asTerm();
94+
7995
StmtIterator listStatements = model.listStatements(subject, predicate, object);
8096
Model result = ModelFactory.createDefaultModel();
8197

src/org/linkeddatafragments/datasource/tdb/JenaTDBBasedRequestProcessorForTPFs.java

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,14 @@
1212
import com.hp.hpl.jena.rdf.model.Literal;
1313
import com.hp.hpl.jena.rdf.model.Model;
1414
import com.hp.hpl.jena.rdf.model.ModelFactory;
15-
import com.hp.hpl.jena.rdf.model.Property;
1615
import com.hp.hpl.jena.rdf.model.RDFNode;
17-
import com.hp.hpl.jena.rdf.model.Resource;
1816
import com.hp.hpl.jena.tdb.TDBFactory;
1917
import java.io.File;
2018

21-
import org.linkeddatafragments.datasource.AbstractJenaBasedRequestProcessorForTriplePatterns;
19+
import org.linkeddatafragments.datasource.AbstractRequestProcessorForTriplePatterns;
2220
import org.linkeddatafragments.datasource.IFragmentRequestProcessor;
2321
import org.linkeddatafragments.fragments.LinkedDataFragment;
22+
import org.linkeddatafragments.fragments.tpf.TriplePatternElement;
2423
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
2524

2625
/**
@@ -31,7 +30,7 @@
3130
* @author <a href="http://olafhartig.de">Olaf Hartig</a>
3231
*/
3332
public class JenaTDBBasedRequestProcessorForTPFs
34-
extends AbstractJenaBasedRequestProcessorForTriplePatterns
33+
extends AbstractRequestProcessorForTriplePatterns<RDFNode,String>
3534
{
3635
private final Dataset tdb;
3736
private final String sparql = "CONSTRUCT WHERE { ?s ?p ?o } " +
@@ -43,37 +42,44 @@ public class JenaTDBBasedRequestProcessorForTPFs
4342
private final Query countQuery = QueryFactory.create(count, Syntax.syntaxSPARQL_11);
4443

4544
@Override
46-
protected Worker getWorker( final TriplePatternFragmentRequest request )
45+
protected Worker getTPFSpecificWorker(
46+
final TriplePatternFragmentRequest<RDFNode,String> request )
4747
throws IllegalArgumentException
4848
{
4949
return new Worker( request );
5050
}
5151

5252

5353
protected class Worker
54-
extends AbstractJenaBasedRequestProcessorForTriplePatterns.Worker
54+
extends AbstractRequestProcessorForTriplePatterns.Worker<RDFNode,String>
5555
{
56-
public Worker( final TriplePatternFragmentRequest request ) {
57-
super( request );
56+
public Worker( final TriplePatternFragmentRequest<RDFNode,String> req )
57+
{
58+
super( req );
5859
}
5960

6061
@Override
61-
protected LinkedDataFragment createFragment( final Resource subject,
62-
final Property predicate,
63-
final RDFNode object,
64-
final long offset,
65-
final long limit )
62+
protected LinkedDataFragment createFragment(
63+
final TriplePatternElement<RDFNode,String> subject,
64+
final TriplePatternElement<RDFNode,String> predicate,
65+
final TriplePatternElement<RDFNode,String> object,
66+
final long offset,
67+
final long limit )
6668
{
69+
// FIXME: The following algorithm is incorrect for cases in which
70+
// the requested triple pattern contains a specific variable
71+
// multiple times (e.g., ?x foaf:knows ?x ).
72+
6773
Model model = tdb.getDefaultModel();
6874
QuerySolutionMap map = new QuerySolutionMap();
69-
if (subject != null) {
70-
map.add("s", subject);
75+
if ( ! subject.isVariable() ) {
76+
map.add("s", subject.asTerm());
7177
}
72-
if (predicate != null) {
73-
map.add("p", predicate);
78+
if ( ! predicate.isVariable() ) {
79+
map.add("p", predicate.asTerm());
7480
}
75-
if (object != null) {
76-
map.add("o", object);
81+
if ( ! object.isVariable() ) {
82+
map.add("o", object.asTerm());
7783
}
7884

7985
query.setOffset(offset);

0 commit comments

Comments
 (0)