From 7b7c96e65faa8257675016980f98304be1423554 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Mon, 20 Jan 2020 18:26:58 -0500 Subject: [PATCH] Api4 - Improve Entity::get Ensure that every php file found by the scanner is_a class inheriting from AbstractEntity. Remove the CustomValue class by virtue of its class type instead of manually remove it. Improve performance when fetching entities by name. --- Civi/Api4/Action/Entity/Get.php | 18 ++++++++++++------ Civi/Api4/CustomValue.php | 3 ++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Civi/Api4/Action/Entity/Get.php b/Civi/Api4/Action/Entity/Get.php index 457e11f67f..bf7fd148c6 100644 --- a/Civi/Api4/Action/Entity/Get.php +++ b/Civi/Api4/Action/Entity/Get.php @@ -44,6 +44,7 @@ class Get extends \Civi\Api4\Generic\BasicGetAction { */ protected function getRecords() { $entities = []; + $toGet = $this->_itemsToGet('name'); $locations = array_merge([\Civi::paths()->getPath('[civicrm.root]/Civi.php')], array_column(\CRM_Extension_System::singleton()->getMapper()->getActiveModuleFiles(), 'filePath') ); @@ -53,17 +54,22 @@ class Get extends \Civi\Api4\Generic\BasicGetAction { foreach (glob("$dir/*.php") as $file) { $matches = []; preg_match('/(\w*).php/', $file, $matches); - $entity = ['name' => $matches[1]]; - if ($this->_isFieldSelected('description') || $this->_isFieldSelected('comment')) { - $this->addDocs($entity); + if ( + (!$toGet || in_array($matches[1], $toGet)) + && is_a('\Civi\Api4\\' . $matches[1], '\Civi\Api4\Generic\AbstractEntity', TRUE) + ) { + $entity = ['name' => $matches[1]]; + if ($this->_isFieldSelected('description') || $this->_isFieldSelected('comment')) { + $this->addDocs($entity); + } + $entities[$matches[1]] = $entity; } - $entities[$matches[1]] = $entity; } } } - unset($entities['CustomValue']); - if ($this->includeCustom) { + // Fetch custom entities unless we've already fetched everything requested + if ($this->includeCustom && (!$toGet || array_diff($toGet, array_keys($entities)))) { $this->addCustomEntities($entities); } diff --git a/Civi/Api4/CustomValue.php b/Civi/Api4/CustomValue.php index 764c8e49a4..3ed03a8d61 100644 --- a/Civi/Api4/CustomValue.php +++ b/Civi/Api4/CustomValue.php @@ -32,9 +32,10 @@ namespace Civi\Api4; * Ex. OOP: \Civi\Api4\CustomValue::get('MyStuff')->addWhere('id', '=', 123) * Non-OOP: civicrm_api4('Custom_MyStuff', 'get', ['where' => [['id', '=', 123]]]); * + * Note: This class does NOT extend AbstractEntity so it doesn't get mistaken for a "real" entity. * @package Civi\Api4 */ -class CustomValue extends Generic\AbstractEntity { +class CustomValue { /** * @param string $customGroup -- 2.25.1