Пример #1
0
func newSargDefault(expr expression.Expression) *sargDefault {
	var spans Spans
	if expr.PropagatesNull() {
		spans = _VALUED_SPANS
	} else if expr.PropagatesMissing() {
		spans = _FULL_SPANS
	}

	rv := &sargDefault{}
	rv.sarg = func(expr2 expression.Expression) (Spans, error) {
		if expr.EquivalentTo(expr2) {
			return _SELF_SPANS, nil
		}

		if spans != nil && expr.DependsOn(expr2) {
			return _VALUED_SPANS, nil
		}

		if spans != nil && expr.DependsOn(expr2) {
			return _FULL_SPANS, nil
		}

		return nil, nil
	}

	return rv
}
Пример #2
0
func newSargableDefault(expr expression.Expression) *sargableDefault {
	rv := &sargableDefault{}
	rv.test = func(expr2 expression.Expression) (bool, error) {
		return expr.EquivalentTo(expr2), nil
	}

	return rv
}
Пример #3
0
func newSubsetDefault(expr expression.Expression) *subsetDefault {
	rv := &subsetDefault{}
	rv.test = func(expr2 expression.Expression) (bool, error) {
		value2 := expr2.Value()
		if value2 != nil {
			return value2.Truth(), nil
		}

		if expr.EquivalentTo(expr2) {
			return true, nil
		}

		switch expr2 := expr2.(type) {
		case *expression.And:
			for _, op := range expr2.Operands() {
				if !SubsetOf(expr, op) {
					return false, nil
				}
			}

			return true, nil
		case *expression.Or:
			for _, op := range expr2.Operands() {
				if SubsetOf(expr, op) {
					return true, nil
				}
			}

			return false, nil
		case *expression.IsNotMissing:
			return expr.PropagatesMissing() &&
				expr.DependsOn(expr2.Operand()), nil
		case *expression.IsNotNull:
			return expr.PropagatesNull() &&
				expr.DependsOn(expr2.Operand()), nil
		case *expression.IsValued:
			return expr.PropagatesNull() &&
				expr.DependsOn(expr2.Operand()), nil
		}

		return false, nil
	}

	return rv
}
Пример #4
0
func LessThanOrEquals(expr1, expr2 expression.Expression) bool {
	return LessThan(expr1, expr2) || expr1.EquivalentTo(expr2)
}