From: Coleman Watts Date: Tue, 29 Mar 2022 02:39:27 +0000 (-0400) Subject: SearchKit - Add SearchSegment entity & table X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=cac5af425c47e039136670ce6fd5fbf31237653b;p=civicrm-core.git SearchKit - Add SearchSegment entity & table --- diff --git a/ext/search_kit/CRM/Search/BAO/SearchSegment.php b/ext/search_kit/CRM/Search/BAO/SearchSegment.php new file mode 100644 index 0000000000..68fe706327 --- /dev/null +++ b/ext/search_kit/CRM/Search/BAO/SearchSegment.php @@ -0,0 +1,31 @@ +entity_name field + * @return array + */ + public static function getDAOEntityOptions() { + return Civi\Api4\Entity::get(FALSE) + ->addSelect('name', 'title_plural') + ->addOrderBy('title_plural') + ->addWhere('type', 'CONTAINS', 'DAOEntity') + ->execute() + ->indexBy('name') + ->column('title_plural'); + } + +} diff --git a/ext/search_kit/CRM/Search/DAO/SearchSegment.php b/ext/search_kit/CRM/Search/DAO/SearchSegment.php new file mode 100644 index 0000000000..b914788335 --- /dev/null +++ b/ext/search_kit/CRM/Search/DAO/SearchSegment.php @@ -0,0 +1,341 @@ +__table = 'civicrm_search_segment'; + parent::__construct(); + } + + /** + * Returns localized title of this entity. + * + * @param bool $plural + * Whether to return the plural version of the title. + */ + public static function getEntityTitle($plural = FALSE) { + return $plural ? E::ts('Search Segments') : E::ts('Search Segment'); + } + + /** + * Returns all the column names of this table + * + * @return array + */ + public static function &fields() { + if (!isset(Civi::$statics[__CLASS__]['fields'])) { + Civi::$statics[__CLASS__]['fields'] = [ + 'id' => [ + 'name' => 'id', + 'type' => CRM_Utils_Type::T_INT, + 'description' => E::ts('Unique SearchSegment ID'), + 'required' => TRUE, + 'where' => 'civicrm_search_segment.id', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'html' => [ + 'type' => 'Number', + ], + 'readonly' => TRUE, + 'add' => NULL, + ], + 'name' => [ + 'name' => 'name', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => E::ts('Search Segment Name'), + 'description' => E::ts('Unique name'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'where' => 'civicrm_search_segment.name', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'html' => [ + 'type' => 'Text', + ], + 'add' => NULL, + ], + 'label' => [ + 'name' => 'label', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => E::ts('Label'), + 'description' => E::ts('Label for identifying search segment (will appear as name of calculated field)'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'where' => 'civicrm_search_segment.label', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'html' => [ + 'type' => 'Text', + ], + 'add' => NULL, + ], + 'description' => [ + 'name' => 'description', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => E::ts('Description'), + 'description' => E::ts('Description will appear when selecting SearchSegment in the fields dropdown.'), + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'where' => 'civicrm_search_segment.description', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'html' => [ + 'type' => 'Text', + ], + 'add' => NULL, + ], + 'entity_name' => [ + 'name' => 'entity_name', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => E::ts('Entity'), + 'description' => E::ts('Entity for which this set is used.'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'where' => 'civicrm_search_segment.entity_name', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'html' => [ + 'type' => 'Text', + ], + 'pseudoconstant' => [ + 'callback' => 'CRM_Search_BAO_SearchSegment::getDAOEntityOptions', + ], + 'add' => NULL, + ], + 'field_name' => [ + 'name' => 'field_name', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => E::ts('Field'), + 'description' => E::ts('Field for which this set is used (may include pseudoconstant suffix).'), + 'required' => TRUE, + 'maxlength' => 255, + 'size' => CRM_Utils_Type::HUGE, + 'where' => 'civicrm_search_segment.field_name', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'html' => [ + 'type' => 'Text', + ], + 'add' => NULL, + ], + 'items' => [ + 'name' => 'items', + 'type' => CRM_Utils_Type::T_TEXT, + 'title' => E::ts('Items'), + 'description' => E::ts('All items in set'), + 'where' => 'civicrm_search_segment.items', + 'table_name' => 'civicrm_search_segment', + 'entity' => 'SearchSegment', + 'bao' => 'CRM_Search_DAO_SearchSegment', + 'localizable' => 0, + 'serialize' => self::SERIALIZE_JSON, + 'add' => NULL, + ], + ]; + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']); + } + return Civi::$statics[__CLASS__]['fields']; + } + + /** + * Return a mapping from field-name to the corresponding key (as used in fields()). + * + * @return array + * Array(string $name => string $uniqueName). + */ + public static function &fieldKeys() { + if (!isset(Civi::$statics[__CLASS__]['fieldKeys'])) { + Civi::$statics[__CLASS__]['fieldKeys'] = array_flip(CRM_Utils_Array::collect('name', self::fields())); + } + return Civi::$statics[__CLASS__]['fieldKeys']; + } + + /** + * Returns the names of this table + * + * @return string + */ + public static function getTableName() { + return self::$_tableName; + } + + /** + * Returns if this table needs to be logged + * + * @return bool + */ + public function getLog() { + return self::$_log; + } + + /** + * Returns the list of fields that can be imported + * + * @param bool $prefix + * + * @return array + */ + public static function &import($prefix = FALSE) { + $r = CRM_Core_DAO_AllCoreTables::getImports(__CLASS__, 'search_segment', $prefix, []); + return $r; + } + + /** + * Returns the list of fields that can be exported + * + * @param bool $prefix + * + * @return array + */ + public static function &export($prefix = FALSE) { + $r = CRM_Core_DAO_AllCoreTables::getExports(__CLASS__, 'search_segment', $prefix, []); + return $r; + } + + /** + * Returns the list of indices + * + * @param bool $localize + * + * @return array + */ + public static function indices($localize = TRUE) { + $indices = [ + 'UI_name' => [ + 'name' => 'UI_name', + 'field' => [ + 0 => 'name', + ], + 'localizable' => FALSE, + 'unique' => TRUE, + 'sig' => 'civicrm_search_segment::1::name', + ], + ]; + return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices; + } + +} diff --git a/ext/search_kit/CRM/Search/Upgrader.php b/ext/search_kit/CRM/Search/Upgrader.php index 98fbc009b8..9b737fbd48 100644 --- a/ext/search_kit/CRM/Search/Upgrader.php +++ b/ext/search_kit/CRM/Search/Upgrader.php @@ -189,4 +189,29 @@ class CRM_Search_Upgrader extends CRM_Search_Upgrader_Base { return TRUE; } + /** + * Add SearchSegment table + * @return bool + */ + public function upgrade_1007(): bool { + $this->ctx->log->info('Applying update 1007 - add SearchSegment table.'); + if (!CRM_Core_DAO::singleValueQuery("SHOW TABLES LIKE 'civicrm_search_segment'")) { + $createTable = " +CREATE TABLE `civicrm_search_segment` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique SearchSegment ID', + `name` varchar(255) NOT NULL COMMENT 'Unique name', + `label` varchar(255) NOT NULL COMMENT 'Label for identifying search segment (will appear as name of calculated field)', + `description` varchar(255) COMMENT 'Description will appear when selecting SearchSegment in the fields dropdown.', + `entity_name` varchar(255) NOT NULL COMMENT 'Entity for which this set is used.', + `field_name` varchar(255) NOT NULL COMMENT 'Field for which this set is used (may include pseudoconstant suffix).', + `items` text COMMENT 'All items in set', + PRIMARY KEY (`id`), + UNIQUE INDEX `UI_name`(name) +) +ENGINE=InnoDB ROW_FORMAT=DYNAMIC"; + CRM_Core_DAO::executeQuery($createTable, [], TRUE, NULL, FALSE, FALSE); + } + return TRUE; + } + } diff --git a/ext/search_kit/Civi/Api4/SearchSegment.php b/ext/search_kit/Civi/Api4/SearchSegment.php new file mode 100644 index 0000000000..65a59ed3b5 --- /dev/null +++ b/ext/search_kit/Civi/Api4/SearchSegment.php @@ -0,0 +1,11 @@ + 'CRM_Search_DAO_SearchDisplay', 'table' => 'civicrm_search_display', ], + 'CRM_Search_DAO_SearchSegment' => [ + 'name' => 'SearchSegment', + 'class' => 'CRM_Search_DAO_SearchSegment', + 'table' => 'civicrm_search_segment', + ], ]); } diff --git a/ext/search_kit/sql/auto_install.sql b/ext/search_kit/sql/auto_install.sql index 4a4db8ad6c..d1b9ef9e3b 100644 --- a/ext/search_kit/sql/auto_install.sql +++ b/ext/search_kit/sql/auto_install.sql @@ -17,6 +17,7 @@ SET FOREIGN_KEY_CHECKS=0; +DROP TABLE IF EXISTS `civicrm_search_segment`; DROP TABLE IF EXISTS `civicrm_search_display`; SET FOREIGN_KEY_CHECKS=1; @@ -46,3 +47,23 @@ CREATE TABLE `civicrm_search_display` ( CONSTRAINT FK_civicrm_search_display_saved_search_id FOREIGN KEY (`saved_search_id`) REFERENCES `civicrm_saved_search`(`id`) ON DELETE CASCADE ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; + +-- /******************************************************* +-- * +-- * civicrm_search_segment +-- * +-- * Data segmentation sets for searches. +-- * +-- *******************************************************/ +CREATE TABLE `civicrm_search_segment` ( + `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'Unique SearchSegment ID', + `name` varchar(255) NOT NULL COMMENT 'Unique name', + `label` varchar(255) NOT NULL COMMENT 'Label for identifying search segment (will appear as name of calculated field)', + `description` varchar(255) COMMENT 'Description will appear when selecting SearchSegment in the fields dropdown.', + `entity_name` varchar(255) NOT NULL COMMENT 'Entity for which this set is used.', + `field_name` varchar(255) NOT NULL COMMENT 'Field for which this set is used (may include pseudoconstant suffix).', + `items` text COMMENT 'All items in set', + PRIMARY KEY (`id`), + UNIQUE INDEX `UI_name`(name) +) +ENGINE=InnoDB ROW_FORMAT=DYNAMIC; diff --git a/ext/search_kit/sql/auto_uninstall.sql b/ext/search_kit/sql/auto_uninstall.sql index e1c88f5cb2..43aa40194f 100644 --- a/ext/search_kit/sql/auto_uninstall.sql +++ b/ext/search_kit/sql/auto_uninstall.sql @@ -15,6 +15,7 @@ SET FOREIGN_KEY_CHECKS=0; +DROP TABLE IF EXISTS `civicrm_search_segment`; DROP TABLE IF EXISTS `civicrm_search_display`; SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file diff --git a/ext/search_kit/xml/schema/CRM/Search/SearchSegment.entityType.php b/ext/search_kit/xml/schema/CRM/Search/SearchSegment.entityType.php new file mode 100644 index 0000000000..b2c740942f --- /dev/null +++ b/ext/search_kit/xml/schema/CRM/Search/SearchSegment.entityType.php @@ -0,0 +1,10 @@ + 'SearchSegment', + 'class' => 'CRM_Search_DAO_SearchSegment', + 'table' => 'civicrm_search_segment', + ], +]; diff --git a/ext/search_kit/xml/schema/CRM/Search/SearchSegment.xml b/ext/search_kit/xml/schema/CRM/Search/SearchSegment.xml new file mode 100644 index 0000000000..128815bbec --- /dev/null +++ b/ext/search_kit/xml/schema/CRM/Search/SearchSegment.xml @@ -0,0 +1,102 @@ + + + + CRM/Search + SearchSegment + civicrm_search_segment + Data segmentation sets for searches. + true + fa-object-group + label + + + id + int unsigned + true + Unique SearchSegment ID + + Number + + + + id + true + + + + name + Search Segment Name + Unique name + true + varchar + 255 + + Text + + + + + label + Label + Label for identifying search segment (will appear as name of calculated field) + true + varchar + 255 + + Text + + + + + description + varchar + Description + 255 + Description will appear when selecting SearchSegment in the fields dropdown. + + Text + + + + + entity_name + Entity + Entity for which this set is used. + true + varchar + 255 + + CRM_Search_BAO_SearchSegment::getDAOEntityOptions + + + Text + + + + + field_name + Field + Field for which this set is used (may include pseudoconstant suffix). + true + varchar + 255 + + Text + + + + + items + text + Items + All items in set + JSON + + + + UI_name + name + true + + +