@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Move task/project storage to edges

Summary: Ref T5245. This moves the actual storage over and stops reads and writes to the old table.

Test Plan:
- Verified tasks retained projects across the migration.
- Added and removed projects from tasks.
- Searched for: all, any, users' projects, not-in-projects, no-projects.

Reviewers: chad, btrahan, joshuaspence

Reviewed By: joshuaspence

Subscribers: epriestley

Maniphest Tasks: T5245

Differential Revision: https://secure.phabricator.com/D9850

+63 -43
+10
resources/sql/autopatches/20140706.pedge.1.sql
··· 1 + /* PhabricatorProjectObjectHasProjectEdgeType::EDGECONST = 41 */ 2 + /* PhabricatorProjectProjectHasObjectEdgeType::EDGECONST = 42 */ 3 + 4 + INSERT IGNORE INTO {$NAMESPACE}_maniphest.edge (src, type, dst) 5 + SELECT taskPHID, 41, projectPHID 6 + FROM {$NAMESPACE}_maniphest.maniphest_taskproject; 7 + 8 + INSERT IGNORE INTO {$NAMESPACE}_project.edge (src, type, dst) 9 + SELECT projectPHID, 42, taskPHID 10 + FROM {$NAMESPACE}_maniphest.maniphest_taskproject;
+3 -2
src/applications/maniphest/controller/ManiphestReportController.php
··· 83 83 $joins = qsprintf( 84 84 $conn, 85 85 'JOIN %T t ON x.objectPHID = t.phid 86 - JOIN %T p ON p.taskPHID = t.phid AND p.projectPHID = %s', 86 + JOIN %T p ON p.src = t.phid AND p.type = %d AND p.dst = %s', 87 87 id(new ManiphestTask())->getTableName(), 88 - id(new ManiphestTaskProject())->getTableName(), 88 + PhabricatorEdgeConfig::TABLE_NAME_EDGE, 89 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, 89 90 $project_phid); 90 91 } 91 92
+31 -21
src/applications/maniphest/query/ManiphestTaskQuery.php
··· 243 243 // query. We sum the project count and require it be the same as the 244 244 // number of projects we're searching for. 245 245 246 - $count = ', COUNT(project.projectPHID) projectCount'; 246 + $count = ', COUNT(project.dst) projectCount'; 247 247 $having = qsprintf( 248 248 $conn, 249 249 'HAVING projectCount = %d', ··· 496 496 if ($this->projectPHIDs) { 497 497 $parts[] = qsprintf( 498 498 $conn, 499 - 'project.projectPHID in (%Ls)', 499 + 'project.dst in (%Ls)', 500 500 $this->projectPHIDs); 501 501 } 502 502 if ($this->includeNoProject) { 503 503 $parts[] = qsprintf( 504 504 $conn, 505 - 'project.projectPHID IS NULL'); 505 + 'project.dst IS NULL'); 506 506 } 507 507 508 508 return '('.implode(') OR (', $parts).')'; ··· 515 515 516 516 return qsprintf( 517 517 $conn, 518 - 'anyproject.projectPHID IN (%Ls)', 518 + 'anyproject.dst IN (%Ls)', 519 519 $this->anyProjectPHIDs); 520 520 } 521 521 ··· 536 536 537 537 return qsprintf( 538 538 $conn, 539 - 'anyproject.projectPHID IN (%Ls)', 539 + 'anyproject.dst IN (%Ls)', 540 540 $any_user_project_phids); 541 541 } 542 542 ··· 547 547 548 548 return qsprintf( 549 549 $conn, 550 - 'xproject.projectPHID IS NULL'); 550 + 'xproject.dst IS NULL'); 551 551 } 552 552 553 553 private function buildCustomOrderClause(AphrontDatabaseConnection $conn) { ··· 636 636 } 637 637 638 638 private function buildJoinsClause(AphrontDatabaseConnection $conn_r) { 639 - $project_dao = new ManiphestTaskProject(); 639 + $edge_table = PhabricatorEdgeConfig::TABLE_NAME_EDGE; 640 640 641 641 $joins = array(); 642 642 643 643 if ($this->projectPHIDs || $this->includeNoProject) { 644 644 $joins[] = qsprintf( 645 645 $conn_r, 646 - '%Q JOIN %T project ON project.taskPHID = task.phid', 646 + '%Q JOIN %T project ON project.src = task.phid 647 + AND project.type = %d', 647 648 ($this->includeNoProject ? 'LEFT' : ''), 648 - $project_dao->getTableName()); 649 + $edge_table, 650 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); 649 651 } 650 652 651 653 if ($this->anyProjectPHIDs || $this->anyUserProjectPHIDs) { 652 654 $joins[] = qsprintf( 653 655 $conn_r, 654 - 'JOIN %T anyproject ON anyproject.taskPHID = task.phid', 655 - $project_dao->getTableName()); 656 + 'JOIN %T anyproject ON anyproject.src = task.phid 657 + AND anyproject.type = %d', 658 + $edge_table, 659 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); 656 660 } 657 661 658 662 if ($this->xprojectPHIDs) { 659 663 $joins[] = qsprintf( 660 664 $conn_r, 661 - 'LEFT JOIN %T xproject ON xproject.taskPHID = task.phid 662 - AND xproject.projectPHID IN (%Ls)', 663 - $project_dao->getTableName(), 665 + 'LEFT JOIN %T xproject ON xproject.src = task.phid 666 + AND xproject.type = %d 667 + AND xproject.dst IN (%Ls)', 668 + $edge_table, 669 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, 664 670 $this->xprojectPHIDs); 665 671 } 666 672 ··· 678 684 if ($ignore_group_phids) { 679 685 $joins[] = qsprintf( 680 686 $conn_r, 681 - 'LEFT JOIN %T projectGroup ON task.phid = projectGroup.taskPHID 682 - AND projectGroup.projectPHID NOT IN (%Ls)', 683 - $project_dao->getTableName(), 687 + 'LEFT JOIN %T projectGroup ON task.phid = projectGroup.src 688 + AND projectGroup.type = %d 689 + AND projectGroup.dst NOT IN (%Ls)', 690 + $edge_table, 691 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, 684 692 $ignore_group_phids); 685 693 } else { 686 694 $joins[] = qsprintf( 687 695 $conn_r, 688 - 'LEFT JOIN %T projectGroup ON task.phid = projectGroup.taskPHID', 689 - $project_dao->getTableName()); 696 + 'LEFT JOIN %T projectGroup ON task.phid = projectGroup.src 697 + AND projectGroup.type = %d', 698 + $edge_table, 699 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); 690 700 } 691 701 $joins[] = qsprintf( 692 702 $conn_r, 693 703 'LEFT JOIN %T projectGroupName 694 - ON projectGroup.projectPHID = projectGroupName.indexedObjectPHID', 704 + ON projectGroup.dst = projectGroupName.indexedObjectPHID', 695 705 id(new ManiphestNameIndex())->getTableName()); 696 706 break; 697 707 } ··· 712 722 // task IDs. 713 723 if ($joined_multiple_rows) { 714 724 if ($joined_project_name) { 715 - return 'GROUP BY task.phid, projectGroup.projectPHID'; 725 + return 'GROUP BY task.phid, projectGroup.dst'; 716 726 } else { 717 727 return 'GROUP BY task.phid'; 718 728 }
+19 -20
src/applications/maniphest/storage/ManiphestTaskProject.php
··· 20 20 } 21 21 22 22 public static function updateTaskProjects(ManiphestTask $task) { 23 - $dao = new ManiphestTaskProject(); 24 - $conn = $dao->establishConnection('w'); 23 + $edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; 25 24 26 - $sql = array(); 27 - foreach ($task->getProjectPHIDs() as $project_phid) { 28 - $sql[] = qsprintf( 29 - $conn, 30 - '(%s, %s)', 31 - $task->getPHID(), 32 - $project_phid); 25 + $old_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( 26 + $task->getPHID(), 27 + $edge_type); 28 + $new_phids = $task->getProjectPHIDs(); 29 + 30 + $add_phids = array_diff($new_phids, $old_phids); 31 + $rem_phids = array_diff($old_phids, $new_phids); 32 + 33 + if (!$add_phids && !$rem_phids) { 34 + return; 33 35 } 34 36 35 - queryfx( 36 - $conn, 37 - 'DELETE FROM %T WHERE taskPHID = %s', 38 - $dao->getTableName(), 39 - $task->getPHID()); 40 - if ($sql) { 41 - queryfx( 42 - $conn, 43 - 'INSERT INTO %T (taskPHID, projectPHID) VALUES %Q', 44 - $dao->getTableName(), 45 - implode(', ', $sql)); 37 + 38 + $editor = new PhabricatorEdgeEditor(); 39 + foreach ($add_phids as $phid) { 40 + $editor->addEdge($task->getPHID(), $edge_type, $phid); 41 + } 42 + foreach ($rem_phids as $phid) { 43 + $editor->remEdge($task->getPHID(), $edge_type, $phid); 46 44 } 45 + $editor->save(); 47 46 } 48 47 49 48 }