chg: [internal] Speedup checking valid object for attributes

pull/8611/head
Jakub Onderka 2022-09-23 10:59:53 +02:00
parent ef20103e68
commit 08cab274a0
3 changed files with 22 additions and 27 deletions

View File

@ -1261,11 +1261,11 @@ class MispObject extends AppModel
'group' => 'ObjectTemplate.id',
));
$templates = $this->ObjectTemplate->find('all', array(
$templates = $this->ObjectTemplate->find('all', [
'recursive' => -1,
'conditions' => array('id' => $potentialTemplateIds),
'contain' => 'ObjectTemplateElement'
));
'conditions' => ['id' => $potentialTemplateIds],
'contain' => ['ObjectTemplateElement' => ['fields' => ['object_relation', 'type', 'multiple']]]
]);
foreach ($templates as $i => $template) {
$res = $this->ObjectTemplate->checkTemplateConformityBasedOnTypes($template, $attributes);

View File

@ -215,10 +215,13 @@ class ObjectTemplate extends AppModel
{
$to_return = array('valid' => true, 'missingTypes' => array());
if (!empty($template['ObjectTemplate']['requirements'])) {
// construct array containing ObjectTemplateElement with object_relation as key for faster search
$elementsByObjectRelationName = array_column($template['ObjectTemplateElement'], null, 'object_relation');
// check for all required attributes
if (!empty($template['ObjectTemplate']['requirements']['required'])) {
foreach ($template['ObjectTemplate']['requirements']['required'] as $requiredField) {
$requiredType = Hash::extract($template['ObjectTemplateElement'], sprintf('{n}[object_relation=%s].type', $requiredField))[0];
$requiredType = $elementsByObjectRelationName[$requiredField]['type'];
$found = false;
foreach ($attributes as $attribute) {
if ($attribute['Attribute']['type'] === $requiredType) {
@ -234,11 +237,10 @@ class ObjectTemplate extends AppModel
// check for all required one of attributes
if (!empty($template['ObjectTemplate']['requirements']['requiredOneOf'])) {
$found = false;
$all_required_type = array();
$allRequiredTypes = array();
foreach ($template['ObjectTemplate']['requirements']['requiredOneOf'] as $requiredField) {
$requiredType = Hash::extract($template['ObjectTemplateElement'], sprintf('{n}[object_relation=%s].type', $requiredField));
$requiredType = empty($requiredType) ? null : $requiredType[0];
$all_required_type[] = $requiredType;
$requiredType = $elementsByObjectRelationName[$requiredField]['type'] ?? null;
$allRequiredTypes[] = $requiredType;
foreach ($attributes as $attribute) {
if ($attribute['Attribute']['type'] === $requiredType) {
$found = true;
@ -247,7 +249,7 @@ class ObjectTemplate extends AppModel
}
}
if (!$found) {
$to_return = array('valid' => false, 'missingTypes' => $all_required_type);
$to_return = array('valid' => false, 'missingTypes' => $allRequiredTypes);
}
}
}

View File

@ -1,30 +1,23 @@
<?php
App::uses('AppModel', 'Model');
class ObjectTemplateElement extends AppModel
{
public $actsAs = array(
'Containable'
);
public $belongsTo = array(
);
public $validate = array(
'Containable'
);
public function afterFind($results, $primary = false)
{
foreach ($results as $k => $result) {
if (isset($results[$k]['ObjectTemplateElement']['categories'])) {
$results[$k]['ObjectTemplateElement']['categories'] = json_decode($results[$k]['ObjectTemplateElement']['categories'], true);
foreach ($results as &$result) {
if (isset($result['ObjectTemplateElement']['categories'])) {
$result['ObjectTemplateElement']['categories'] = json_decode($result['ObjectTemplateElement']['categories'], true);
}
if (isset($results[$k]['ObjectTemplateElement']['values_list'])) {
$results[$k]['ObjectTemplateElement']['values_list'] = json_decode($results[$k]['ObjectTemplateElement']['values_list'], true);
if (isset($result['ObjectTemplateElement']['values_list'])) {
$result['ObjectTemplateElement']['values_list'] = json_decode($result['ObjectTemplateElement']['values_list'], true);
}
if (isset($results[$k]['ObjectTemplateElement']['sane_default'])) {
$results[$k]['ObjectTemplateElement']['sane_default'] = json_decode($results[$k]['ObjectTemplateElement']['sane_default'], true);
if (isset($result['ObjectTemplateElement']['sane_default'])) {
$result['ObjectTemplateElement']['sane_default'] = json_decode($result['ObjectTemplateElement']['sane_default'], true);
}
}
return $results;
@ -42,8 +35,8 @@ class ObjectTemplateElement extends AppModel
return true;
}
public function getAllAvailableTypes() {
public function getAllAvailableTypes()
{
$temp = $this->find('all', array(
'recursive' => -1,
'fields' => array('object_relation as type', 'description AS desc', 'categories'),