Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/lib/postgresql/src/Flow/PostgreSql/DSL/condition.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ function between(string|Expression $expr, string|Expression $low, string|Express
$expr instanceof Expression ? $expr : col($expr),
$low instanceof Expression ? $low : col($low),
$high instanceof Expression ? $high : col($high),
$not,
negated: $not,
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@

namespace Flow\PostgreSql\QueryBuilder\Condition;

use Flow\PostgreSql\Protobuf\AST\A_Expr_Kind;
use Flow\PostgreSql\Protobuf\AST\BoolExpr;
use Flow\PostgreSql\Protobuf\AST\BoolExprType;
use Flow\PostgreSql\Protobuf\AST\Node;
use Flow\PostgreSql\Protobuf\AST\SubLinkType;
use Flow\PostgreSql\QueryBuilder\Exception\InvalidAstException;
use Flow\PostgreSql\QueryBuilder\Exception\UnsupportedNodeException;
use Flow\PostgreSql\QueryBuilder\Expression\AliasedExpression;

final readonly class AndCondition implements Condition
Expand Down Expand Up @@ -47,7 +44,7 @@ public static function fromAst(Node $node): static
$conditions = [];

foreach ($boolExpr->getArgs() as $argNode) {
$conditions[] = self::conditionFromNode($argNode);
$conditions[] = ConditionFactory::fromAst($argNode);
}

return new self(...$conditions);
Expand Down Expand Up @@ -95,69 +92,4 @@ public function toAst(): Node

return $node;
}

private static function conditionFromNode(Node $node): Condition
{
if ($node->hasBoolExpr()) {
$boolExpr = $node->getBoolExpr();

if ($boolExpr === null) {
throw InvalidAstException::missingRequiredField('bool_expr', 'Node');
}

return match ($boolExpr->getBoolop()) {
BoolExprType::AND_EXPR => self::fromAst($node),
BoolExprType::OR_EXPR => OrCondition::fromAst($node),
BoolExprType::NOT_EXPR => NotCondition::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'BoolExpr with ' . (string) BoolExprType::name($boolExpr->getBoolop()),
),
};
}

if ($node->hasAExpr()) {
$aExpr = $node->getAExpr();

if ($aExpr === null) {
throw InvalidAstException::missingRequiredField('a_expr', 'Node');
}

return match ($aExpr->getKind()) {
A_Expr_Kind::AEXPR_OP => Comparison::fromAst($node),
A_Expr_Kind::AEXPR_LIKE => Like::fromAst($node),
A_Expr_Kind::AEXPR_ILIKE => Like::fromAst($node),
A_Expr_Kind::AEXPR_SIMILAR => SimilarTo::fromAst($node),
A_Expr_Kind::AEXPR_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_NOT_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_OP_ANY => Any::fromAst($node),
A_Expr_Kind::AEXPR_OP_ALL => All::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN_SYM => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN_SYM => Between::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'A_Expr with kind: ' . (string) A_Expr_Kind::name($aExpr->getKind()),
),
};
}

if ($node->hasSubLink()) {
$subLink = $node->getSubLink();

if ($subLink === null) {
throw InvalidAstException::missingRequiredField('sub_link', 'Node');
}

return match ($subLink->getSubLinkType()) {
SubLinkType::EXISTS_SUBLINK => Exists::fromAst($node),
SubLinkType::ANY_SUBLINK => Any::fromAst($node),
SubLinkType::ALL_SUBLINK => All::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'SubLink with type: ' . (string) SubLinkType::name($subLink->getSubLinkType()),
),
};
}

throw UnsupportedNodeException::forNodeType('unknown node type in condition');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,12 @@ public function toAst(): Node
$listNode = new Node(['list' => $list]);

$nameString = new PBString();
$nameString->setSval('BETWEEN');
$nameString->setSval(match (true) {
$this->symmetric && $this->negated => 'NOT BETWEEN SYMMETRIC',
$this->symmetric => 'BETWEEN SYMMETRIC',
$this->negated => 'NOT BETWEEN',
default => 'BETWEEN',
});
$nameNode = new Node(['string' => $nameString]);

$aExpr = new A_Expr([
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@ public static function fromAst(Node $node): Condition
A_Expr_Kind::AEXPR_SIMILAR => SimilarTo::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN_SYM => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN_SYM => Between::fromAst($node),
A_Expr_Kind::AEXPR_IN => In::fromAst($node),
A_Expr_Kind::AEXPR_OP_ANY => Any::fromAst($node),
A_Expr_Kind::AEXPR_OP_ALL => All::fromAst($node),
A_Expr_Kind::AEXPR_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_NOT_DISTINCT => IsDistinctFrom::fromAst($node),
default => throw UnsupportedNodeException::forNodeType("A_Expr kind: {$kind}"),
default => throw UnsupportedNodeException::forNodeType('A_Expr kind: '
. (string) A_Expr_Kind::name($kind)),
};
}

Expand All @@ -52,7 +55,8 @@ public static function fromAst(Node $node): Condition
BoolExprType::AND_EXPR => AndCondition::fromAst($node),
BoolExprType::OR_EXPR => OrCondition::fromAst($node),
BoolExprType::NOT_EXPR => NotCondition::fromAst($node),
default => throw UnsupportedNodeException::forNodeType("BoolExpr type: {$boolOp}"),
default => throw UnsupportedNodeException::forNodeType('BoolExpr type: '
. (string) BoolExprType::name($boolOp)),
};
}

Expand All @@ -69,15 +73,13 @@ public static function fromAst(Node $node): Condition
SubLinkType::EXISTS_SUBLINK => Exists::fromAst($node),
SubLinkType::ANY_SUBLINK => Any::fromAst($node),
SubLinkType::ALL_SUBLINK => All::fromAst($node),
default => throw UnsupportedNodeException::forNodeType("SubLink type: {$subLinkType}"),
SubLinkType::EXPR_SUBLINK => BooleanCondition::fromAst($node),
default => throw UnsupportedNodeException::forNodeType('SubLink type: '
. (string) SubLinkType::name($subLinkType)),
};
}

if ($node->getAConst() !== null || $node->getColumnRef() !== null) {
return BooleanCondition::fromAst($node);
}

throw UnsupportedNodeException::forNodeType('Unknown condition node type');
return BooleanCondition::fromAst($node);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,12 @@

namespace Flow\PostgreSql\QueryBuilder\Condition;

use Flow\PostgreSql\Protobuf\AST\A_Expr_Kind;
use Flow\PostgreSql\Protobuf\AST\BoolExpr;
use Flow\PostgreSql\Protobuf\AST\BoolExprType;
use Flow\PostgreSql\Protobuf\AST\Node;
use Flow\PostgreSql\Protobuf\AST\SubLinkType;
use Flow\PostgreSql\QueryBuilder\Exception\InvalidAstException;
use Flow\PostgreSql\QueryBuilder\Exception\UnsupportedNodeException;
use Flow\PostgreSql\QueryBuilder\Expression\AliasedExpression;
use Flow\PostgreSql\QueryBuilder\Expression\Expression;
use Flow\PostgreSql\QueryBuilder\Expression\ExpressionFactory;

use function count;

Expand Down Expand Up @@ -52,9 +48,7 @@ public static function fromAst(Node $node): static
);
}

$argNode = $args[0];

return new self(self::expressionFromNode($argNode));
return new self(ConditionFactory::fromAst($args[0]));
}

public function and(Condition $other): AndCondition
Expand Down Expand Up @@ -88,69 +82,4 @@ public function toAst(): Node

return $node;
}

private static function expressionFromNode(Node $node): Expression
{
if ($node->hasBoolExpr()) {
$boolExpr = $node->getBoolExpr();

if ($boolExpr === null) {
throw InvalidAstException::missingRequiredField('bool_expr', 'Node');
}

return match ($boolExpr->getBoolop()) {
BoolExprType::AND_EXPR => AndCondition::fromAst($node),
BoolExprType::OR_EXPR => OrCondition::fromAst($node),
BoolExprType::NOT_EXPR => self::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'BoolExpr with ' . (string) BoolExprType::name($boolExpr->getBoolop()),
),
};
}

if ($node->hasAExpr()) {
$aExpr = $node->getAExpr();

if ($aExpr === null) {
throw InvalidAstException::missingRequiredField('a_expr', 'Node');
}

return match ($aExpr->getKind()) {
A_Expr_Kind::AEXPR_OP => Comparison::fromAst($node),
A_Expr_Kind::AEXPR_LIKE => Like::fromAst($node),
A_Expr_Kind::AEXPR_ILIKE => Like::fromAst($node),
A_Expr_Kind::AEXPR_SIMILAR => SimilarTo::fromAst($node),
A_Expr_Kind::AEXPR_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_NOT_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_OP_ANY => Any::fromAst($node),
A_Expr_Kind::AEXPR_OP_ALL => All::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN_SYM => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN_SYM => Between::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'A_Expr with kind: ' . (string) A_Expr_Kind::name($aExpr->getKind()),
),
};
}

if ($node->hasSubLink()) {
$subLink = $node->getSubLink();

if ($subLink === null) {
throw InvalidAstException::missingRequiredField('sub_link', 'Node');
}

return match ($subLink->getSubLinkType()) {
SubLinkType::EXISTS_SUBLINK => Exists::fromAst($node),
SubLinkType::ANY_SUBLINK => Any::fromAst($node),
SubLinkType::ALL_SUBLINK => All::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'SubLink with type: ' . (string) SubLinkType::name($subLink->getSubLinkType()),
),
};
}

return ExpressionFactory::fromAst($node);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@

namespace Flow\PostgreSql\QueryBuilder\Condition;

use Flow\PostgreSql\Protobuf\AST\A_Expr_Kind;
use Flow\PostgreSql\Protobuf\AST\BoolExpr;
use Flow\PostgreSql\Protobuf\AST\BoolExprType;
use Flow\PostgreSql\Protobuf\AST\Node;
use Flow\PostgreSql\Protobuf\AST\SubLinkType;
use Flow\PostgreSql\QueryBuilder\Exception\InvalidAstException;
use Flow\PostgreSql\QueryBuilder\Exception\UnsupportedNodeException;
use Flow\PostgreSql\QueryBuilder\Expression\AliasedExpression;

final readonly class OrCondition implements Condition
Expand Down Expand Up @@ -47,7 +44,7 @@ public static function fromAst(Node $node): static
$conditions = [];

foreach ($boolExpr->getArgs() as $argNode) {
$conditions[] = self::conditionFromNode($argNode);
$conditions[] = ConditionFactory::fromAst($argNode);
}

return new self(...$conditions);
Expand Down Expand Up @@ -95,69 +92,4 @@ public function toAst(): Node

return $node;
}

private static function conditionFromNode(Node $node): Condition
{
if ($node->hasBoolExpr()) {
$boolExpr = $node->getBoolExpr();

if ($boolExpr === null) {
throw InvalidAstException::missingRequiredField('bool_expr', 'Node');
}

return match ($boolExpr->getBoolop()) {
BoolExprType::AND_EXPR => AndCondition::fromAst($node),
BoolExprType::OR_EXPR => self::fromAst($node),
BoolExprType::NOT_EXPR => NotCondition::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'BoolExpr with ' . (string) BoolExprType::name($boolExpr->getBoolop()),
),
};
}

if ($node->hasAExpr()) {
$aExpr = $node->getAExpr();

if ($aExpr === null) {
throw InvalidAstException::missingRequiredField('a_expr', 'Node');
}

return match ($aExpr->getKind()) {
A_Expr_Kind::AEXPR_OP => Comparison::fromAst($node),
A_Expr_Kind::AEXPR_LIKE => Like::fromAst($node),
A_Expr_Kind::AEXPR_ILIKE => Like::fromAst($node),
A_Expr_Kind::AEXPR_SIMILAR => SimilarTo::fromAst($node),
A_Expr_Kind::AEXPR_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_NOT_DISTINCT => IsDistinctFrom::fromAst($node),
A_Expr_Kind::AEXPR_OP_ANY => Any::fromAst($node),
A_Expr_Kind::AEXPR_OP_ALL => All::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN => Between::fromAst($node),
A_Expr_Kind::AEXPR_BETWEEN_SYM => Between::fromAst($node),
A_Expr_Kind::AEXPR_NOT_BETWEEN_SYM => Between::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'A_Expr with kind: ' . (string) A_Expr_Kind::name($aExpr->getKind()),
),
};
}

if ($node->hasSubLink()) {
$subLink = $node->getSubLink();

if ($subLink === null) {
throw InvalidAstException::missingRequiredField('sub_link', 'Node');
}

return match ($subLink->getSubLinkType()) {
SubLinkType::EXISTS_SUBLINK => Exists::fromAst($node),
SubLinkType::ANY_SUBLINK => Any::fromAst($node),
SubLinkType::ALL_SUBLINK => All::fromAst($node),
default => throw UnsupportedNodeException::forNodeType(
'SubLink with type: ' . (string) SubLinkType::name($subLink->getSubLinkType()),
),
};
}

throw UnsupportedNodeException::forNodeType('unknown node type in condition');
}
}
Loading
Loading