Skip to content

Commit 4aad817

Browse files
author
mielvds
committed
Merge pull request #26 from hartig/GenericTriplePatternElements
Generic triple pattern elements
2 parents 5d30d4d + 7c5db60 commit 4aad817

23 files changed

+604
-308
lines changed

src/org/linkeddatafragments/datasource/AbstractJenaBasedRequestProcessorForTriplePatterns.java

Lines changed: 0 additions & 154 deletions
This file was deleted.

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

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package org.linkeddatafragments.datasource;
22

3-
import org.linkeddatafragments.fragments.IFragmentRequestParser;
4-
import org.linkeddatafragments.fragments.LinkedDataFragmentRequest;
5-
import org.linkeddatafragments.fragments.tpf.TPFRequestParser;
6-
import org.linkeddatafragments.fragments.tpf.TriplePatternFragmentRequest;
7-
83
/**
94
*
105
* @author mielvandersande
@@ -29,19 +24,6 @@ public String getTitle() {
2924
return this.title;
3025
};
3126

32-
/**
33-
* This implementation assumes that requests are
34-
* {@link TriplePatternFragmentRequest}s.
35-
*
36-
* Data sources for other types of {@link LinkedDataFragmentRequest}s must
37-
* override this method accordingly.
38-
*/
39-
@Override
40-
public IFragmentRequestParser getRequestParser()
41-
{
42-
return new TPFRequestParser();
43-
}
44-
4527
@Override
4628
public void close() {}
4729
}

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

Lines changed: 23 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,39 @@ 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+
// see https://github.com/LinkedDataFragments/Server.Java/issues/23
76+
7077
// 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);
78+
int subjectId = subject.isVariable() ? 0 : dictionary.getIntID(subject.asTerm().asNode(), TripleComponentRole.SUBJECT);
79+
int predicateId = predicate.isVariable() ? 0 : dictionary.getIntID(predicate.asTerm().asNode(), TripleComponentRole.PREDICATE);
80+
int objectId = object.isVariable() ? 0 : dictionary.getIntID(object.asTerm().asNode(), TripleComponentRole.OBJECT);
7481

7582
if (subjectId < 0 || predicateId < 0 || objectId < 0) {
7683
return createEmptyTriplePatternFragment();

0 commit comments

Comments
 (0)