getField(); if (!is_array($fields)) { return; } $operator = strtoupper($expression->getOperator()); if (!in_array($operator, ['IN', '='])) { throw new RuntimeException( sprintf( 'Tuple comparison transform only supports the `IN` and `=` operators, `%s` given.', $operator ) ); } $value = $expression->getValue(); $true = new QueryExpression('1'); if ($value instanceof Query) { $selected = array_values($value->clause('select')); foreach ($fields as $i => $field) { $value->andWhere([$field => new IdentifierExpression($selected[$i])]); } $value->select($true, true); $expression->setField($true); $expression->setOperator('='); return; } $type = $expression->getType(); if ($type) { /** @var array $typeMap */ $typeMap = array_combine($fields, $type) ?: []; } else { $typeMap = []; } $surrogate = $query->getConnection() ->selectQuery($true); if (!is_array(current($value))) { $value = [$value]; } $conditions = ['OR' => []]; foreach ($value as $tuple) { $item = []; foreach (array_values($tuple) as $i => $value2) { $item[] = [$fields[$i] => $value2]; } $conditions['OR'][] = $item; } $surrogate->where($conditions, $typeMap); $expression->setField($true); $expression->setValue($surrogate); $expression->setOperator('='); } }