*
* @throws Exception
*/
@Test
public void testCreateListVersionsBetween() throws Exception {
KiWiVersioningConnection connection = vpersistence.getConnection();
try {
KiWiUriResource subject = new KiWiUriResource("http://localhost/resource/"+ RandomStringUtils.randomAlphanumeric(8));
KiWiUriResource pred_1 = new KiWiUriResource("http://localhost/predicate/P1");
KiWiUriResource pred_2 = new KiWiUriResource("http://localhost/predicate/P2");
KiWiUriResource object_1 = new KiWiUriResource("http://localhost/resource/"+RandomStringUtils.randomAlphanumeric(8));
KiWiStringLiteral object_2 = new KiWiStringLiteral(RandomStringUtils.randomAlphanumeric(32));
KiWiUriResource context = new KiWiUriResource("http://localhost/context/"+RandomStringUtils.randomAlphanumeric(8));
connection.storeNode(subject);
connection.storeNode(pred_1);
connection.storeNode(pred_2);
connection.storeNode(object_1);
connection.storeNode(object_2);
connection.storeNode(context);
KiWiTriple triple1 = new KiWiTriple(subject,pred_1,object_1,context);
KiWiTriple triple2 = new KiWiTriple(subject,pred_2,object_2,context);
connection.storeTriple(triple1);
connection.storeTriple(triple2);
connection.commit();
Date date1 = new Date();
// wait for one second to be sure to capture MySQL cutting milliseconds
mysqlSleep();
Version version1 = new Version();
version1.setCommitTime(new Date());
version1.addTriple(triple1);
connection.storeVersion(version1);
connection.commit();
// wait for one second to be sure to capture MySQL cutting milliseconds
mysqlSleep();
Date date2 = new Date();
// wait for one second to be sure to capture MySQL cutting milliseconds
mysqlSleep();
Version version2 = new Version();
version2.setCommitTime(new Date());
version2.addTriple(triple2);
version2.removeTriple(triple1);
connection.deleteTriple(triple1);
connection.storeVersion(version2);
connection.commit();
// wait for one second to be sure to capture MySQL cutting milliseconds
mysqlSleep();
Date date3 = new Date();
// now we test different ways of listing versions between dates
List<Version> list1 = Iterations.asList(connection.listVersions(date1, date2));
Assert.assertEquals("there should be exactly one version from "+date1+" to "+date2,1,list1.size());
Assert.assertEquals("contents of version differ", version1, list1.get(0));
Assert.assertEquals("version id is not 1", 1L, (long)list1.get(0).getId());
// check if getLatestVersion at date2 works
Version latest2 = connection.getLatestVersion(subject,date2);
Assert.assertNotNull("latest version for subject was not found",latest2);
Assert.assertEquals("latest version is not the expected version", version1,latest2);
// check if listVersions with subject1 now gives exactly one version
List<Version> listr1 = Iterations.asList(connection.listVersions(subject, date1, date2));
Assert.assertEquals("there should be exactly one version", 1, listr1.size());
Assert.assertEquals("contents of version differ", version1, listr1.get(0));
Assert.assertEquals("version id is not 1", 1L, (long)listr1.get(0).getId());
List<Version> list2 = Iterations.asList(connection.listVersions(date2, date3));
Assert.assertEquals("there should be exactly one version from "+date2+" to "+date3,1,list2.size());
Assert.assertEquals("contents of version differ", version2, list2.get(0));
Assert.assertEquals("version id is not 2", 2L, (long)list2.get(0).getId());
List<Version> list3 = Iterations.asList(connection.listVersions(date3, new Date()));
Assert.assertEquals("there should be no version from "+date3+" to now",0,list3.size());
List<Version> list4 = Iterations.asList(connection.listVersions(date1, date3));
Assert.assertEquals("there should be exactly two versions from "+date1+" to "+date3,2,list4.size());
Assert.assertEquals("contents of version1 differ", version1, list4.get(0));
Assert.assertEquals("contents of version2 differ", version2, list4.get(1));
connection.commit();
// test garbage collector (should not throw an error and should not remove any triples, since they are
// referenced by the versioning table)
// test database contents
PreparedStatement stmt = connection.getJDBCConnection().prepareStatement("SELECT * FROM triples WHERE deleted = true");
ResultSet dbResult1 = stmt.executeQuery();
Assert.assertTrue(dbResult1.next());
persistence.forceGarbageCollector();
// triple should not be garbage collected
ResultSet dbResult2 = stmt.executeQuery();
Assert.assertTrue(dbResult2.next());
} finally {
connection.close();
}
}