All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.jena.sparql.expr.Expr Maven / Gradle / Ivy

There is a newer version: 5.1.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.jena.sparql.expr;

import java.util.Collection ;
import java.util.Set ;

import javax.xml.datatype.DatatypeConstants ;

import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.function.FunctionEnv ;
import org.apache.jena.sparql.graph.NodeTransform;

public interface Expr
{
    public static final Expr NONE = ExprNone.NONE0 ;
    
    public static final int CMP_GREATER  =  DatatypeConstants.GREATER ;
    public static final int CMP_EQUAL    =  DatatypeConstants.EQUAL ;
    public static final int CMP_LESS     =  DatatypeConstants.LESSER ;
    
    public static final int CMP_UNEQUAL  = -9 ;
    public static final int CMP_INDETERMINATE  = DatatypeConstants.INDETERMINATE ;
    
    /** Test whether a Constraint is satisfied, given a set of bindings
     *  Includes error propagation and Effective Boolean Value rules.
     * 
     * @param binding   The bindings
     * @param execCxt   FunctionEnv   
     * @return  true or false
     */ 
    public boolean isSatisfied(Binding binding, FunctionEnv execCxt) ;
  
    /**
     * Variables used by this expression.
     * @see ExprVars#getVarNamesMentioned
     * @see ExprVars#getNonOpVarNamesMentioned
     */
    public Set  getVarsMentioned() ;
    /** 
     * Variables used by this expression.
     * @deprecated Use {@link ExprVars#varNamesMentioned} or {@link ExprVars#varNamesMentioned}
     */
    @Deprecated
    public void varsMentioned(Collection acc) ;
    
    /** 
     * Evaluate this expression against the binding
     * @param binding 
     * @param env
     */
    public NodeValue eval(Binding binding, FunctionEnv env) ;
    
    /** Deep copy with substitution */
    public Expr copySubstitute(Binding binding) ;

    /**
     * Rewrite, applying a node{@literal ->}node transformation
     */
    public Expr applyNodeTransform(NodeTransform transform) ;

    /** Deep copy */
    public Expr deepCopy() ;
    
    /** Answer whether this is a variable. */ 
    public boolean isVariable() ;
    /** Variable name (returns null if not a variable) */
    public String  getVarName() ;
    /** Variable (or null) */
    public ExprVar getExprVar() ;
    /** Convert to a Var variable.*/
    public Var asVar() ;

    /** Answer whether this is a constant expression - false includes "don't know"
     *  No constant folding so "false" from an expression that evaluates to a constant
     */  
    public boolean   isConstant() ;
    /** NodeValue constant (returns null if not a constant) */
    public NodeValue getConstant() ;
    
    /** Answer whether this is a function. */
    public boolean isFunction() ;
    /** Get the function (returns null if not a function) */
    public ExprFunction getFunction() ;
    
    public void visit(ExprVisitor visitor) ;
    
    /**
     * Expr are used in both syntax and algebra. There is no syntax
     * to algebra translation step because the parser uses operator precedence
     * to build the right evaluation structure directly.
     * 

* The exceptions to this are the NOT EXISTS and * EXISTS expressions which involve a query pattern. As a * result there are different ways in syntax to produce the same algebra * form. *

* Two Expr are considered equal if they are equal as algebra * expressions. hashCode and equals must implement * that. *

* There is also equalsBySyntax. Because two different syntax * forms can yield the same algebra, but two different algebra forms * must be different syntax, equalsBySyntax implies equals * (by alegbra). *

* Hence, different hashCode {@literal =>} not equalsBySyntax. */ @Override public int hashCode() ; @Override public boolean equals(Object other) ; public boolean equalsBySyntax(Expr other) ; /** General equality operation - consider this to be 'protected' */ public boolean equals(Expr other, boolean bySyntax) ; }