Uploaded image for project: 'Apache Jena'
  1. Apache Jena
  2. JENA-1841

Side Effect of Datatype <java:java.util.UUID> Use in Query

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • Jena 3.14.0
    • Jena 3.15.0
    • None
    • None

    Description

      I faced a bug caused by a side effect of using the datatype <java:java.util.UUID> in a query.

      Short story is that you can not use this datatype in model parsing or queries after you once used it in a query.

      I did not completely  break it down to a specific piece of code, but I wrote some testcases that narrow down the issue. Please note that the order of execution of the test methods effect the result. So please first try to execute single test methods before executing the whole test class.

      
      import java.io.ByteArrayInputStream;
      import java.util.UUID;
      
      import org.apache.jena.arq.querybuilder.SelectBuilder;
      import org.apache.jena.query.QueryExecution;
      import org.apache.jena.query.QueryExecutionFactory;
      import org.apache.jena.rdf.model.Model;
      import org.apache.jena.rdf.model.ModelFactory;
      import org.junit.jupiter.api.Test;
      
      public class UuidParsingintoModelOrQuery {
      
      	@Test
      	public void uuidParsingIntoSingleModel() throws Exception {
      		UUID uuid1 = UUID.fromString("00000000-0000-0000-0000-000000000000");
      		UUID uuid2 = UUID.fromString("00000000-0000-0000-0000-000000000001");
      
      		String modelStr = "_:a <http://example.org/p1> \"" + uuid1 + "\"^^<java:java.util.UUID> .\n"
      				+ "_:a <http://example.org/p2> \"" + uuid1 + "\"^^<java:java.util.UUID> .";
      		ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
      		// repeat
      		modelStr = "_:a <http://example.org/p1> \"" + uuid2 + "\"^^<java:java.util.UUID> .\n"
      				+ "_:a <http://example.org/p2> \"" + uuid2 + "\"^^<java:java.util.UUID> .";
      		ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
      	}
      
      	@Test
      	public void sameUuidParsingIntoSingleModel() throws Exception {
      		UUID uuid1 = UUID.fromString("00000000-0000-0000-0000-000000000002");
      		UUID uuid2 = UUID.fromString("00000000-0000-0000-0000-000000000003");
      		String modelStr = "_:a <http://example.org/p1> \"" + uuid1 + "\"^^<java:java.util.UUID> .\n"
      				+ "_:a <http://example.org/p2> \"" + uuid2 + "\"^^<java:java.util.UUID> .";
      		ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
      		// repeat
      		ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
      	}
      
      	@Test
      	public void sameUuidParsingIntoMultipleModel() throws Exception {
      		UUID uuid = UUID.fromString("00000000-0000-0000-0000-000000000004");
      		String modelStr = "_:a <http://example.org/p1> \"" + uuid + "\"^^<java:java.util.UUID> .";
      		ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
      		ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "", "N-TRIPLE");
      	}
      
      	@Test
      	public void uuidUseInQuery() throws Exception {
      		UUID uuid = UUID.fromString("00000000-0000-0000-0000-000000000005");
      		SelectBuilder select = new SelectBuilder();
      		select.addWhere("?a", "<http://example.org/p>", "?uuid");
      		select.addFilter(select.getExprFactory().eq("?uuid", uuid));
      		QueryExecution q = QueryExecutionFactory.create(select.build());
      	}
      
      	@Test
      	public void uuidParsingIntoQuery() throws Exception {
      		UUID uuid = UUID.fromString("00000000-0000-0000-0000-000000000006");
      		SelectBuilder select = new SelectBuilder();
      		select.addWhere("?a", "<http://example.org/p>", "?uuid");
      		select.addFilter(select.getExprFactory().eq("?uuid", uuid));
      		QueryExecution q = QueryExecutionFactory.create(select.toString());
      	}
      
      	@Test
      	public void uuidUseInQueryAndParsingIntoModel() throws Exception {
      		UUID uuid = UUID.fromString("00000000-0000-0000-0000-000000000007");
      		SelectBuilder select = new SelectBuilder();
      		select.addWhere("?a", "<http://example.org/p>", "?uuid");
      		select.addFilter(select.getExprFactory().eq("?uuid", uuid));
      		QueryExecution q = QueryExecutionFactory.create(select.build());
      		String modelStr = "_:a <http://example.org/p1> \"" + uuid + "\"^^<java:java.util.UUID> .\n"
      				+ "_:a <http://example.org/p2> \"" + uuid + "\"^^<java:java.util.UUID> .";
      		Model model = ModelFactory.createDefaultModel().read(new ByteArrayInputStream(modelStr.getBytes()), "",
      				"N-TRIPLE");
      	}
      }
      

      Attachments

        Issue Links

          Activity

            People

              claude Claude Warren
              jmkeil Jan Martin Keil
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Time Tracking

                  Estimated:
                  Original Estimate - Not Specified
                  Not Specified
                  Remaining:
                  Remaining Estimate - 0h
                  0h
                  Logged:
                  Time Spent - 40m
                  40m