if ( !StringUtils.isEmpty( patternDescr.getIdentifier() ) ) {
if ( query.isAbductive() ) {
Declaration declr = context.getDeclarationResolver().getDeclaration( query, patternDescr.getIdentifier() );
if ( declr != null && ! patternDescr.isUnification() ) {
context.addError( new DescrBuildError( context.getParentDescr(),
descr,
null,
"Duplicate declaration " + patternDescr.getIdentifier() +", unable to bind abducted value" ) );
}
} else {
context.addError( new DescrBuildError( context.getParentDescr(),
descr,
null,
"Query binding is not supported by non-abductive queries : " + patternDescr.getIdentifier() ) );
}
}
boolean addAbductiveReturnArgument = query.isAbductive()
&& ! StringUtils.isEmpty( patternDescr.getIdentifier() )
&& args.size() < params.length;
if ( addAbductiveReturnArgument ) {
ExprConstraintDescr extraDescr = new ExprConstraintDescr( patternDescr.getIdentifier() );
extraDescr.setPosition( patternDescr.getConstraint().getDescrs().size() );
extraDescr.setType( ExprConstraintDescr.Type.POSITIONAL );
args.add( extraDescr );
}
// Deal with the constraints, both positional and bindings
for ( int i = 0, length = args.size(); i < length; i++ ) {
BaseDescr base = args.get( i );
String expression = null;
boolean isPositional = false;
boolean isBinding = false;
BindingDescr bind = null;
ConstraintConnectiveDescr result = null;
if ( base instanceof BindingDescr ) {
bind = (BindingDescr) base;
expression = bind.getVariable() + (bind.isUnification() ? " := " : " : ") + bind.getExpression();
isBinding = true;
} else {
if ( base instanceof ExprConstraintDescr ) {
ExprConstraintDescr ecd = (ExprConstraintDescr) base;
expression = ecd.getExpression();
isPositional = ecd.getType() == ExprConstraintDescr.Type.POSITIONAL;
} else {
expression = base.getText();
}
result = parseExpression( context,
patternDescr,
expression );
if ( result == null ) {
// error, can't parse expression.
context.addError( new DescrBuildError( context.getParentDescr(),
descr,
null,
"Unable to parse constraint: \n" + expression ) );
continue;
}
isBinding = result.getDescrs().size() == 1 && result.getDescrs().get( 0 ) instanceof BindingDescr;
if ( isBinding ) {
bind = (BindingDescr) result.getDescrs().get( 0 );
}
}
if ( (!isPositional) && (!isBinding) ) {
// error, can't have non binding slots.
context.addError( new DescrBuildError( context.getParentDescr(),
descr,
null,
"Query's must use positional or bindings, not field constraints:\n" + expression ) );
continue;
} else if ( isPositional && isBinding ) {
// error, can't have positional binding slots.
context.addError( new DescrBuildError( context.getParentDescr(),
descr,
null,
"Query's can't use positional bindings:\n" + expression ) );
continue;
} else if ( isPositional ) {