From 4cebf339fdc7962bd96a74ec8c78f00786d36b20 Mon Sep 17 00:00:00 2001 From: Lucas Mirloup <97196064+lucasmirloup@users.noreply.github.com> Date: Tue, 21 May 2024 14:22:01 +0000 Subject: [PATCH] feat(pgsql): handle complex ON CONFLICT target expressions (#7) * feat(pgsql): handle complex ON CONFLICT target expressions * Update ImportConfiguration.php Co-authored-by: Thibaut Selingue --------- Co-authored-by: Thibaut Selingue --- ImportConfiguration.php | 15 ++++++++++----- ImportResource.php | 2 +- Strategy/InsertIgnoreStrategy.php | 2 +- Strategy/InsertOrUpdateStrategy.php | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/ImportConfiguration.php b/ImportConfiguration.php index 2491ead..79a1bf3 100644 --- a/ImportConfiguration.php +++ b/ImportConfiguration.php @@ -222,7 +222,15 @@ public function getConfigTreeBuilder(): TreeBuilder ->scalarNode('copy_condition')->defaultValue('')->end() ->booleanNode('distinct')->defaultFalse()->end() ->scalarNode('joins')->defaultValue('')->end() - ->scalarNode('conflict_target')->defaultValue('')->end() + ->arrayNode('conflict_target') + ->beforeNormalization() + ->ifString() + ->then(function ($v) { return ['sql' => '('.$v.')']; }) + ->end() + ->children() + ->scalarNode('sql')->defaultValue('')->end() + ->end() + ->end() ->variableNode('non_updateable_fields') ->defaultValue([]) ->end() @@ -237,9 +245,7 @@ public function getConfigTreeBuilder(): TreeBuilder ->prototype('array') ->beforeNormalization() ->ifString() - ->then(function ($v) { - return ['property' => $v]; - }) + ->then(function ($v) { return ['property' => $v]; }) ->end() ->children() ->scalarNode('sql')->defaultNull()->end() @@ -255,7 +261,6 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ->end() ->end() - ->end() ->end() ->end() diff --git a/ImportResource.php b/ImportResource.php index 66e0c58..53e1ca7 100644 --- a/ImportResource.php +++ b/ImportResource.php @@ -164,7 +164,7 @@ public function getJoins(): ?string public function getConflictTarget(): ?string { - return $this->config['copy']['strategy_options']['conflict_target'] ?: null; + return $this->config['copy']['strategy_options']['conflict_target']['sql'] ?: null; } public function isDistinct(): bool diff --git a/Strategy/InsertIgnoreStrategy.php b/Strategy/InsertIgnoreStrategy.php index 911873a..6ff3fcf 100644 --- a/Strategy/InsertIgnoreStrategy.php +++ b/Strategy/InsertIgnoreStrategy.php @@ -120,7 +120,7 @@ private function postgresqlCopy(ImportResource $resource): int $sql = "INSERT INTO $tablename ($columns) SELECT $tempColumns FROM $tempTablename temp $joins $whereClause - ON CONFLICT ($conflictTargetClause) DO NOTHING" + ON CONFLICT $conflictTargetClause DO NOTHING" ; $this->connection->beginTransaction(); diff --git a/Strategy/InsertOrUpdateStrategy.php b/Strategy/InsertOrUpdateStrategy.php index d2a8fec..4727163 100644 --- a/Strategy/InsertOrUpdateStrategy.php +++ b/Strategy/InsertOrUpdateStrategy.php @@ -122,7 +122,7 @@ private function postgresqlCopy(ImportResource $resource): int $sql = "INSERT INTO $tablename ($columns) SELECT $distinct $tempColumns FROM $tempTablename temp $joins $whereClause - ON CONFLICT ($conflictTargetClause) DO UPDATE SET $updateClause" + ON CONFLICT $conflictTargetClause DO UPDATE SET $updateClause" ; $this->connection->beginTransaction();