/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.rdb; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Locale; import java.util.Set; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.mysema.converters.UtilDateConverter; import com.mysema.query.Tuple; import com.mysema.query.sql.RelationalPath; import com.mysema.query.sql.SQLQuery; import com.mysema.rdfbean.TEST; import com.mysema.rdfbean.model.BID; import com.mysema.rdfbean.model.ID; import com.mysema.rdfbean.model.LIT; import com.mysema.rdfbean.model.NODE; import com.mysema.rdfbean.model.RDF; import com.mysema.rdfbean.model.RDFS; import com.mysema.rdfbean.model.STMT; import com.mysema.rdfbean.model.UID; import com.mysema.rdfbean.model.XSD; public class RDBConnectionTest extends AbstractRDBTest { private final IdFactory idFactory = new MD5IdFactory(); private RDBConnection conn; private Connection jdbcConn; @Before public void setUp() throws SQLException { conn = repository.openConnection(); jdbcConn = dataSource.getConnection(); } @After public void tearDown() throws IOException, SQLException { if (conn != null) { conn.close(); } if (jdbcConn != null) { jdbcConn.close(); } } @Test public void FindStatements() { ID subject = new BID(); Set<STMT> additions = new HashSet<STMT>(); additions.add(new STMT(subject, RDF.type, RDF.Property)); additions.add(new STMT(subject, RDFS.label, new LIT("type"))); additions.add(new STMT(subject, RDFS.label, new LIT("tyyppi", new Locale("fi")))); Set<STMT> removals = new HashSet<STMT>(); conn.update(removals, additions); assertEquals(3, conn.find(subject, null, null, null, false).size()); assertEquals(1, conn.find(subject, RDF.type, null, null, false).size()); assertEquals(2, conn.find(subject, RDFS.label, null, null, false).size()); assertEquals(1, conn.find(subject, RDFS.label, new LIT("type"), null, false).size()); } @Test public void DateTime() { UtilDateConverter converter = new UtilDateConverter(); ID subject = new BID(); LIT object = new LIT(converter.toString(new Date()), XSD.date); Set<STMT> additions = new HashSet<STMT>(); additions.add(new STMT(subject, new UID(TEST.NS, "created"), object)); Set<STMT> removals = new HashSet<STMT>(); conn.update(removals, additions); assertEquals(1, conn.find(subject, null, null, null, false).size()); assertEquals(1, conn.find(subject, new UID(TEST.NS, "created"), null, null, false).size()); assertEquals(1, conn.find(subject, new UID(TEST.NS, "created"), object, null, false).size()); } @Test public void Numeric() { ID subject = new BID(); Set<STMT> additions = new HashSet<STMT>(); additions.add(new STMT(subject, new UID(TEST.NS, "int"), new LIT("1", XSD.intType))); additions.add(new STMT(subject, new UID(TEST.NS, "double"), new LIT("1.0", XSD.doubleType))); Set<STMT> removals = new HashSet<STMT>(); conn.update(removals, additions); assertEquals(2, conn.find(subject, null, null, null, false).size()); assertEquals(1, conn.find(subject, new UID(TEST.NS, "int"), null, null, false).size()); assertEquals(1, conn.find(subject, new UID(TEST.NS, "int"), new LIT("1", XSD.intType), null, false).size()); assertEquals(1, conn.find(subject, new UID(TEST.NS, "double"), new LIT("1.0", XSD.doubleType), null, false).size()); } @Test public void Remove() { Set<STMT> additions = new HashSet<STMT>(); additions.add(new STMT(RDF.type, RDF.type, RDF.Property)); additions.add(new STMT(RDF.type, RDFS.label, new LIT("type"))); additions.add(new STMT(RDF.type, RDFS.label, new LIT("tyyppi", new Locale("fi")))); Set<STMT> removals = new HashSet<STMT>(); conn.update(removals, additions); QSymbol symbol = QSymbol.symbol; assertEquals(1l, from(symbol).where(symbol.id.eq(id(RDF.type))).count()); assertEquals(1l, from(symbol).where(symbol.id.eq(id(RDFS.label))).count()); assertEquals(1l, from(symbol).where(symbol.id.eq(id(new LIT("type")))).count()); conn.remove(null, null, null, RDF.type); // * * * c assertEquals(3, conn.find(RDF.type, null, null, null, false).size()); conn.remove(null, null, RDF.Property, null); // * * o * assertEquals(2, conn.find(RDF.type, null, null, null, false).size()); conn.remove(null, RDF.type, RDF.Property, null); // * p o * assertEquals(2, conn.find(RDF.type, null, null, null, false).size()); conn.remove(RDF.type, RDF.type, RDF.Property, null); // s p o * assertEquals(2, conn.find(RDF.type, null, null, null, false).size()); conn.remove(RDF.type, RDF.type, null, null); // s p * * assertEquals(2, conn.find(RDF.type, null, null, null, false).size()); conn.remove(RDF.type, null, null, null); // s * * * assertEquals(0, conn.find(RDF.type, null, null, null, false).size()); conn.remove(null, null, null, null); // * * * * } @Test public void Update() throws SQLException { Set<STMT> additions = new HashSet<STMT>(); additions.add(new STMT(RDF.type, RDF.type, RDF.Property)); additions.add(new STMT(RDF.type, RDFS.label, new LIT("type"))); additions.add(new STMT(RDF.type, RDFS.label, new LIT("tyyppi", new Locale("fi")))); Set<STMT> removals = new HashSet<STMT>(); conn.update(removals, additions); // print inserted triples QStatement stmt = QStatement.statement; QSymbol sub = new QSymbol("sub"); QSymbol pre = new QSymbol("pre"); QSymbol obj = new QSymbol("obj"); SQLQuery query = from(stmt); query.where(stmt.subject.eq(id(RDF.type))); query.innerJoin(stmt.subjectFk, sub); query.innerJoin(stmt.predicateFk, pre); query.innerJoin(stmt.objectFk, obj); for (Tuple row : query.list(sub.lexical, pre.lexical, obj.lexical)) { System.out.println(Arrays.asList(row.toArray())); } QSymbol symbol = QSymbol.symbol; assertEquals(1l, from(symbol).where(symbol.id.eq(id(RDF.type))).count()); assertEquals(1l, from(symbol).where(symbol.id.eq(id(RDFS.label))).count()); assertEquals(1l, from(symbol).where(symbol.id.eq(id(new LIT("type")))).count()); assertEquals(additions.size(), from(stmt).where(stmt.subject.eq(id(RDF.type))).count()); } @Test public void Update_with_nulls() { conn.update(Collections.<STMT> emptySet(), null); conn.update(null, Collections.<STMT> emptySet()); conn.update(null, null); } @Test public void AddStatement() { Set<STMT> additions = new HashSet<STMT>(); ID sub1 = new BID(); ID sub2 = new BID(); additions.add(new STMT(sub1, RDF.type, RDF.Property)); additions.add(new STMT(sub1, RDFS.label, new LIT("type"))); additions.add(new STMT(sub1, RDFS.label, new LIT("tyyppi", new Locale("fi")))); additions.add(new STMT(sub2, RDF.type, RDF.Property, new UID(RDF.NS))); conn.update(Collections.<STMT> emptySet(), additions); for (STMT stmt : additions) { assertEquals(stmt + " failed", 1, conn.find(stmt.getSubject(), stmt.getPredicate(), stmt.getObject(), stmt.getContext(), false).size()); } } @Test public void AddNode() { // TODO } @Test public void RemoveStatement() { Set<STMT> removals = new HashSet<STMT>(); ID sub1 = new BID(); ID sub2 = new BID(); removals.add(new STMT(sub1, RDF.type, RDF.Property)); removals.add(new STMT(sub1, RDFS.label, new LIT("type"))); removals.add(new STMT(sub1, RDFS.label, new LIT("type"), new UID(RDF.NS))); removals.add(new STMT(sub1, RDFS.label, new LIT("tyyppi", new Locale("fi")))); removals.add(new STMT(sub2, RDF.type, RDF.Property)); removals.add(new STMT(sub2, RDF.type, RDF.Property, new UID(RDF.NS))); conn.update(removals, Collections.<STMT> emptySet()); for (STMT stmt : removals) { assertEquals(stmt + " failed", 0, conn.find(stmt.getSubject(), stmt.getPredicate(), stmt.getObject(), stmt.getContext(), false).size()); } } private Long id(NODE node) { return idFactory.getId(node); } private SQLQuery from(RelationalPath<?> entity) { return new SQLQuery(jdbcConn, templates).from(entity); } }