|
ModeShape Distribution 3.0.0.Beta4 | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.modeshape.jcr.query.parse.BasicSqlQueryParser
org.modeshape.jcr.query.parse.JcrSqlQueryParser
public class JcrSqlQueryParser
Parser for JCR-SQL queries that produces abstract query model (AQM)
objects.
This section defines the complete grammar for the JCR-SQL dialect supported by this parser, as defined by the
JCR 1.0.1 specification. This parser actually extends the (extended) JCR-SQL2 parser
,
and thus allows many of the JCR-SQL2 standard and extended features, although there are several key differences:
jcr:scoreas a pseudo-column.
jcr:pathas a pseudo-column.
QueryCommand ::= Query | SetQuery SetQuery ::= Query ('UNION'|'INTERSECT'|'EXCEPT') [ALL] Query { ('UNION'|'INTERSECT'|'EXCEPT') [ALL] Query } Query ::= 'SELECT' ['DISINCT'] columns 'FROM' Source ['WHERE' Constraint] ['ORDER BY' orderings] [Limit]
Source ::= Selector | Join Selector ::= nodeTypeName ['AS' selectorName] nodeTypeName ::= Name
Join ::= left [JoinType] 'JOIN' right 'ON' JoinCondition // If JoinType is omitted INNER is assumed. left ::= Source right ::= Source JoinType ::= Inner | LeftOuter | RightOuter | FullOuter | Cross Inner ::= 'INNER' ['JOIN'] LeftOuter ::= 'LEFT JOIN' | 'OUTER JOIN' | 'LEFT OUTER JOIN' RightOuter ::= 'RIGHT OUTER' ['JOIN'] RightOuter ::= 'FULL OUTER' ['JOIN'] RightOuter ::= 'CROSS' ['JOIN'] JoinCondition ::= EquiJoinCondition | SameNodeJoinCondition | ChildNodeJoinCondition | DescendantNodeJoinCondition
EquiJoinCondition ::= selector1Name'.'property1Name '=' selector2Name'.'property2Name selector1Name ::= selectorName selector2Name ::= selectorName property1Name ::= propertyName property2Name ::= propertyName
SameNodeJoinCondition ::= 'ISSAMENODE(' selector1Name ',' selector2Name [',' selector2Path] ')' selector2Path ::= Path
ChildNodeJoinCondition ::= 'ISCHILDNODE(' childSelectorName ',' parentSelectorName ')' childSelectorName ::= selectorName parentSelectorName ::= selectorName
DescendantNodeJoinCondition ::= 'ISDESCENDANTNODE(' descendantSelectorName ',' ancestorSelectorName ')' descendantSelectorName ::= selectorName ancestorSelectorName ::= selectorName
Constraint ::= ConstraintItem | '(' ConstraintItem ')' ConstraintItem ::= And | Or | Not | Comparison | Between | PropertyExistence | SetConstraint | FullTextSearch | SameNode | ChildNode | DescendantNode
And ::= constraint1 'AND' constraint2 constraint1 ::= Constraint constraint2 ::= Constraint
Or ::= constraint1 'OR' constraint2
Not ::= 'NOT' Constraint
Comparison ::= DynamicOperand Operator StaticOperand Operator ::= '=' | '!=' | '<' | '<=' | '>' | '>=' | 'LIKE'
Between ::= DynamicOperand ['NOT'] 'BETWEEN' lowerBound ['EXCLUSIVE'] 'AND' upperBound ['EXCLUSIVE'] lowerBound ::= StaticOperand upperBound ::= StaticOperand
PropertyExistence ::= selectorName'.'propertyName 'IS' ['NOT'] 'NULL' | propertyName 'IS' ['NOT'] 'NULL' /* If only one selector exists in this query */
SetConstraint ::= selectorName'.'propertyName ['NOT'] 'IN' | propertyName ['NOT'] 'IN' /* If only one selector exists in this query */ '(' firstStaticOperand {',' additionalStaticOperand } ')' firstStaticOperand ::= StaticOperand additionalStaticOperand ::= StaticOperand
FullTextSearch ::= 'CONTAINS(' ([selectorName'.']propertyName | selectorName'.*')
',' ''' fullTextSearchExpression''' ')'
/* If only one selector exists in this query, explicit specification of the selectorName
preceding the propertyName is optional */
fullTextSearchExpression ::= /* a full-text search expression, see FullTextSearchParser
*/
SameNode ::= 'ISSAMENODE(' [selectorName ','] Path ')' /* If only one selector exists in this query, explicit specification of the selectorName preceding the propertyName is optional */
ChildNode ::= 'ISCHILDNODE(' [selectorName ','] Path ')' /* If only one selector exists in this query, explicit specification of the selectorName preceding the propertyName is optional */
DescendantNode ::= 'ISDESCENDANTNODE(' [selectorName ','] Path ')' /* If only one selector exists in this query, explicit specification of the selectorName preceding the propertyName is optional */
Name ::= '[' quotedName ']' | '[' simpleName ']' | simpleName quotedName ::= /* A JCR Name (see the JCR specification) */ simpleName ::= /* A JCR Name that contains only SQL-legal characters (namely letters, digits, and underscore) */ Path ::= '[' quotedPath ']' | '[' simplePath ']' | simplePath quotedPath ::= /* A JCR Path that contains non-SQL-legal characters */ simplePath ::= /* A JCR Path (rather Name) that contains only SQL-legal characters (namely letters, digits, and underscore) */
StaticOperand ::= Literal | BindVariableValue
Literal ::= CastLiteral | UncastLiteral CastLiteral ::= 'CAST(' UncastLiteral ' AS ' PropertyType ')' PropertyType ::= 'STRING' | 'BINARY' | 'DATE' | 'LONG' | 'DOUBLE' | 'DECIMAL' | 'BOOLEAN' | 'NAME' | 'PATH' | 'REFERENCE' | 'WEAKREFERENCE' | 'URI' UncastLiteral ::= UnquotedLiteral | ''' UnquotedLiteral ''' | '"' UnquotedLiteral '"' UnquotedLiteral ::= /* String form of a JCR Value, as defined in the JCR specification */
BindVariableValue ::= '$'bindVariableName bindVariableName ::= /* A string that conforms to the JCR Name syntax, though the prefix does not need to be a registered namespace prefix. */
DynamicOperand ::= PropertyValue | ReferenceValue | Length | NodeName | NodeLocalName | NodePath | NodeDepth | FullTextSearchScore | LowerCase | UpperCase | Arithmetic | '(' DynamicOperand ')'
PropertyValue ::= [selectorName'.'] propertyName /* If only one selector exists in this query, explicit specification of the selectorName preceding the propertyName is optional */
ReferenceValue ::= 'REFERENCE(' selectorName '.' propertyName ')' | 'REFERENCE(' selectorName ')' | 'REFERENCE()' | /* If only one selector exists in this query, explicit specification of the selectorName preceding the propertyName is optional. Also, the property name may be excluded if the constraint should apply to any reference property. */
Length ::= 'LENGTH(' PropertyValue ')'
NodeName ::= 'NAME(' [selectorName] ')' /* If only one selector exists in this query, explicit specification of the selectorName is optional */
NodeLocalName ::= 'LOCALNAME(' [selectorName] ')' /* If only one selector exists in this query, explicit specification of the selectorName is optional */
NodePath ::= 'PATH(' [selectorName] ')' /* If only one selector exists in this query, explicit specification of the selectorName is optional */
NodeDepth ::= 'DEPTH(' [selectorName] ')' /* If only one selector exists in this query, explicit specification of the selectorName is optional */
FullTextSearchScore ::= 'SCORE(' [selectorName] ')' /* If only one selector exists in this query, explicit specification of the selectorName is optional */
LowerCase ::= 'LOWER(' DynamicOperand ')'
UpperCase ::= 'UPPER(' DynamicOperand ')'
Arithmetic ::= DynamicOperand ('+'|'-'|'*'|'/') DynamicOperand
orderings ::= Ordering {',' Ordering} Ordering ::= DynamicOperand [Order] Order ::= 'ASC' | 'DESC'
columns ::= (Column ',' {Column}) | '*' Column ::= ([selectorName'.']propertyName ['AS' columnName]) | (selectorName'.*') /* If only one selector exists in this query, explicit specification of the selectorName preceding the propertyName is optional */ selectorName ::= Name propertyName ::= Name columnName ::= Name
Limit ::= 'LIMIT' count [ 'OFFSET' offset ] count ::= /* Positive integer value */ offset ::= /* Non-negative integer value */
Nested Class Summary | |
---|---|
protected static class |
JcrSqlQueryParser.JoinableSources
|
Nested classes/interfaces inherited from class org.modeshape.jcr.query.parse.BasicSqlQueryParser |
---|
BasicSqlQueryParser.SqlTokenizer |
Field Summary | |
---|---|
static String |
LANGUAGE
|
Constructor Summary | |
---|---|
JcrSqlQueryParser()
|
Method Summary | |
---|---|
String |
getLanguage()
Get the name of the language that this parser is able to understand. |
protected SelectorName |
getSelectorNameFor(Source source)
|
protected Constraint |
parseConstraint(TokenStream tokens,
TypeSystem typeSystem,
Source source)
Parse a constraint clause. |
protected Source |
parseFrom(TokenStream tokens,
TypeSystem typeSystem)
|
protected Object |
parseLiteralValue(TokenStream tokens,
TypeSystem typeSystem)
|
protected String |
parseName(TokenStream tokens,
TypeSystem typeSystem)
Parsing behavior is overridden to that JCR-SQL style (unquoted prefixed) names are allowed. |
protected Constraint |
parsePropertyExistance(TokenStream tokens,
TypeSystem typeSystem,
Source source)
|
protected Query |
parseQuery(TokenStream tokens,
TypeSystem typeSystem)
|
protected String |
removeBracketsAndQuotes(String text,
Position position)
Remove all leading and trailing single-quotes, double-quotes, or square brackets from the supplied text. |
protected Source |
rewrite(JcrSqlQueryParser.JoinableSources joinableSources)
|
protected Constraint |
rewriteConstraint(Constraint constraint)
|
protected boolean |
usesSelector(Join join,
SelectorName selector)
|
Methods inherited from class java.lang.Object |
---|
clone, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
public static final String LANGUAGE
Constructor Detail |
---|
public JcrSqlQueryParser()
Method Detail |
---|
public String getLanguage()
getLanguage
in interface QueryParser
getLanguage
in class BasicSqlQueryParser
QueryParser.getLanguage()
protected Query parseQuery(TokenStream tokens, TypeSystem typeSystem)
parseQuery
in class BasicSqlQueryParser
BasicSqlQueryParser.parseQuery(org.modeshape.common.text.TokenStream,
org.modeshape.jcr.query.model.TypeSystem)
protected Source parseFrom(TokenStream tokens, TypeSystem typeSystem)
parseFrom
in class BasicSqlQueryParser
BasicSqlQueryParser.parseFrom(org.modeshape.common.text.TokenStream,
org.modeshape.jcr.query.model.TypeSystem)
protected Constraint parseConstraint(TokenStream tokens, TypeSystem typeSystem, Source source)
jcr:path
" and "jcr:score
" pseudo-columns. In these special cases, the
resulting comparison
will have a NodePath
or FullTextSearchScore
dynamic operand.
parseConstraint
in class BasicSqlQueryParser
BasicSqlQueryParser.parseConstraint(org.modeshape.common.text.TokenStream,
org.modeshape.jcr.query.model.TypeSystem, org.modeshape.jcr.query.model.Source)
protected Constraint parsePropertyExistance(TokenStream tokens, TypeSystem typeSystem, Source source)
parsePropertyExistance
in class BasicSqlQueryParser
protected SelectorName getSelectorNameFor(Source source)
protected Constraint rewriteConstraint(Constraint constraint)
protected String parseName(TokenStream tokens, TypeSystem typeSystem)
Parsing behavior is overridden to that JCR-SQL style (unquoted prefixed) names are allowed. This method parses the selector
name, which may be of the form "unprefixedName
" (consisting of a single token) or "prefix:name
"
(consisting of three tokens).
parseName
in class BasicSqlQueryParser
BasicSqlQueryParser.parseName(org.modeshape.common.text.TokenStream,
org.modeshape.jcr.query.model.TypeSystem)
protected Object parseLiteralValue(TokenStream tokens, TypeSystem typeSystem)
parseLiteralValue
in class BasicSqlQueryParser
BasicSqlQueryParser.parseLiteralValue(org.modeshape.common.text.TokenStream,
org.modeshape.jcr.query.model.TypeSystem)
protected String removeBracketsAndQuotes(String text, Position position)
BasicSqlQueryParser
removeBracketsAndQuotes
in class BasicSqlQueryParser
text
- the input text; may not be nullposition
- the position of the text; may not be null
text
if there were no square brackets or
quotesprotected Source rewrite(JcrSqlQueryParser.JoinableSources joinableSources)
protected boolean usesSelector(Join join, SelectorName selector)
|
ModeShape Distribution 3.0.0.Beta4 | |||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |