APIv4 - Don't advertise implicit multi-joins in Explorer
authorColeman Watts <coleman@civicrm.org>
Thu, 30 Apr 2020 20:09:12 +0000 (16:09 -0400)
committerColeman Watts <coleman@civicrm.org>
Thu, 30 Apr 2020 20:11:23 +0000 (16:11 -0400)
These joins are problematic and may be removed. The Explorer should not display them.

CRM/Api4/Page/Api4Explorer.php
ang/api4Explorer/Explorer.js

index 77eb0d1e5337f3752e4f144d984ca36224faf6c8..e0d03bc8fb982edbef58487807690f98ec060286 100644 (file)
@@ -10,6 +10,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\Service\Schema\Joinable\Joinable;
+
 /**
  *
  * @package CRM
@@ -22,11 +24,18 @@ class CRM_Api4_Page_Api4Explorer extends CRM_Core_Page {
   public function run() {
     $apiDoc = new ReflectionFunction('civicrm_api4');
     $groupOptions = civicrm_api4('Group', 'getFields', ['loadOptions' => TRUE, 'select' => ['options', 'name'], 'where' => [['name', 'IN', ['visibility', 'group_type']]]]);
+    // Don't show n-to-many joins in Explorer
+    $entityLinks = (array) civicrm_api4('Entity', 'getLinks', [], ['entity' => 'links']);
+    foreach ($entityLinks as $entity => $links) {
+      $entityLinks[$entity] = array_filter($links, function($link) {
+        return $link['joinType'] != Joinable::JOIN_TYPE_ONE_TO_MANY;
+      });
+    }
     $vars = [
       'operators' => \CRM_Core_DAO::acceptedSQLOperators(),
       'basePath' => Civi::resources()->getUrl('civicrm'),
       'schema' => (array) \Civi\Api4\Entity::get()->setChain(['fields' => ['$name', 'getFields']])->execute(),
-      'links' => (array) \Civi\Api4\Entity::getLinks()->execute(),
+      'links' => $entityLinks,
       'docs' => \Civi\Api4\Utils\ReflectionUtils::parseDocBlock($apiDoc->getDocComment()),
       'groupOptions' => array_column((array) $groupOptions, 'options', 'name'),
     ];
index 09db7d1d02a2023fee9ea88a87af0f7e462f5bf5..3ada1557e087f23193a46965c364e385004edd93 100644 (file)
     }
 
     function addJoins(fieldList, addWildcard) {
-      var fields = _.cloneDeep(fieldList),
-        fks = _.findWhere(links, {entity: $scope.entity}) || {};
-      _.each(fks.links, function(link) {
+      var fields = _.cloneDeep(fieldList);
+      _.each(links[$scope.entity], function(link) {
         var linkFields = _.cloneDeep(entityFields(link.entity)),
           wildCard = addWildcard ? [{id: link.alias + '.*', text: link.alias + '.*', 'description': 'All core ' + link.entity + ' fields'}] : [];
         if (linkFields) {
         return comboName;
       }
       var linkName = fieldNames.shift(),
-        entityLinks = _.findWhere(links, {entity: entity}).links,
-        newEntity = _.findWhere(entityLinks, {alias: linkName}).entity;
+        newEntity = _.findWhere(links[entity], {alias: linkName}).entity;
       return get(newEntity, fieldNames);
     }
   }