use of bio.terra.service.filedata.google.firestore.FireStoreDirectoryEntry in project jade-data-repo by DataBiosphere.
the class IngestFileDirectoryStep method doStep.
@Override
public StepResult doStep(FlightContext context) {
FlightMap inputParameters = context.getInputParameters();
FileLoadModel loadModel = inputParameters.get(JobMapKeys.REQUEST.getKeyName(), FileLoadModel.class);
FlightMap workingMap = context.getWorkingMap();
String fileId = workingMap.get(FileMapKeys.FILE_ID, String.class);
workingMap.put(FileMapKeys.LOAD_COMPLETED, false);
String datasetId = dataset.getId().toString();
String targetPath = loadModel.getTargetPath();
try {
// The state logic goes like this:
// 1. the directory entry doesn't exist. We need to create the directory entry for it.
// 2. the directory entry exists. There are three cases:
// a. If loadTags do not match, then we throw FileAlreadyExistsException.
// b. directory entry loadTag matches our loadTag AND entry fileId matches our fileId:
// means we are recovering and need to complete the file creation work.
// c. directory entry loadTag matches our loadTag AND entry fileId does NOT match our fileId
// means this is a re-run of a load job. We update the fileId in the working map. We don't
// know if we are recovering or already finished. We try to retrieve the file object for
// the entry fileId:
// i. If that is successful, then we already loaded this file. We store "completed=true"
// in the working map, so other steps do nothing.
// ii. If that fails, then we are recovering: we leave completed unset (=false) in the working map.
//
// Lookup the file - on a recovery, we may have already created it, but not
// finished. Or it might already exist, created by someone else.
FireStoreDirectoryEntry existingEntry = fileDao.lookupDirectoryEntryByPath(dataset, targetPath);
if (existingEntry == null) {
// Not there - create it
FireStoreDirectoryEntry newEntry = new FireStoreDirectoryEntry().fileId(fileId).isFileRef(true).path(fireStoreUtils.getDirectoryPath(loadModel.getTargetPath())).name(fireStoreUtils.getName(loadModel.getTargetPath())).datasetId(datasetId).loadTag(loadModel.getLoadTag());
fileDao.createDirectoryEntry(dataset, newEntry);
} else {
if (!StringUtils.equals(existingEntry.getLoadTag(), loadModel.getLoadTag())) {
// (a) Exists and is not our file
throw new FileAlreadyExistsException("Path already exists: " + targetPath);
}
// (b) or (c) Load tags match - check file ids
if (!StringUtils.equals(existingEntry.getFileId(), fileId)) {
// (c) We are in a re-run of a load job. Try to get the file entry.
fileId = existingEntry.getFileId();
workingMap.put(FileMapKeys.FILE_ID, fileId);
FireStoreFile fileEntry = fileDao.lookupFile(dataset, fileId);
if (fileEntry != null) {
// (c)(i) We successfully loaded this file already
workingMap.put(FileMapKeys.LOAD_COMPLETED, true);
}
// (c)(ii) We are recovering and should continue this load; leave load completed false/unset
}
}
} catch (FileSystemAbortTransactionException rex) {
return new StepResult(StepStatus.STEP_RESULT_FAILURE_RETRY, rex);
}
return StepResult.getStepResultSuccess();
}
Aggregations