/**
  * remove protected properties and execute @name annotation
  *
  * @param Record $record
  */
 protected function finalizeRecord(Record $record, DataDimensions $dataDimensions)
 {
     // Apply @name annotation
     if ($record->getDataTypeDefinition()->hasNamingPattern()) {
         $record->setName(Util::applyNamingPattern($record->getProperties(), $record->getDataTypeDefinition()->getNamingPattern()));
     }
     // remove protected properties
     $properties = $record->getProperties();
     foreach ($record->getDataTypeDefinition()->getProtectedProperties($dataDimensions->getViewName()) as $property) {
         unset($properties[$property]);
     }
     $record->setProperties($properties);
     return $record;
 }
 protected function mergeExistingRecord(Record $record, DataDimensions $dataDimensions)
 {
     if ($record->getID() != '') {
         $existingRecord = $this->getMultiViewRecord($record->getId(), $record->getContentTypeName(), $dataDimensions);
         if ($existingRecord) {
             $record->setRevision($existingRecord->getRevision());
             $existingProperties = $existingRecord->getProperties();
             $mergedProperties = array_merge($existingProperties, $record->getProperties());
             $mergedRecord = clone $record;
             $mergedRecord->setProperties($mergedProperties);
             return $mergedRecord;
         }
     }
     return $record;
 }
 protected function hasChanged(Repository $repository, Record $record)
 {
     if ($record->getID() != null) {
         $records = $this->getRecords($repository);
         if (isset($records[$record->getID()])) {
             /** @var Record $effectiveRecord */
             $effectiveRecord = $records[$record->getID()];
             foreach ($record->getProperties() as $property => $value) {
                 if ($effectiveRecord->getProperty($property) != $value) {
                     return true;
                 }
             }
             return false;
         }
     }
     return true;
 }