Skip to content

Commit

Permalink
Optimizing relationship save operations
Browse files Browse the repository at this point in the history
  • Loading branch information
nateiler committed Jun 18, 2019
1 parent a87a8b8 commit 4077f93
Show file tree
Hide file tree
Showing 5 changed files with 192 additions and 66 deletions.
73 changes: 52 additions & 21 deletions src/relationships/OrganizationRelationship.php
Expand Up @@ -104,7 +104,7 @@ protected function existingRelationships(): Collection
/**
* @return OrganizationQuery
*/
protected function elementQuery(): OrganizationQuery
private function elementQuery(): OrganizationQuery
{
return Organization::find()
->userId($this->user->getId() ?: false)
Expand All @@ -115,7 +115,7 @@ protected function elementQuery(): OrganizationQuery
/**
* @return UserAssociationQuery
*/
protected function associationQuery(): UserAssociationQuery
private function associationQuery(): UserAssociationQuery
{
return UserAssociation::find()
->setUserId($this->user->getId() ?: false)
Expand Down Expand Up @@ -164,32 +164,65 @@ protected function delta(): array

/** @var UserAssociation $newAssociation */
foreach ($this->getRelationships() as $newAssociation) {
if (null === ($association = ArrayHelper::remove(
$association = ArrayHelper::remove(
$existingAssociations,
$newAssociation->getOrganizationId()
))) {
$association = $newAssociation;
} elseif ($newAssociation->getTypes()->isMutated()) {
/** @var UserAssociation $association */
$association->getTypes()->clear()->add(
$newAssociation->getTypes()->getCollection()
);
}
);

$newAssociation->organizationOrder = $order++;

$association->userOrder = $newAssociation->userOrder;
$association->organizationOrder = $order++;
$association->state = $newAssociation->state;
/** @var UserAssociation $association */
$association = $association ?: $newAssociation;

$association->ignoreSortOrder();
// Has anything changed?
if(!$association->getIsNewRecord() && !$this->hasChanged($newAssociation, $association)) {
continue;
}

$associations[] = $association;
$associations[] = $this->sync($association, $newAssociation);
}

return [$associations, $existingAssociations];
}

/**
* @param UserAssociation $new
* @param UserAssociation $existing
* @return bool
*/
private function hasChanged(UserAssociation $new, UserAssociation $existing): bool
{
return $new->userOrder != $existing->userOrder ||
$new->organizationOrder != $existing->organizationOrder ||
$new->state != $existing->state ||
$new->getTypes()->isMutated();
}

/**
* @param UserAssociation $from
* @param UserAssociation $to
*
* @return UserAssociation
*/
private function sync(UserAssociation $to, UserAssociation $from): UserAssociation
{
$to->userOrder = $from->userOrder;
$to->organizationOrder = $from->organizationOrder;
$to->state = $from->state;

if ($from->getTypes()->isMutated()) {
$to->getTypes()->clear()->add(
$from->getTypes()->getCollection()
);
}

$to->ignoreSortOrder();

return $to;
}

/*******************************************
* COLLECTION
* COLLECTION UTILS
*******************************************/

/**
Expand All @@ -208,13 +241,11 @@ protected function insertCollection(Collection $collection, UserAssociation $ass
}

/**
* Reposition the relationship based on the sort order
*
* @inheritDoc
*/
protected function updateCollection(Collection $collection, UserAssociation $association)
{
if ($key = $this->findKey($association)) {
if (null !== ($key = $this->findKey($association))) {
$collection->offsetUnset($key);
}

Expand Down Expand Up @@ -247,7 +278,7 @@ protected function findKey($object = null)
* @param $identifier
* @return int|string|null
*/
protected function findRelationshipKey($identifier)
private function findRelationshipKey($identifier)
{
/** @var UserAssociation $association */
foreach ($this->getRelationships()->all() as $key => $association) {
Expand Down
50 changes: 40 additions & 10 deletions src/relationships/OrganizationTypeRelationship.php
Expand Up @@ -83,7 +83,7 @@ protected function existingRelationships(): Collection
/**
* @return OrganizationTypeAssociationQuery
*/
protected function query(): OrganizationTypeAssociationQuery
private function query(): OrganizationTypeAssociationQuery
{
return OrganizationTypeAssociation::find()
->setOrganizationId($this->organization->getId() ?: false)
Expand Down Expand Up @@ -124,25 +124,55 @@ protected function delta(): array

$associations = [];
$order = 1;

/** @var OrganizationTypeAssociation $newAssociation */
foreach ($this->getRelationships()->sortBy('sortOrder') as $newAssociation) {
if (null === ($association = ArrayHelper::remove(
foreach ($this->getRelationships() as $newAssociation) {
$association = ArrayHelper::remove(
$existingAssociations,
$newAssociation->getTypeId()
))) {
$association = $newAssociation;
}
);

$association->sortOrder = $order++;
$newAssociation->sortOrder = $order++;

$association->ignoreSortOrder();
/** @var OrganizationTypeAssociation $association */
$association = $association ?: $newAssociation;

$associations[] = $association;
// Has anything changed?
if(!$association->getIsNewRecord() && !$this->hasChanged($newAssociation, $association)) {
continue;
}

$associations[] = $this->sync($association, $newAssociation);
}

return [$associations, $existingAssociations];
}

/**
* @param OrganizationTypeAssociation $new
* @param OrganizationTypeAssociation $existing
* @return bool
*/
private function hasChanged(OrganizationTypeAssociation $new, OrganizationTypeAssociation $existing): bool
{
return $new->sortOrder != $existing->sortOrder;
}

/**
* @param OrganizationTypeAssociation $from
* @param OrganizationTypeAssociation $to
*
* @return OrganizationTypeAssociation
*/
private function sync(OrganizationTypeAssociation $to, OrganizationTypeAssociation $from): OrganizationTypeAssociation
{
$to->sortOrder = $from->sortOrder;

$to->ignoreSortOrder();

return $to;
}


/*******************************************
* COLLECTION UTILS
Expand All @@ -166,7 +196,7 @@ protected function insertCollection(Collection $collection, OrganizationTypeAsso
*/
protected function updateCollection(Collection $collection, OrganizationTypeAssociation $association)
{
if ($key = $this->findKey($association)) {
if (null !== ($key = $this->findKey($association))) {
$collection->offsetUnset($key);
}

Expand Down
3 changes: 2 additions & 1 deletion src/relationships/RelationshipTrait.php
Expand Up @@ -265,7 +265,8 @@ public function save(): bool
}
}

$this->newRelations($save, false);
// $this->newRelations($save, false);
$this->reset();

return $success;
}
Expand Down
74 changes: 54 additions & 20 deletions src/relationships/UserRelationship.php
Expand Up @@ -99,7 +99,7 @@ protected function existingRelationships(): Collection
/**
* @return UserQuery
*/
protected function elementQuery(): UserQuery
private function elementQuery(): UserQuery
{
return User::find()
->organizationId($this->organization->getId() ?: false)
Expand All @@ -110,7 +110,7 @@ protected function elementQuery(): UserQuery
/**
* @return UserAssociationQuery
*/
protected function associationQuery(): UserAssociationQuery
private function associationQuery(): UserAssociationQuery
{
/** @noinspection PhpUndefinedMethodInspection */
return UserAssociation::find()
Expand Down Expand Up @@ -142,7 +142,7 @@ protected function create($object): UserAssociation


/*******************************************
* SAVE
* DELTA
*******************************************/

/**
Expand All @@ -159,33 +159,66 @@ protected function delta(): array

/** @var UserAssociation $newAssociation */
foreach ($this->getRelationships() as $newAssociation) {
if (null === ($association = ArrayHelper::remove(
$association = ArrayHelper::remove(
$existingAssociations,
$newAssociation->getUserId()
))) {
$association = $newAssociation;
} elseif ($newAssociation->getTypes()->isMutated()) {
/** @var UserAssociation $association */
$association->getTypes()->clear()->add(
$newAssociation->getTypes()->getCollection()
);
}
);

$newAssociation->userOrder = $order++;

$association->userOrder = $order++;
$association->organizationOrder = $newAssociation->organizationOrder;
$association->state = $newAssociation->state;
/** @var UserAssociation $association */
$association = $association ?: $newAssociation;

$association->ignoreSortOrder();
// Has anything changed?
if(!$association->getIsNewRecord() && !$this->hasChanged($newAssociation, $association)) {
continue;
}

$associations[] = $association;
$associations[] = $this->sync($association, $newAssociation);
}

return [$associations, $existingAssociations];
}

/**
* @param UserAssociation $new
* @param UserAssociation $existing
* @return bool
*/
private function hasChanged(UserAssociation $new, UserAssociation $existing): bool
{
return $new->userOrder != $existing->userOrder ||
$new->organizationOrder != $existing->organizationOrder ||
$new->state != $existing->state ||
$new->getTypes()->isMutated();
}

/**
* @param UserAssociation $from
* @param UserAssociation $to
*
* @return UserAssociation
*/
private function sync(UserAssociation $to, UserAssociation $from): UserAssociation
{
$to->userOrder = $from->userOrder;
$to->organizationOrder = $from->organizationOrder;
$to->state = $from->state;

if ($from->getTypes()->isMutated()) {
$to->getTypes()->clear()->add(
$from->getTypes()->getCollection()
);
}

$to->ignoreSortOrder();

return $to;
}


/*******************************************
* COLLECTION
* COLLECTION UTILS
*******************************************/

/**
Expand All @@ -206,7 +239,7 @@ protected function insertCollection(Collection $collection, UserAssociation $ass
*/
protected function updateCollection(Collection $collection, UserAssociation $association)
{
if ($key = $this->findKey($association)) {
if (null !== ($key = $this->findKey($association))) {
$collection->offsetUnset($key);
}

Expand All @@ -226,6 +259,7 @@ protected function findKey($object = null)
{
if ($object instanceof UserAssociation) {
if (!$object->getUser()) {
var_dump("NOT FOUND");
return null;
}

Expand All @@ -243,7 +277,7 @@ protected function findKey($object = null)
* @param $identifier
* @return int|string|null
*/
protected function findRelationshipKey($identifier)
private function findRelationshipKey($identifier)
{
/** @var UserAssociation $association */
foreach ($this->getRelationships()->all() as $key => $association) {
Expand Down

0 comments on commit 4077f93

Please sign in to comment.