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

com.bigdata.rdf.sparql.ast.GroupNodeVarBindingInfo Maven / Gradle / Ivy

/**

Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

Contact:
     SYSTAP, LLC DBA Blazegraph
     2501 Calvert ST NW #106
     Washington, DC 20008
     [email protected]

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
/*
 * Created on June 18, 2015
 */
package com.bigdata.rdf.sparql.ast;

import java.util.HashSet;
import java.util.Set;

import com.bigdata.bop.IVariable;
import com.bigdata.rdf.sparql.ast.optimizers.ASTJoinGroupFilterExistsInfo;



/**
 * Class summarizing the variable binding requirements for a given node
 * (used for children in the join group), thus providing easy access to its
 * variable binding information {@link IGroupMemberNode}s.
 * 
 * @author Michael Schmidt
 * @version $Id$
 */
public class GroupNodeVarBindingInfo {
   /**
    * The node for which the information is valid.
    */
   final private IGroupMemberNode node;
   
   /**
    * Variables that must be bound upon evaluation of this node,
    * see {@link IVariableBindingRequirements} for detailed documentation.
    */
   final private Set> requiredBound;
   
   /**
    * Variables that are desired to be bound upon evaluation of this node,
    * see {@link IVariableBindingRequirements} for detailed documentation.
    */
   final private Set> desiredBound;

   /**
    * Variables that are possibly bound by this node.
    */
   final private Set> maybeProduced;

   /**
    * Variables that are definitely bound by this node.
    */
   final private Set> definitelyProduced;


   /**
    * Constructor
    * @param node
    * @param sa
    */
   public GroupNodeVarBindingInfo(
      final IGroupMemberNode node, 
      final StaticAnalysis sa,
      final ASTJoinGroupFilterExistsInfo fExInfo) {
      
      this.node = node;
      this.requiredBound = node.getRequiredBound(sa);
      this.desiredBound = node.getDesiredBound(sa);
      
      this.maybeProduced = new HashSet>();
      if (node instanceof IBindingProducerNode) {
         sa.getMaybeProducedBindings(
            (IBindingProducerNode)node, maybeProduced, true);
      }
      
      this.definitelyProduced = new HashSet>();
      if (node instanceof IBindingProducerNode) {
         
         if (!StaticAnalysis.isMinusOrOptional(node)) {
            
            sa.getDefinitelyProducedBindings(
               (IBindingProducerNode)node, definitelyProduced, true);
         }
      }

      /**
       * Special handing for ASK subqueries. See also ticket #BLZG-1284
       * and the associated test in TestTickets for why this is necessary.
       */
      if (fExInfo!=null && node instanceof SubqueryRoot && 
            fExInfo.containsSubqueryRoot((SubqueryRoot)node)) {
         
         final SubqueryRoot sqr = (SubqueryRoot)node;

         // there are no variables that are desired bound (all are required)
         this.desiredBound.clear();
         
         // in addition to what's reported by getDefinitelyProducedBindings,
         // the askVar of the subquery must be considered
         this.definitelyProduced.add(sqr.getAskVar());
         
         // required are all projection vars minus the ask var, i.e. these
         // must be bound when evaluating the FILTER (NOT) EXISTS node
         sqr.getProjectedVars(this.requiredBound);
         this.requiredBound.remove(sqr.getAskVar());
      }
   }
   
   public IGroupMemberNode getNode() {
      return node;
   }

   public Set> getRequiredBound() {
      return requiredBound;
   }

   public Set> getDesiredBound() {
      return desiredBound;
   }

   public Set> getMaybeProduced() {
      return maybeProduced;
   }

   public Set> getDefinitelyProduced() {
      return definitelyProduced;
   }


   /**
    * Get variables that remain to be bound, assuming that the definitely
    * incoming variables plus the variables passed as parameter are bound
    * already.
    */
   public Set> leftToBeBound(Set> knownBound) {
      
      HashSet> toBeBound = new HashSet>();
      toBeBound.addAll(requiredBound);
      toBeBound.removeAll(knownBound);
      
      return toBeBound;
      
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy