protected function prepareDatasetRecords4Submission(DataControllerCallContext $callcontext, $request) {
        $preparedRecords = NULL;

        $datasetName = $request->getDatasetName();

        $isOperationInsert = $request->getOperationName() == DatasetInsertRequest::$OPERATION__INSERT;
        $isOperationDelete = $request->getOperationName() == DatasetDeleteRequest::$OPERATION__DELETE;

        $recordMetaData = $request->recordsHolder->recordMetaData;
        $keyColumn = $recordMetaData->findKeyColumn();
        $keyColumnName = isset($keyColumn) ? $keyColumn->name : NULL;

        $documentIds = NULL;
        if ($request->recordsHolder instanceof IndexedRecordsHolder) {
            $columnCount = $recordMetaData->getColumnCount();

            foreach ($request->recordsHolder->records as $record) {
                $preparedRecord = NULL;

                for ($i = 0; $i < $columnCount; $i++) {
                    $column = $recordMetaData->columns[$i];

                    $columnValue = $record[$i];
                    if (isset($columnValue)) {
                        $preparedRecord->{$column->name} = $columnValue;
                    }
                }

                // preparing document identifier
                if (!isset($preparedRecord->_id) && isset($keyColumnName)) {
                    $preparedRecord->_id = $preparedRecord->$keyColumnName;
                }

                // collecting document identifiers to load last revisions
                if (!$isOperationInsert) {
                    if (isset($preparedRecord->_id)) {
                        $documentIds[] = $preparedRecord->_id;
                    }
                    else {
                        LogHelper::log_error($preparedRecord);
                        throw new IllegalArgumentException(t('Could not find document identifier for the document'));
                    }
                }

                $preparedRecords[] = $preparedRecord;
            }

        }
        else {
            foreach ($request->recordsHolder->records as $record) {
                // preparing document identifier
                if (!isset($record->_id) && isset($keyColumnName)) {
                    $record->_id = $record->$keyColumnName;
                }

                // collecting document identifiers to load last revisions
                if (!$isOperationInsert) {
                    if (isset($record->_id)) {
                        $documentIds[] = $record->_id;
                    }
                    else {
                        LogHelper::log_error($record);
                        throw new IllegalArgumentException(t('Could not find document identifier for the document'));
                    }
                }

                $preparedRecords[] = $record;
            }
        }

        if (!$isOperationInsert) {
            // loading previous revisions
            $revisions = NULL;
            if (isset($documentIds)) {
                $revisionRequest = new DatasetQueryRequest($datasetName);
                $revisionRequest->addQueryValues(0, '_id', $documentIds);

                $revisionResponse = $this->queryDataset($callcontext, $revisionRequest, NULL);

                if (isset($revisionResponse)) {
                    foreach ($revisionResponse as $revision) {
                        $revisions[$revision->_id] = $revision->_rev;
                    }
                }
            }

            foreach ($preparedRecords as $record) {
                // setting revision
                if ((isset($revisions) && isset($revisions[$record->_id]))) {
                    $record->_rev = $revisions[$record->_id];
                }
                else {
                    throw new IllegalArgumentException(t(
                    	'Could not find last revision for the document: @id',
                        array('@id' => $record->_id)));
                }

                if ($isOperationDelete) {
                    $record->_deleted = TRUE;
                }
            }
        }

        return $preparedRecords;
    }