10 Replies Latest reply on Jan 2, 2012 1:28 PM by alex soto

    Query with Joins produces NPE

    alex soto Newbie

      Hello:

       

      This NPE exception:

       

      java.lang.NullPointerException
        at org.modeshape.graph.query.process.JoinComponent$6.evaluate(JoinComponent.java:359)
        at org.modeshape.graph.query.process.NestedLoopJoinComponent.execute(NestedLoopJoinComponent.java:68)
        at org.modeshape.graph.query.process.ProjectComponent.execute(ProjectComponent.java:48)
        at org.modeshape.graph.query.process.QueryProcessor.execute(QueryProcessor.java:100)
        at org.modeshape.graph.query.QueryEngine.execute(QueryEngine.java:124)
        at org.modeshape.jcr.RepositoryQueryManager$SelfContained.query(RepositoryQueryManager.java:435)
        at org.modeshape.jcr.JcrQueryManager$SessionQueryContext.execute(JcrQueryManager.java:1422)
        at org.modeshape.jcr.query.JcrQuery.execute(JcrQuery.java:103)
        at com.cht.member.MemberAuthorizationServiceBeanTest.testJoinQuery(MemberAuthorizationServiceBeanTest.java:127)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
      

       

      Is thrown by this code: 

       

          final Session session = repository.login(new SimpleCredentials("jsmith", "secret".toCharArray()));
          final NamespaceRegistry registry = session.getWorkspace().getNamespaceRegistry();
          
          final String NAMESPACE_PREFIX = "tt";
          final String NAMESPACE_URI = "http://test.com/tt";
          final String FRIENDLY = "tt:friendly";
          final String FRIEND = "tt:friend";
          
          registry.registerNamespace(NAMESPACE_PREFIX, NAMESPACE_URI);
          
          NodeTypeManager manager = session.getWorkspace().getNodeTypeManager();
          NodeTypeTemplate nodeType = manager.createNodeTypeTemplate();
          nodeType.setMixin(true);
          nodeType.setName(FRIENDLY);
          nodeType.setQueryable(true);
          nodeType.setDeclaredSuperTypeNames(new String[]{"mix:referenceable"});
          
          PropertyDefinitionTemplate propertyDef = manager.createPropertyDefinitionTemplate();
          propertyDef.setName(FRIEND);
          propertyDef.setMultiple(true);
          propertyDef.setRequiredType(PropertyType.REFERENCE);
          propertyDef.setOnParentVersion(OnParentVersionAction.COPY);
          propertyDef.setProtected(false);
          
          nodeType.getPropertyDefinitionTemplates().add(propertyDef);
          manager.registerNodeType(nodeType, true);
        
          final String USER_NAME = "Paul";
          final Node userNode = session.getRootNode().addNode(USER_NAME, "nt:folder");
          userNode.addMixin(FRIENDLY);
          
          session.save();
        
          final QueryManager queryManager = session.getWorkspace().getQueryManager();
          final String expression = "SELECT grantee.* FROM [tt:friendly] as grantor " +
              "INNER JOIN [tt:friendly] as grantee ON grantor.[tt:friend] = grantee.[jcr:uuid] "; 
          
          final QueryResult queryResult = queryManager.createQuery(expression, "JCR-SQL2").execute();
      
      

       

      but not if I comment the line adding the mixin

       

      userNode.addMixin(FRIENDLY);
      

       

      Without adding a node with the "tt:friendly" mixin, the query runs fine.

       

      Any idea?

       

       

      Thanks