Fixes custom fields not being updated or causing integrity constraint

error: https://mailpoet.atlassian.net/browse/MAILPOET-828
This commit is contained in:
Vlad
2017-04-12 09:19:29 -04:00
parent d6f5a39829
commit 5b4fa4ea2b
2 changed files with 37 additions and 44 deletions

View File

@ -74,12 +74,7 @@ class SubscriberCustomField extends Model {
'WHEN custom_field_id = ? AND subscriber_id = ? THEN ? ', 'WHEN custom_field_id = ? AND subscriber_id = ? THEN ? ',
count($values) count($values)
) . ) .
'END) ' . 'ELSE value END) ',
'WHERE subscriber_id IN (' .
implode(', ', Helpers::arrayColumn($values, 1)) .
') AND custom_field_id IN (' .
implode(', ', array_unique(Helpers::arrayColumn($values, 0)))
. ') ',
Helpers::flattenArray($values) Helpers::flattenArray($values)
); );
} }

View File

@ -12,7 +12,7 @@ use MailPoet\Util\Helpers;
class Import { class Import {
public $subscribers_data; public $subscribers_data;
public $segments; public $segments_ids;
public $update_subscribers; public $update_subscribers;
public $subscribers_fields; public $subscribers_fields;
public $subscribers_custom_fields; public $subscribers_custom_fields;
@ -28,7 +28,7 @@ class Import {
$data['subscribers'], $data['subscribers'],
$data['columns'] $data['columns']
); );
$this->segments = $data['segments']; $this->segments_ids = $data['segments'];
$this->update_subscribers = $data['updateSubscribers']; $this->update_subscribers = $data['updateSubscribers'];
$this->subscribers_fields = $this->getSubscribersFields( $this->subscribers_fields = $this->getSubscribersFields(
array_keys($data['columns']) array_keys($data['columns'])
@ -133,8 +133,9 @@ class Import {
$segments = $import_factory->getSegments(); $segments = $import_factory->getSegments();
$welcome_notifications_in_segments = $welcome_notifications_in_segments =
($created_subscribers || $updated_subscribers) ? ($created_subscribers || $updated_subscribers) ?
Newsletter::getWelcomeNotificationsForSegments($this->segments) : Newsletter::getWelcomeNotificationsForSegments($this->segments_ids) :
false; false;
return array( return array(
'created' => count($created_subscribers), 'created' => count($created_subscribers),
'updated' => count($updated_subscribers), 'updated' => count($updated_subscribers),
@ -353,35 +354,33 @@ class Import {
); );
} }
} }
$query = Subscriber::selectMany(array( $created_or_updated_subscribers = array();
'id', foreach(array_chunk($subscribers_data['data']['email'], self::DB_QUERY_CHUNK_SIZE) as $data) {
'email' $created_or_updated_subscribers = array_merge(
)); $created_or_updated_subscribers,
$query = ($action === 'update') ? Subscriber::selectMany(array('id', 'email'))->whereIn('email', $data)->findArray()
$query->where('updated_at', $this->updated_at) : );
$query->where('created_at', $this->created_at); }
$result = Helpers::arrayColumn( if(empty($created_or_updated_subscribers)) return null;
$query->findArray(), $created_or_updated_subscribers_ids = Helpers::arrayColumn($created_or_updated_subscribers, 'id');
'id'
);
if($subscribers_custom_fields) { if($subscribers_custom_fields) {
$this->createOrUpdateCustomFields( $this->createOrUpdateCustomFields(
($action === 'create') ? 'create' : 'update', $action,
$result, $created_or_updated_subscribers,
$subscribers_data, $subscribers_data,
$subscribers_custom_fields $subscribers_custom_fields
); );
} }
$this->addSubscribersToSegments( $this->addSubscribersToSegments(
$result, $created_or_updated_subscribers_ids,
$this->segments $this->segments_ids
); );
return $result; return $created_or_updated_subscribers;
} }
function createOrUpdateCustomFields( function createOrUpdateCustomFields(
$action, $action,
$db_subscribers_ids, $created_or_updated_subscribers,
$subscribers_data, $subscribers_data,
$subscribers_custom_fields_ids $subscribers_custom_fields_ids
) { ) {
@ -392,28 +391,27 @@ class Import {
->findArray() ->findArray()
); );
if(!$subscribers_custom_fields_ids) return; if(!$subscribers_custom_fields_ids) return;
$subscriber_custom_fields_data = array(); // assemble a two-dimensional array: [[custom_field_id, subscriber_id, value], [custom_field_id, subscriber_id, value], ...]
foreach($subscribers_data['data'] as $field_id => $subscriber_data) { $subscribers_custom_fields_data = array();
// exclude non-custom fields foreach($created_or_updated_subscribers as $subscriber) {
if(!is_int($field_id)) continue; $subscriber_index = array_search($subscriber['email'], $subscribers_data['data']['email']);
$subscriber_index = 0; foreach($subscribers_data['data'] as $field => $values) {
foreach($subscriber_data as $value) { // exclude non-custom fields
// assemble an array: custom_field_id, subscriber_id, value if(!is_int($field)) continue;
$subscriber_custom_fields_data[] = array( $subscribers_custom_fields_data[] = array(
(int)$field_id, (int)$field,
(int)$db_subscribers_ids[$subscriber_index], $subscriber['id'],
$value $values[$subscriber_index],
); );
$subscriber_index++;
} }
} }
foreach(array_chunk($subscriber_custom_fields_data, self::DB_QUERY_CHUNK_SIZE) as $data) { foreach(array_chunk($subscribers_custom_fields_data, self::DB_QUERY_CHUNK_SIZE) as $subscribers_custom_fields_data_chunk) {
SubscriberCustomField::createMultiple( SubscriberCustomField::createMultiple(
$data $subscribers_custom_fields_data_chunk
); );
if($action === 'update') { if($action === 'update') {
SubscriberCustomField::updateMultiple( SubscriberCustomField::updateMultiple(
$data $subscribers_custom_fields_data_chunk
); );
} }
} }
@ -423,10 +421,10 @@ class Import {
return array_walk($wp_users, '\MailPoet\Segments\WP::synchronizeUser'); return array_walk($wp_users, '\MailPoet\Segments\WP::synchronizeUser');
} }
function addSubscribersToSegments($subscriber_ids, $segment_ids) { function addSubscribersToSegments($subscribers_ids, $segments_ids) {
foreach(array_chunk($subscriber_ids, self::DB_QUERY_CHUNK_SIZE) as $subscriber_ids_chunk) { foreach(array_chunk($subscribers_ids, self::DB_QUERY_CHUNK_SIZE) as $subscriber_ids_chunk) {
SubscriberSegment::subscribeManyToSegments( SubscriberSegment::subscribeManyToSegments(
$subscriber_ids_chunk, $segment_ids $subscriber_ids_chunk, $segments_ids
); );
} }
} }