SearchKit - Add SearchSegment entity & table
authorColeman Watts <coleman@civicrm.org>
Tue, 29 Mar 2022 02:39:27 +0000 (22:39 -0400)
committerColeman Watts <coleman@civicrm.org>
Thu, 14 Apr 2022 14:00:04 +0000 (10:00 -0400)
ext/search_kit/CRM/Search/BAO/SearchSegment.php [new file with mode: 0644]
ext/search_kit/CRM/Search/DAO/SearchSegment.php [new file with mode: 0644]
ext/search_kit/CRM/Search/Upgrader.php
ext/search_kit/Civi/Api4/SearchSegment.php [new file with mode: 0644]
ext/search_kit/search_kit.civix.php
ext/search_kit/sql/auto_install.sql
ext/search_kit/sql/auto_uninstall.sql
ext/search_kit/xml/schema/CRM/Search/SearchSegment.entityType.php [new file with mode: 0644]
ext/search_kit/xml/schema/CRM/Search/SearchSegment.xml [new file with mode: 0644]

diff --git a/ext/search_kit/CRM/Search/BAO/SearchSegment.php b/ext/search_kit/CRM/Search/BAO/SearchSegment.php
new file mode 100644 (file)
index 0000000..68fe706
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Search Segment BAO
+ */
+class CRM_Search_BAO_SearchSegment extends CRM_Search_DAO_SearchSegment {
+
+  /**
+   * Retrieve pseudoconstant options for $this->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 (file)
index 0000000..b914788
--- /dev/null
@@ -0,0 +1,341 @@
+<?php
+
+/**
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ *
+ * Generated from org.civicrm.search_kit/xml/schema/CRM/Search/SearchSegment.xml
+ * DO NOT EDIT.  Generated by CRM_Core_CodeGen
+ * (GenCodeChecksum:c8d5ecf2d873eb419f692b8b66f3fc3d)
+ */
+use CRM_Search_ExtensionUtil as E;
+
+/**
+ * Database access object for the SearchSegment entity.
+ */
+class CRM_Search_DAO_SearchSegment extends CRM_Core_DAO {
+  const EXT = E::LONG_NAME;
+  const TABLE_ADDED = '';
+
+  /**
+   * Static instance to hold the table name.
+   *
+   * @var string
+   */
+  public static $_tableName = 'civicrm_search_segment';
+
+  /**
+   * Icon associated with this entity.
+   *
+   * @var string
+   */
+  public static $_icon = 'fa-object-group';
+
+  /**
+   * Field to show when displaying a record.
+   *
+   * @var string
+   */
+  public static $_labelField = 'label';
+
+  /**
+   * Should CiviCRM log any modifications to this table in the civicrm_log table.
+   *
+   * @var bool
+   */
+  public static $_log = TRUE;
+
+  /**
+   * Unique SearchSegment ID
+   *
+   * @var int|string|null
+   *   (SQL type: int unsigned)
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $id;
+
+  /**
+   * Unique name
+   *
+   * @var string
+   *   (SQL type: varchar(255))
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $name;
+
+  /**
+   * Label for identifying search segment (will appear as name of calculated field)
+   *
+   * @var string
+   *   (SQL type: varchar(255))
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $label;
+
+  /**
+   * Description will appear when selecting SearchSegment in the fields dropdown.
+   *
+   * @var string|null
+   *   (SQL type: varchar(255))
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $description;
+
+  /**
+   * Entity for which this set is used.
+   *
+   * @var string
+   *   (SQL type: varchar(255))
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $entity_name;
+
+  /**
+   * Field for which this set is used (may include pseudoconstant suffix).
+   *
+   * @var string
+   *   (SQL type: varchar(255))
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $field_name;
+
+  /**
+   * All items in set
+   *
+   * @var string|null
+   *   (SQL type: text)
+   *   Note that values will be retrieved from the database as a string.
+   */
+  public $items;
+
+  /**
+   * Class constructor.
+   */
+  public function __construct() {
+    $this->__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;
+  }
+
+}
index 98fbc009b83f0629e9166fcd0a23266bce56527d..9b737fbd4837ccf0576648cb8c2f37e9cce19328 100644 (file)
@@ -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 (file)
index 0000000..65a59ed
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+namespace Civi\Api4;
+
+/**
+ * Data segmentation sets for searches.
+ *
+ * @package Civi\Api4
+ */
+class SearchSegment extends Generic\DAOEntity {
+
+}
index 6cac24cef1d1b9f3a60d3e24e6ce06b960a1869c..da7a7cfa9dc7ecef8941f3ba8b10e7a5b018f853 100644 (file)
@@ -300,5 +300,10 @@ function _search_kit_civix_civicrm_entityTypes(&$entityTypes) {
       'class' => 'CRM_Search_DAO_SearchDisplay',
       'table' => 'civicrm_search_display',
     ],
+    'CRM_Search_DAO_SearchSegment' => [
+      'name' => 'SearchSegment',
+      'class' => 'CRM_Search_DAO_SearchSegment',
+      'table' => 'civicrm_search_segment',
+    ],
   ]);
 }
index 4a4db8ad6c3b9abe348b0349a7c42e41f451c83c..d1b9ef9e3bd7fcee0f011abdbe659dd0693bce46 100644 (file)
@@ -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;
index e1c88f5cb233ee656148e8b37d0721594fdb944c..43aa40194f5787b88bfe0c484b994b49c84b46aa 100644 (file)
@@ -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 (file)
index 0000000..b2c7409
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+// This file declares a new entity type. For more details, see "hook_civicrm_entityTypes" at:
+// https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+return [
+  [
+    'name' => '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 (file)
index 0000000..128815b
--- /dev/null
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+
+<table>
+  <base>CRM/Search</base>
+  <class>SearchSegment</class>
+  <name>civicrm_search_segment</name>
+  <comment>Data segmentation sets for searches.</comment>
+  <log>true</log>
+  <icon>fa-object-group</icon>
+  <labelField>label</labelField>
+
+  <field>
+    <name>id</name>
+    <type>int unsigned</type>
+    <required>true</required>
+    <comment>Unique SearchSegment ID</comment>
+    <html>
+      <type>Number</type>
+    </html>
+  </field>
+  <primaryKey>
+    <name>id</name>
+    <autoincrement>true</autoincrement>
+  </primaryKey>
+
+  <field>
+    <name>name</name>
+    <title>Search Segment Name</title>
+    <comment>Unique name</comment>
+    <required>true</required>
+    <type>varchar</type>
+    <length>255</length>
+    <html>
+      <type>Text</type>
+    </html>
+  </field>
+
+  <field>
+    <name>label</name>
+    <title>Label</title>
+    <comment>Label for identifying search segment (will appear as name of calculated field)</comment>
+    <required>true</required>
+    <type>varchar</type>
+    <length>255</length>
+    <html>
+      <type>Text</type>
+    </html>
+  </field>
+
+  <field>
+    <name>description</name>
+    <type>varchar</type>
+    <title>Description</title>
+    <length>255</length>
+    <comment>Description will appear when selecting SearchSegment in the fields dropdown.</comment>
+    <html>
+      <type>Text</type>
+    </html>
+  </field>
+
+  <field>
+    <name>entity_name</name>
+    <title>Entity</title>
+    <comment>Entity for which this set is used.</comment>
+    <required>true</required>
+    <type>varchar</type>
+    <length>255</length>
+    <pseudoconstant>
+      <callback>CRM_Search_BAO_SearchSegment::getDAOEntityOptions</callback>
+    </pseudoconstant>
+    <html>
+      <type>Text</type>
+    </html>
+  </field>
+
+  <field>
+    <name>field_name</name>
+    <title>Field</title>
+    <comment>Field for which this set is used (may include pseudoconstant suffix).</comment>
+    <required>true</required>
+    <type>varchar</type>
+    <length>255</length>
+    <html>
+      <type>Text</type>
+    </html>
+  </field>
+
+  <field>
+    <name>items</name>
+    <type>text</type>
+    <title>Items</title>
+    <comment>All items in set</comment>
+    <serialize>JSON</serialize>
+  </field>
+
+  <index>
+    <name>UI_name</name>
+    <fieldName>name</fieldName>
+    <unique>true</unique>
+  </index>
+
+</table>