/** * @param WorkflowMessage $message * @return LogMessage|WorkflowMessage */ private function processData(WorkflowMessage $message) { $metadata = $message->metadata(); $copiedTableName = null; $orgTableName = $this->table; if (isset($metadata[self::META_EMPTY_TABLE]) && $metadata[self::META_EMPTY_TABLE]) { $copiedTableName = $this->copyTable(); //We override the target table to insert into the copy table first $this->table = $copiedTableName; } $forceInsert = true; if (is_null($copiedTableName) && isset($metadata[self::META_TRY_UPDATE]) && $metadata[self::META_TRY_UPDATE]) { $forceInsert = false; } $message = $this->updateOrInsertPayload($message, $forceInsert); $ignoreErrors = isset($metadata[self::META_IGNORE_ERRORS]) ? (bool) $metadata[self::META_IGNORE_ERRORS] : false; if (!is_null($copiedTableName)) { $this->table = $orgTableName; if (!$ignoreErrors && $message instanceof LogMessage) { $this->dropCopyTable($orgTableName); return $message; } $this->replaceOrgTableWithCopy($orgTableName, $copiedTableName); } return $message; }
/** * @param WorkflowMessage $workflowMessage * @throws \InvalidArgumentException */ private function processData(WorkflowMessage $workflowMessage) { $metadata = $workflowMessage->metadata(); if (isset($metadata[self::META_LOCATION]) && !isset($metadata[self::META_PATH])) { $metadata[self::META_PATH] = $this->locationTranslator->getPathFor($metadata[self::META_LOCATION]); } if (!isset($metadata[self::META_FILENAME_TEMPLATE])) { throw new \InvalidArgumentException("Missing filename_pattern in metadata"); } if (!isset($metadata[self::META_FILE_TYPE])) { throw new \InvalidArgumentException("Missing file_type in metadata"); } if (!isset($metadata[self::META_PATH])) { throw new \InvalidArgumentException("Missing path in metadata"); } $metadata[self::META_PATH] = $this->sanitizePath($metadata[self::META_PATH]); if (!is_dir($metadata[self::META_PATH])) { throw new \InvalidArgumentException(sprintf('Directory %s is invalid', $metadata[self::META_PATH])); } if (!is_writable($metadata[self::META_PATH])) { throw new \InvalidArgumentException(sprintf('Directory %s is not writable', $metadata[self::META_PATH])); } $type = $workflowMessage->payload()->toType(); $fileTypeAdapter = $this->fileTypeAdapters->get($metadata[self::META_FILE_TYPE]); if ($type->description()->nativeType() === NativeType::COLLECTION && isset($metadata[self::META_WRITE_MULTI_FILES]) && $metadata[self::META_WRITE_MULTI_FILES]) { foreach ($type as $index => $item) { $this->writeTypeToFile($item, $metadata, $fileTypeAdapter, $index); } } else { $this->writeTypeToFile($type, $metadata, $fileTypeAdapter); } return $workflowMessage->answerWithDataProcessingCompleted($metadata); }
/** * @param WorkflowMessage $workflowMessage * @param WorkflowEngine $workflowEngine */ private function startSubProcessForEachChunk(WorkflowMessage $workflowMessage, WorkflowEngine $workflowEngine) { $taskListEntry = $this->taskList->getNextNotStartedTaskListEntry(); $this->recordThat(TaskEntryMarkedAsRunning::at($taskListEntry->taskListPosition())); $this->processingCollection = true; /** @var $task RunSubProcess */ $task = $taskListEntry->task(); $metadata = $workflowMessage->metadata(); $currentOffset = 0; $currentLimit = (int) $metadata[self::META_LIMIT]; $totalItems = (int) $metadata[self::META_TOTAL_ITEMS]; //May start message was performed as a count only message so we unset this instruction to tell //the workflow message handler that it should collect the data now. unset($metadata[self::META_COUNT_ONLY]); do { $typeClass = $workflowMessage->payload()->getTypeClass(); $metadata[self::META_OFFSET] = $currentOffset; $metadata[self::META_LIMIT] = $currentLimit; $collectChunk = WorkflowMessage::collectDataOf($typeClass::prototype(), $this->taskList->taskListId()->nodeName(), $task->targetNodeName(), $metadata); $collectChunk->connectToProcessTask($taskListEntry->taskListPosition()); $this->recordThat(MultiPerformTaskWasStarted::at($taskListEntry->taskListPosition())); $this->performRunSubProcess($task, $taskListEntry->taskListPosition(), $workflowEngine, $collectChunk); $currentOffset = $currentOffset + $currentLimit; } while ($currentOffset + $currentLimit <= $totalItems); $this->processingCollection = false; }