func GroupByBindingsChecker() ClauseHook {
	return groupByBindingsChecker()
}
GroupByBindingsChecker returns the singleton to check that the group by
bindings are valid.
package semantic
import (
	"fmt"
	"regexp"
	"strings"
	"time"
	"github.com/google/badwolf/bql/lexer"
	"github.com/google/badwolf/bql/planner/filter"
	"github.com/google/badwolf/bql/table"
	"github.com/google/badwolf/triple"
	"github.com/google/badwolf/triple/literal"
	"github.com/google/badwolf/triple/node"
	"github.com/google/badwolf/triple/predicate"
)
type ClauseHook func(*Statement, Symbol) (ClauseHook, error)
type ElementHook func(*Statement, ConsumedElement) (ElementHook, error)
var (
	predicateRegexp = regexp.MustCompile(`^"(.+)"@\["?([^\]"]*)"?\]$`)
	// boundRegexp contains the regular expression for not fully defined predicate bounds.
	boundRegexp = regexp.MustCompile(`^"(.+)"@\["?([^\]"]*)"?,"?([^\]"]*)"?\]$`)
)
func DataAccumulatorHook() ElementHook {
	return dataAccumulator(literal.DefaultBuilder())
}
func GraphAccumulatorHook() ElementHook {
	return graphAccumulator()
}
func InputGraphAccumulatorHook() ElementHook {
	return inputGraphAccumulator()
}
func OutputGraphAccumulatorHook() ElementHook {
	return outputGraphAccumulator()
}
func WhereInitWorkingClauseHook() ClauseHook {
	return whereInitWorkingClause()
}
func WhereNextWorkingClauseHook() ClauseHook {
	return whereNextWorkingClause()
}
func WhereSubjectClauseHook() ElementHook {
	return whereSubjectClause()
}
func WherePredicateClauseHook() ElementHook {
	return wherePredicateClause()
}
func WhereObjectClauseHook() ElementHook {
	return whereObjectClause()
}
func WhereFilterClauseHook() ElementHook {
	return whereFilterClause()
}
func VarAccumulatorHook() ElementHook {
	return varAccumulator()
}
func VarBindingsGraphChecker() ClauseHook {
	return bindingsGraphChecker()
}
func GroupByBindings() ElementHook {
	return groupByBindings()
}