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

Thomas Mueller edited comment on OAK-343 at 12/12/12 8:58 AM:
--------------------------------------------------------------

For me it's not actually about that getCost() gets called first, but in general 
that getCost() is supposed to just calculate the cost, without side effects. 
Even if this side effect is within the specification, it's just unusual and 
unexpected. I would rather have a solution where getCost() only calculates the 
cost :-) and the lookup is done within query(). I think we can find a solution. 
It's also problematic that getCost() returns 0 so that the cost is smaller than 
the cost of the regular jcr:uuid index. It does solve the problem, true, but 
it's not what I had in mind originally.

About naming: I would probably call it "TransientUUIDIndex" because it operates 
on the transient space. Later on, if we want to make it more generic, we could 
call it "TransientIndex".

What about making it explicit in the query that the result should include 
transient changes? So the query would be changed to "select ... from ... where 
[jcr:uuid] = $id including transient". Then the QueryIndex interface would be 
extended with a new method "boolean includesTransient". That way, if the query 
is "including transient", the query engine would only use indexes that do 
support transient changes.

I'm OK to all those changes myself later on, as I don't think they are urgent.

I wonder if both the NodeState and Root given to the query actually include the 
node?


                
      was (Author: tmueller):
    For me it's not actually about that getCost() gets called first, but in 
general that getCost() is supposed to just calculate the cost, without side 
effects. Even if this side effect is within the specification, it's just 
unusual and unexpected. I would rather have a solution where getCost() only 
calculates the cost :-) and the lookup is done within query(). I think we can 
find a solution. It's also problematic that getCost() returns 0 so that the 
cost is smaller than the cost of the regular jcr:uuid index. It does solve the 
problem, true, but it's now the planned behavior.

About naming: I would probably call it "TransientUUIDIndex" because it operates 
on the transient space. Later on, if we want to make it more generic, we could 
call it "TransientIndex".

What about making it explicit in the query that the result should include 
transient changes? So the query would be changed to "select ... from ... where 
[jcr:uuid] = $id including transient". Then the QueryIndex interface would be 
extended with a new method "boolean includesTransient". That way, if the query 
is "including transient", the query engine would only use indexes that do 
support transient changes.

I wonder if both the NodeState and Root given to the query actually include the 
node?

                  
> Session.getNodeByUUID requires save call
> ----------------------------------------
>
>                 Key: OAK-343
>                 URL: https://issues.apache.org/jira/browse/OAK-343
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>          Components: core, jcr
>            Reporter: angela
>         Attachments: oak-343.patch
>
>
> while adding mix:referenceable to a new node immediately assigns a 
> uuid and makes the node referenceable, session.getNodeByUUID only works
> after saving the changes.
> the following test illustrates this behavior:
> @Test
> public void getNodeByUUID() throws RepositoryException {
>    Node node = getNode("/foo").addNode("boo");
>    node.addMixin(JcrConstants.MIX_REFERENCEABLE);
>    assertTrue(node.isNodeType(JcrConstants.MIX_REFERENCEABLE));
>    String uuid = node.getUUID();
>    assertNotNull(uuid);
>    assertEquals(uuid, node.getIdentifier());
>    Node nAgain = node.getSession().getNodeByUUID(uuid);
>    assertTrue(nAgain.isSame(node));
>    assertTrue(nAgain.isSame(node.getSession().getNodeByIdentifier(uuid)));
> }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to