[ 
https://issues.apache.org/jira/browse/JENA-1841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17051679#comment-17051679
 ] 

Claude Warren commented on JENA-1841:
-------------------------------------

If instead of just calling 
{{NodeFactory.createLiteral(LiteralLabelFactory.createTypedLiteral(o));}} as 
the last resort the following code is used, it passes all the tests in the 
original code block.  In addition, it builds the literal type that would 
normally be built by {{LiteralLabelFactory.createTypedLiteral(0)}} without the 
side effect of registering an RDFDatatype. 

{code:java}

        RDFDatatype dt = TypeMapper.getInstance().getTypeByValue( o );
        if (dt == null) {
                String str = String.format( "\"%s\"^^<java:%s>", o, 
o.getClass().getName() );
                return NodeFactoryExtra.parseNode(str, PrefixMapFactory
                                        .createForInput(pMapping));
        } else {
                return 
NodeFactory.createLiteral(LiteralLabelFactory.createTypedLiteral(o));
        }
{code}

I though this is a good compromise as it allows us to read a model containing 
unregistered data types and create a query that will execute correctly.

However I think a better solution would be to add  {{createLiteral}} methods to 
the {{AbstractQueryBuilder}} along the lines of:

{code:java}
    public Node makeLiteral(Object o, String type) {
        return makeLiteral( o, type, query.getPrefixMapping() );
    }

    public static Node makeLiteral(Object o, String type, PrefixMapping 
pMapping) {
        String str = String.format( "\"%s\"^^<%s>", o, type );
        return NodeFactoryExtra.parseNode(str, 
PrefixMapFactory.createForInput(pMapping));
    }
{code}

Two methods as that is in line with the {{makeNode}} methods.

This will allow calls like {{makeLiteral( uuid, "java:java.util.UUID")}} to 
create the literal UUID string from the examples above or {{makeLiteral( uuid, 
"urn:MyCoolUUID")}} if you want to be very non-conformist.

Thoughts?

       

> Side Effect of Datatype <java:java.util.UUID> Use in Query
> ----------------------------------------------------------
>
>                 Key: JENA-1841
>                 URL: https://issues.apache.org/jira/browse/JENA-1841
>             Project: Apache Jena
>          Issue Type: Bug
>    Affects Versions: Jena 3.14.0
>            Reporter: Jan Martin Keil
>            Priority: Major
>
> 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.
> {code:java}
> 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");
>       }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to