jackrabbit-oak-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas Mueller (Created) (JIRA)" <j...@apache.org>
Subject [jira] [Created] (OAK-28) Query implementation
Date Fri, 16 Mar 2012 15:25:39 GMT
Query implementation

                 Key: OAK-28
                 URL: https://issues.apache.org/jira/browse/OAK-28
             Project: Jackrabbit Oak
          Issue Type: New Feature
          Components: core
            Reporter: Thomas Mueller
            Assignee: Thomas Mueller

A query engine needs to be implemented. 

This includes a query parser in oak-core (where we don't want to use the JCR API), and a query
parser in oak-jcr (where the parsed query tree needs to implement the JCR API).

To avoid writing two independent parsers, I suggest to change the parser to emit a non-JCR
query tree (so the parser can be used in oak-core). There needs to be a converter from the
non-JCR query tree to a JCR query tree, so the same parser can be used in oak-jcr.

This will still require two independent query tree implementations (about 37 duplicated classes:
37 classes for oak-core and 37 classes in oak-jcr). Plus it requires a tree converter.

If somebody has a better idea please tell me :-)

Prototype implementation of the query tree converter. Please note the class names are only
to for illustration, but I don't know yet a good naming convention. Ideas are welcome!

import javax.jcr.query.qom.And;
import javax.jcr.query.qom.Constraint;
public class OakToJcrQueryTreeConverter {
    public static void main(String... args) {
        OakAnd oak = new OakAnd();
        oak.constraint1 = new OakConstraint();
        oak.constraint1.s = "x=1";
        oak.constraint2 = new OakConstraint();
        oak.constraint2.s = "y=1";
        System.out.println("Oak constraint: " + oak);
        JcrConstraint jcr = convertOakToJcr(oak);
        System.out.println("JCR constraint: " + jcr);
    static JcrConstraint convertOakToJcr(OakConstraint constraint) {
        if (constraint instanceof OakAnd) {
            OakAnd o = (OakAnd) constraint;
            return new JcrAnd(o.constraint1, o.constraint2);
        } else {
            JcrConstraint c = new JcrConstraint();
            c.s = constraint.s;
            return c;
class OakConstraint {
    String s;
    public String toString() {
        return "(OakConstraint) " + s;
class OakAnd extends OakConstraint {
    public OakConstraint constraint1, constraint2;
    public String toString() {
        return constraint1 + " and " + constraint2;
class JcrConstraint implements Constraint {
    String s;
    public String toString() {
        return "(JcrConstraint) " + s;
class JcrAnd extends JcrConstraint implements And {
    JcrConstraint constraint1, constraint2;
    JcrAnd(OakConstraint constraint1, OakConstraint constraint2) {
        this.constraint1 = OakToJcrQueryTreeConverter.convertOakToJcr(constraint1);
        this.constraint2 = OakToJcrQueryTreeConverter.convertOakToJcr(constraint2);
    public JcrConstraint getConstraint1() {
        return constraint1;
    public JcrConstraint getConstraint2() {
        return constraint2;
    public String toString() {
        return constraint1 + " and " + constraint2;

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


View raw message