package com.mysema.rdfbean.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import com.mysema.commons.lang.CloseableIterator;
import com.mysema.commons.lang.IteratorAdapter;
import com.mysema.query.types.Predicate;
import com.mysema.rdfbean.AbstractConnectionTest;
import com.mysema.rdfbean.TEST;
public class TupleQueryTest extends AbstractConnectionTest {
private static final QNODE<ID> subject = new QNODE<ID>(ID.class, "s");
private static final QNODE<UID> predicate = new QNODE<UID>(UID.class, "p");
private static final QNODE<NODE> object = new QNODE<NODE>(NODE.class, "o");
private RDFQuery query() {
return new RDFQueryImpl(connection());
}
@Override
@Before
public void before() {
super.before();
connection().update(null,
Arrays.asList(
new STMT(new BID(), RDFS.label, new LIT("C")),
new STMT(new BID(), RDF.type, RDFS.Resource)));
}
@Override
@After
public void after() {
connection().remove(null, null, null, null);
super.after();
}
@Test
public void Pattern() {
query().where(Blocks.pattern(subject, RDF.type, RDFS.Class)).select(subject);
}
@Test
public void SelectAll() {
CloseableIterator<Map<String, NODE>> iterator = query().where(Blocks.SPO).selectAll();
assertTrue(iterator.hasNext());
try {
while (iterator.hasNext()) {
Map<String, NODE> row = iterator.next();
assertNotNull(row.get("s"));
assertNotNull(row.get("p"));
assertNotNull(row.get("o"));
}
} finally {
iterator.close();
}
}
@Test
public void Pattern_with_Filters() {
Block pattern = Blocks.pattern(subject, predicate, object);
List<Predicate> filters = Arrays.<Predicate> asList(
subject.eq(new UID(TEST.NS)),
subject.in(RDF.type, RDF.first),
predicate.eq(RDFS.label),
subject.ne(new UID(TEST.NS)),
object.isNull(),
object.isNotNull(),
object.stringValue().startsWith("X"),
object.lit().like("X%"),
object.lit().matches(".*"),
object.lit().lt("D"),
object.lit().gt("B"),
object.lit().loe("C"),
object.lit().goe("C"),
object.lit().eqIgnoreCase("X"),
object.lit().isEmpty()
);
for (Predicate filter : filters) {
query().where(pattern, filter).selectSingle(subject);
}
}
@Test
public void Pattern_with_Limit_and_Offset() {
query().where(Blocks.pattern(subject, RDF.type, RDFS.Class))
.limit(5)
.offset(20)
.select(subject);
}
@Test
public void Group() {
query().where(
Blocks.pattern(subject, RDF.type, RDFS.Class),
Blocks.pattern(subject, predicate, object))
.select(subject, predicate, object);
}
@Test
public void Union() {
query().where(
Blocks.union(
Blocks.pattern(subject, RDF.type, RDFS.Class),
Blocks.pattern(subject, predicate, object)
)).select(subject, predicate, object);
}
@Test
public void Optional() {
query().where(
Blocks.pattern(subject, RDF.type, RDFS.Class),
Blocks.optional(Blocks.pattern(subject, predicate, object)))
.select(subject, predicate, object);
}
@Test
public void Complex() {
QID u = new QID("u"), u2 = new QID("u2");
QLIT label = new QLIT("label");
UID User = new UID(TEST.NS, "User");
ID id = new BID(), id2 = new BID(), id3 = new BID();
connection().update(null,
Arrays.asList(
new STMT(id, RDF.type, User),
new STMT(id2, RDF.type, User),
new STMT(id3, RDF.type, User),
new STMT(id, RDFS.label, new LIT("x")),
new STMT(id2, RDFS.label, new LIT("x")),
new STMT(id3, RDFS.label, new LIT("y"))));
CloseableIterator<Map<String, NODE>> iterator =
query().where(
Blocks.pattern(u, RDF.type, User),
Blocks.pattern(u2, RDF.type, User),
Blocks.pattern(u2, RDFS.label, label),
Blocks.pattern(u, RDFS.label, label),
u.ne(u2)
).select(u, u2);
List<Map<String, NODE>> list = IteratorAdapter.asList(iterator);
assertEquals(2, list.size());
}
@Test
@Ignore
public void From() {
UID test = new UID(TEST.NS);
UID test2 = new UID(TEST.NS, "Res1");
connection().update(null, Arrays.asList(new STMT(new BID(), RDFS.label, new LIT("C"), test)));
assertTrue(query().from(test).where(Blocks.pattern(subject, predicate, object)).ask());
assertTrue(query().from(test, test2).where(Blocks.pattern(subject, predicate, object)).ask());
assertFalse(query().from(test2).where(Blocks.pattern(subject, predicate, object)).ask());
}
}