op) { case Op::EX: case Op::NEX: break; case Op::BT: $existing["{$this->paramName}min"] = $this->value[0]; $existing["{$this->paramName}max"] = $this->value[1]; break; default: $existing[$this->paramName] = $this->value; } return $existing; } /** * Get the WHERE clause fragment for this parameter * * @return string The WHERE clause fragment for this parameter * @throws DocumentException If the database mode has not been set */ public function toWhere(): string { $fieldName = ($this->qualifier == '' ? '' : "$this->qualifier.") . 'data' . match (true) { !str_contains($this->fieldName, '.') => "->>'$this->fieldName'", Configuration::$mode == Mode::PgSQL => "#>>'{" . implode(',', explode('.', $this->fieldName)) . "}'", Configuration::$mode == Mode::SQLite => "->>'" . implode("'->>'", explode('.', $this->fieldName)) . "'", default => throw new DocumentException('Database mode not set; cannot make field WHERE clause') }; $fieldPath = match (Configuration::$mode) { Mode::PgSQL => match (true) { $this->op == Op::BT => is_numeric($this->value[0]) ? "($fieldName)::numeric" : $fieldName, is_numeric($this->value) => "($fieldName)::numeric", default => $fieldName }, default => $fieldName }; $criteria = match ($this->op) { Op::EX, Op::NEX => '', Op::BT => " {$this->paramName}min AND {$this->paramName}max", default => " $this->paramName" }; return $fieldPath . ' ' . $this->op->toString() . $criteria; } /** * Create an equals (=) field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $value The value for which equality will be checked * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function EQ(string $fieldName, mixed $value, string $paramName = ''): static { return new static($fieldName, Op::EQ, $value, $paramName); } /** * Create a greater than (>) field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $value The value for the greater than comparison * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function GT(string $fieldName, mixed $value, string $paramName = ''): static { return new static($fieldName, Op::GT, $value, $paramName); } /** * Create a greater than or equal to (>=) field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $value The value for the greater than or equal to comparison * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function GE(string $fieldName, mixed $value, string $paramName = ''): static { return new static($fieldName, Op::GE, $value, $paramName); } /** * Create a less than (<) field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $value The value for the less than comparison * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function LT(string $fieldName, mixed $value, string $paramName = ''): static { return new static($fieldName, Op::LT, $value, $paramName); } /** * Create a less than or equal to (<=) field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $value The value for the less than or equal to comparison * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function LE(string $fieldName, mixed $value, string $paramName = ''): static { return new static($fieldName, Op::LE, $value, $paramName); } /** * Create a not equals (<>) field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $value The value for the not equals comparison * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function NE(string $fieldName, mixed $value, string $paramName = ''): static { return new static($fieldName, Op::NE, $value, $paramName); } /** * Create a BETWEEN field criterion * * @param string $fieldName The name of the field against which the value will be compared * @param mixed $minValue The lower value for range * @param mixed $maxValue The upper value for the range * @param string $paramName The name of the parameter to which this should be bound (optional; generated if blank) * @return static The field with the requested criterion */ public static function BT(string $fieldName, mixed $minValue, mixed $maxValue, string $paramName = ''): static { return new static($fieldName, Op::BT, [$minValue, $maxValue], $paramName); } /** * Create an exists (IS NOT NULL) field criterion * * @param string $fieldName The name of the field for which existence will be checked * @return static The field with the requested criterion */ public static function EX(string $fieldName): static { return new static($fieldName, Op::EX, '', ''); } /** * Create a not exists (IS NULL) field criterion * * @param string $fieldName The name of the field for which non-existence will be checked * @return static The field with the requested criterion */ public static function NEX(string $fieldName): static { return new static($fieldName, Op::NEX, '', ''); } }