From a282541669b29e7641338cd0cda3909a12247c3f Mon Sep 17 00:00:00 2001 From: Claudiu Cristea Date: Thu, 18 Feb 2021 20:51:03 +0200 Subject: [PATCH] ISAICP-3576: Move cardinality limitation on save. --- src/SparqlEntityStorage.php | 20 +++++++++---------- src/SparqlEntityStorageFieldHandler.php | 8 ++++---- ...arqlEntityStorageFieldHandlerInterface.php | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/SparqlEntityStorage.php b/src/SparqlEntityStorage.php index d86bbf5..0f17dd0 100644 --- a/src/SparqlEntityStorage.php +++ b/src/SparqlEntityStorage.php @@ -395,14 +395,11 @@ protected function processResults(array $triples, array $graph_ids, array $graph foreach (array_diff_key($entity, array_flip($processed_fields)) as $predicate => $languages) { // Complex field with field predicate. if ($field_name = $this->fieldHandler->getFieldNameByPredicate($entity_type_id, $bundle, $predicate)) { - $cardinality = $this->fieldHandler->getFieldCardinality($entity_type_id, $field_name); foreach ($languages as $langcode => $values) { foreach ($values as $delta => $item) { - if ($cardinality === FieldStorageConfigInterface::CARDINALITY_UNLIMITED || $delta < $cardinality) { - foreach ($item as $column_predicate => $value) { - $column_name = $this->fieldHandler->getColumnNameByPredicate($entity_type_id, $bundle, $column_predicate); - $entity[$field_name][$langcode][$delta][$column_name] = $this->fieldHandler->getInboundValue($entity_type_id, $field_name, $value, $langcode, $column_name, $bundle); - } + foreach ($item as $column_predicate => $value) { + $column_name = $this->fieldHandler->getColumnNameByPredicate($entity_type_id, $bundle, $column_predicate); + $entity[$field_name][$langcode][$delta][$column_name] = $this->fieldHandler->getInboundValue($entity_type_id, $field_name, $value, $langcode, $column_name, $bundle); } } } @@ -410,12 +407,9 @@ protected function processResults(array $triples, array $graph_ids, array $graph // Simple column mappings. elseif ($column_name = $this->fieldHandler->getColumnNameByPredicate($entity_type_id, $bundle, $predicate)) { $field_name = $this->fieldHandler->getColumnFieldNameByPredicate($entity_type_id, $bundle, $predicate); - $cardinality = $this->fieldHandler->getFieldCardinality($entity_type_id, $field_name); foreach ($languages as $langcode => $values) { foreach ($values as $delta => $value) { - if ($cardinality === FieldStorageConfigInterface::CARDINALITY_UNLIMITED || $delta < $cardinality) { - $entity[$field_name][$langcode][$delta][$column_name] = $this->fieldHandler->getInboundValue($entity_type_id, $field_name, $value, $langcode, $column_name, $bundle); - } + $entity[$field_name][$langcode][$delta][$column_name] = $this->fieldHandler->getInboundValue($entity_type_id, $field_name, $value, $langcode, $column_name, $bundle); } } } @@ -946,6 +940,7 @@ protected function doSave($id, EntityInterface $entity) { $lang_array = $this->toLangArray($entity); foreach ($lang_array as $field_name => $langcode_data) { $field_predicate = $this->fieldHandler->getFieldPredicate($entity_type_id, $field_name); + $cardinality = $this->fieldHandler->getFieldCardinality($entity_type_id, $field_name); foreach ($langcode_data as $langcode => $field_item_list) { foreach ($field_item_list as $delta => $field_item) { // This is a multi-value field, we store the subsequent field item @@ -975,6 +970,11 @@ protected function doSave($id, EntityInterface $entity) { $graph->add($id, $predicate, $value); } } + + if ($cardinality && $cardinality !== FieldStorageConfigInterface::CARDINALITY_UNLIMITED && $cardinality === $delta + 1) { + // Just reached the max delta for fields with limited cardinality. + break; + } } } } diff --git a/src/SparqlEntityStorageFieldHandler.php b/src/SparqlEntityStorageFieldHandler.php index 6bf80a5..e8d0c64 100644 --- a/src/SparqlEntityStorageFieldHandler.php +++ b/src/SparqlEntityStorageFieldHandler.php @@ -193,11 +193,11 @@ protected function buildEntityTypeProperties($entity_type_id) { $field_storage_definition = $field_definition->getFieldStorageDefinition(); if ($field_storage_definition instanceof BaseFieldDefinition) { - $column_mappings = $bundle_info['sparql_entity_storage']['base_fields_mapping'][$field_name] ?? NULL; + $column_mappings = $bundle_info['sparql_entity_storage']['base_fields_mapping'][$field_name] ?? []; $field_predicate = $bundle_info['sparql_entity_storage']['field_predicates'][$field_name] ?? NULL; } else { - $column_mappings = $field_storage_definition->getThirdPartySetting('sparql_entity_storage', 'mapping'); + $column_mappings = $field_storage_definition->getThirdPartySetting('sparql_entity_storage', 'mapping', []); $field_predicate = $field_storage_definition->getThirdPartySetting('sparql_entity_storage', 'field_predicate'); } @@ -474,8 +474,8 @@ public function getFieldPredicate(string $entity_type_id, string $field_name): ? /** * {@inheritdoc} */ - public function getFieldCardinality(string $entity_type_id, string $field_name): int { - return $this->getOutboundMap($entity_type_id)['fields'][$field_name]['cardinality']; + public function getFieldCardinality(string $entity_type_id, string $field_name): ?int { + return $this->getOutboundMap($entity_type_id)['fields'][$field_name]['cardinality'] ?? NULL; } /** diff --git a/src/SparqlEntityStorageFieldHandlerInterface.php b/src/SparqlEntityStorageFieldHandlerInterface.php index fe3e3c7..4d77784 100644 --- a/src/SparqlEntityStorageFieldHandlerInterface.php +++ b/src/SparqlEntityStorageFieldHandlerInterface.php @@ -279,7 +279,7 @@ public function getFieldPredicate(string $entity_type_id, string $field_name): ? * @return int * The field cardinality. */ - public function getFieldCardinality(string $entity_type_id, string $field_name): int; + public function getFieldCardinality(string $entity_type_id, string $field_name): ?int; /** * Returns all field predicates for a given entity type.