From e752bdac84dfc53831c6b9fb9c308c3a6c0b400f Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Tue, 30 Jun 2020 21:50:44 -0700 Subject: [PATCH] RelationshipVortex - Add schema files (incl start_date, end_date, etal) This is the more maximal variant of the schema which includes mirrors for most fields. --- CRM/Contact/DAO/RelationshipVortex.php | 451 ++++++++++++++++++++++ CRM/Core/DAO/AllCoreTables.data.php | 5 + xml/schema/Contact/RelationshipVortex.xml | 202 ++++++++++ xml/schema/Contact/files.xml | 1 + 4 files changed, 659 insertions(+) create mode 100644 CRM/Contact/DAO/RelationshipVortex.php create mode 100644 xml/schema/Contact/RelationshipVortex.xml diff --git a/CRM/Contact/DAO/RelationshipVortex.php b/CRM/Contact/DAO/RelationshipVortex.php new file mode 100644 index 0000000000..b20ff00465 --- /dev/null +++ b/CRM/Contact/DAO/RelationshipVortex.php @@ -0,0 +1,451 @@ +__table = 'civicrm_relationship_vtx'; + parent::__construct(); + } + + /** + * Returns localized title of this entity. + */ + public static function getEntityTitle() { + return ts('Relationship Vortexes'); + } + + /** + * Returns foreign keys and entity references. + * + * @return array + * [CRM_Core_Reference_Interface] + */ + public static function getReferenceColumns() { + if (!isset(Civi::$statics[__CLASS__]['links'])) { + Civi::$statics[__CLASS__]['links'] = static::createReferenceColumns(__CLASS__); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'relationship_id', 'civicrm_relationship', 'id'); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'relationship_type_id', 'civicrm_relationship_type', 'id'); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'near_contact_id', 'civicrm_contact', 'id'); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'far_contact_id', 'civicrm_contact', 'id'); + Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'case_id', 'civicrm_case', 'id'); + CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']); + } + return Civi::$statics[__CLASS__]['links']; + } + + /** + * 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, + 'title' => ts('Relationship Vortex ID'), + 'description' => ts('Relationship Vortex ID'), + 'required' => TRUE, + 'where' => 'civicrm_relationship_vtx.id', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'add' => '5.29', + ], + 'relationship_id' => [ + 'name' => 'relationship_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('Relationship'), + 'description' => ts('id of the relationship (FK to civicrm_relationship.id)'), + 'required' => TRUE, + 'where' => 'civicrm_relationship_vtx.relationship_id', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'FKClassName' => 'CRM_Contact_DAO_Relationship', + 'add' => '5.29', + ], + 'relationship_type_id' => [ + 'name' => 'relationship_type_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('Relationship Type'), + 'description' => ts('id of the relationship type'), + 'required' => TRUE, + 'where' => 'civicrm_relationship_vtx.relationship_type_id', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'FKClassName' => 'CRM_Contact_DAO_RelationshipType', + 'add' => '5.29', + ], + 'orientation' => [ + 'name' => 'orientation', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => ts('Orientation (a_b or b_a)'), + 'description' => ts('The vortex record is a permutation of the original relationship record. The orientation indicates whether it is forward (a_b) or reverse (b_a) relationship.'), + 'required' => TRUE, + 'maxlength' => 3, + 'size' => CRM_Utils_Type::FOUR, + 'where' => 'civicrm_relationship_vtx.orientation', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'add' => '5.29', + ], + 'near_contact_id' => [ + 'name' => 'near_contact_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('Contact ID (Near side)'), + 'description' => ts('id of the first contact'), + 'required' => TRUE, + 'where' => 'civicrm_relationship_vtx.near_contact_id', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'FKClassName' => 'CRM_Contact_DAO_Contact', + 'add' => '5.29', + ], + 'near_relation' => [ + 'name' => 'near_relation', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => ts('Relationship Name (Near side)'), + 'description' => ts('name for relationship of near_contact to far_contact.'), + 'maxlength' => 64, + 'size' => CRM_Utils_Type::BIG, + 'where' => 'civicrm_relationship_vtx.near_relation', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'add' => '5.29', + ], + 'far_contact_id' => [ + 'name' => 'far_contact_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('Contact ID (Far side)'), + 'description' => ts('id of the second contact'), + 'required' => TRUE, + 'where' => 'civicrm_relationship_vtx.far_contact_id', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'FKClassName' => 'CRM_Contact_DAO_Contact', + 'html' => [ + 'type' => 'EntityRef', + ], + 'add' => '5.29', + ], + 'far_relation' => [ + 'name' => 'far_relation', + 'type' => CRM_Utils_Type::T_STRING, + 'title' => ts('Relationship Name (Near side)'), + 'description' => ts('name for relationship of far_contact to near_contact.'), + 'maxlength' => 64, + 'size' => CRM_Utils_Type::BIG, + 'where' => 'civicrm_relationship_vtx.far_relation', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'add' => '5.29', + ], + 'is_active' => [ + 'name' => 'is_active', + 'type' => CRM_Utils_Type::T_BOOLEAN, + 'title' => ts('Relationship Is Active'), + 'description' => ts('is the relationship active ?'), + 'where' => 'civicrm_relationship_vtx.is_active', + 'default' => '1', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'html' => [ + 'type' => 'CheckBox', + ], + 'add' => '5.29', + ], + 'relationship_start_date' => [ + 'name' => 'start_date', + 'type' => CRM_Utils_Type::T_DATE, + 'title' => ts('Relationship Start Date'), + 'description' => ts('date when the relationship started'), + 'where' => 'civicrm_relationship_vtx.start_date', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'html' => [ + 'type' => 'Select Date', + 'formatType' => 'activityDate', + ], + 'add' => '5.29', + ], + 'relationship_end_date' => [ + 'name' => 'end_date', + 'type' => CRM_Utils_Type::T_DATE, + 'title' => ts('Relationship End Date'), + 'description' => ts('date when the relationship ended'), + 'where' => 'civicrm_relationship_vtx.end_date', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'html' => [ + 'type' => 'Select Date', + 'formatType' => 'activityDate', + ], + 'add' => '5.29', + ], + 'case_id' => [ + 'name' => 'case_id', + 'type' => CRM_Utils_Type::T_INT, + 'title' => ts('Relationship Case'), + 'description' => ts('FK to civicrm_case'), + 'where' => 'civicrm_relationship_vtx.case_id', + 'default' => 'NULL', + 'table_name' => 'civicrm_relationship_vtx', + 'entity' => 'RelationshipVortex', + 'bao' => 'CRM_Contact_BAO_RelationshipVortex', + 'localizable' => 0, + 'FKClassName' => 'CRM_Case_DAO_Case', + 'add' => '5.29', + ], + ]; + 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__, 'relationship_vtx', $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__, 'relationship_vtx', $prefix, []); + return $r; + } + + /** + * Returns the list of indices + * + * @param bool $localize + * + * @return array + */ + public static function indices($localize = TRUE) { + $indices = [ + 'UI_relationship' => [ + 'name' => 'UI_relationship', + 'field' => [ + 0 => 'relationship_id', + 1 => 'orientation', + ], + 'localizable' => FALSE, + 'unique' => TRUE, + 'sig' => 'civicrm_relationship_vtx::1::relationship_id::orientation', + ], + 'index_nearid_nearrelation' => [ + 'name' => 'index_nearid_nearrelation', + 'field' => [ + 0 => 'near_contact_id', + 1 => 'near_relation', + ], + 'localizable' => FALSE, + 'sig' => 'civicrm_relationship_vtx::0::near_contact_id::near_relation', + ], + 'index_nearid_farrelation' => [ + 'name' => 'index_nearid_farrelation', + 'field' => [ + 0 => 'near_contact_id', + 1 => 'far_relation', + ], + 'localizable' => FALSE, + 'sig' => 'civicrm_relationship_vtx::0::near_contact_id::far_relation', + ], + 'index_near_relation' => [ + 'name' => 'index_near_relation', + 'field' => [ + 0 => 'near_relation', + ], + 'localizable' => FALSE, + 'sig' => 'civicrm_relationship_vtx::0::near_relation', + ], + ]; + return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices; + } + +} diff --git a/CRM/Core/DAO/AllCoreTables.data.php b/CRM/Core/DAO/AllCoreTables.data.php index cf649fb224..db3fd969dd 100644 --- a/CRM/Core/DAO/AllCoreTables.data.php +++ b/CRM/Core/DAO/AllCoreTables.data.php @@ -567,6 +567,11 @@ return [ 'class' => 'CRM_Contact_DAO_Relationship', 'table' => 'civicrm_relationship', ], + 'CRM_Contact_DAO_RelationshipVortex' => [ + 'name' => 'RelationshipVortex', + 'class' => 'CRM_Contact_DAO_RelationshipVortex', + 'table' => 'civicrm_relationship_vtx', + ], 'CRM_Mailing_DAO_Mailing' => [ 'name' => 'Mailing', 'class' => 'CRM_Mailing_DAO_Mailing', diff --git a/xml/schema/Contact/RelationshipVortex.xml b/xml/schema/Contact/RelationshipVortex.xml new file mode 100644 index 0000000000..c18ac9154f --- /dev/null +++ b/xml/schema/Contact/RelationshipVortex.xml @@ -0,0 +1,202 @@ + + + + CRM/Contact + RelationshipVortex + civicrm_relationship_vtx + The vortex permutes information from the relationship table to facilitate querying. Every relationship is mapped to multiple records in the vortex. Joins should begin on the near side and extract info from the far side. + 5.29 + false + fa-handshake-o + + + id + int unsigned + Relationship Vortex ID + true + Relationship Vortex ID + 5.29 + + + id + true + + + + relationship_id + int unsigned + Relationship + true + id of the relationship (FK to civicrm_relationship.id) + 5.29 + + + relationship_id +
civicrm_relationship
+ id + 5.29 + CASCADE + + + + relationship_type_id + int unsigned + Relationship Type + true + id of the relationship type + 5.29 + + + relationship_type_id + civicrm_relationship_type
+ id + 5.29 + CASCADE +
+ + + orientation + char + 3 + Orientation (a_b or b_a) + true + + The vortex record is a permutation of the original relationship record. The orientation indicates whether it is forward (a_b) or reverse (b_a) relationship. + 5.29 + + + + near_contact_id + int unsigned + Contact ID (Near side) + true + id of the first contact + 5.29 + + + near_contact_id + civicrm_contact
+ id + 5.29 + CASCADE +
+ + + near_relation + varchar + Relationship Name (Near side) + 64 + name for relationship of near_contact to far_contact. + 5.29 + + + + far_contact_id + int unsigned + Contact ID (Far side) + true + id of the second contact + 5.29 + + EntityRef + + + + far_contact_id + civicrm_contact
+ id + 5.29 + CASCADE +
+ + + far_relation + varchar + Relationship Name (Near side) + 64 + name for relationship of far_contact to near_contact. + 5.29 + + + + UI_relationship + relationship_id + orientation + true + 5.29 + + + + index_nearid_nearrelation + near_contact_id + near_relation + 5.29 + + + + index_nearid_farrelation + near_contact_id + far_relation + 5.29 + + + + index_near_relation + near_relation + 5.29 + + + + + + is_active + boolean + Relationship Is Active + 1 + is the relationship active ? + 5.29 + + CheckBox + + + + start_date + relationship_start_date + date + Relationship Start Date + date when the relationship started + 5.29 + + Select Date + activityDate + + + + end_date + relationship_end_date + date + Relationship End Date + date when the relationship ended + 5.29 + + Select Date + activityDate + + + + + case_id + int unsigned + Relationship Case + NULL + FK to civicrm_case + 5.29 + + + case_id + civicrm_case
+ id + 5.29 + CASCADE +
+ diff --git a/xml/schema/Contact/files.xml b/xml/schema/Contact/files.xml index fd9cfb946f..dd9ea40d1c 100644 --- a/xml/schema/Contact/files.xml +++ b/xml/schema/Contact/files.xml @@ -13,6 +13,7 @@ + -- 2.25.1