Commit 9e0c4cb7 authored by Lucas Hedding's avatar Lucas Hedding Committed by Lucas Hedding
Browse files

Issue #3154558 by heddn, catch, phjou: 1116 Too many tables; MariaDB can only...

Issue #3154558 by heddn, catch, phjou: 1116 Too many tables; MariaDB can only use 61 tables in a join
parent 9417910e
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -178,8 +178,9 @@ class PrivateMessageForm extends ContentEntityForm {
  public function buildForm(array $form, FormStateInterface $form_state, PrivateMessageThreadInterface $privateMessageThread = NULL) {
    $form = parent::buildForm($form, $form_state);


    if ($privateMessageThread) {
      $form_state->set('thread_members', $privateMessageThread->getMembers());
      $form_state->set('thread', $privateMessageThread);
      $form['actions']['submit']['#ajax'] = [
        'callback' => '::ajaxCallback',
      ];
@@ -294,8 +295,9 @@ class PrivateMessageForm extends ContentEntityForm {
  public function save(array $form, FormStateInterface $formState) {
    $status = parent::save($form, $formState);

    $members = $formState->get('thread_members');
    if (!$members) {
    /** @var \Drupal\private_message\Entity\PrivateMessageThreadInterface $private_message_thread */
    $private_message_thread = $formState->get('thread');
    if (!$private_message_thread) {
      // Generate an array containing the members of the thread.
      $current_user = $this->userManager->load($this->currentUser->id());

@@ -306,13 +308,12 @@ class PrivateMessageForm extends ContentEntityForm {
          $members[] = $user;
        }
      }
    }

      // Get a private message thread containing the given users.
      $private_message_thread = $this->privateMessageService->getThreadForMembers($members);
    }

    // Save the thread.
    $this->privateMessageThreadManager->saveThread($this->entity, $members, [], $private_message_thread);
    $this->privateMessageThreadManager->saveThread($this->entity, $private_message_thread->getMembers(), [], $private_message_thread);

    // Save the thread to the form state.
    $formState->set('private_message_thread', $private_message_thread);
+14 −19
Original line number Diff line number Diff line
@@ -45,28 +45,23 @@ class PrivateMessageMapper implements PrivateMessageMapperInterface {
  public function getThreadIdForMembers(array $members) {
    $uids = [];
    foreach ($members as $member) {
      $uids[] = $member->id();
      $uids[$member->id()] = $member->id();
    }

    $query = $this->database->select('private_message_threads', 'pm')
      ->fields('pm', ['id'])
      ->range(0, 1);

    // First do an inner join for each user, to ensure that the user exists in
    // the thread.
    $i = 0;
    foreach ($uids as $uid) {
      $tmp_alias = 'member_' . $i;
      $query->join('private_message_thread__members', $tmp_alias, $tmp_alias . '.entity_id = pm.id AND ' . $tmp_alias . '.members_target_id = :uid' . $i, [':uid' . $i => $uid]);
      $i++;
    // There is quite possibly a cleaner way to do this entirely in SQL, but
    // the previous method using JOINs hit a system join limit in MySQL.
    $query = $this->database->select('private_message_thread__members', 'pmt')
      ->fields('pmt', ['entity_id', 'members_target_id'])
      ->condition('members_target_id', $uids, 'IN')
      ->groupBy('entity_id')
      ->groupBy('members_target_id')
      ->orderBy('entity_id', 'ASC');
    $threads = [];
    foreach ($query->execute()->fetchAll() as $result) {
      $threads[$result->entity_id] = isset($threads[$result->entity_id]) ? ++$threads[$result->entity_id] : 1;
    }

    // Next, do a left join for all rows that don't contain the users, and
    // ensure that there aren't any additional users in selected threads.
    $alias = $query->leftJoin('private_message_thread__members', 'thread_member', 'thread_member.entity_id = pm.id AND thread_member.members_target_id NOT IN (:uids[])', [':uids[]' => $uids]);
    $query->isNull($alias . '.members_target_id');

    return $query->execute()->fetchField();
    $threads = array_flip($threads);
    return $threads[count($uids)];
  }

  /**