Skip to content

Commit

Permalink
Multiple tags in single cell #188 (virusseq#89)
Browse files Browse the repository at this point in the history
* Code changes to accept multiple tags in a single cell in the Tsv - ticket #188

* Code changes to accept multiple tags in a single cell in the Tsv - ticket #188

* Refactored code to make the delimiter configurable. - ticket #188

* Refactored code to make the delimiter configurable. - ticket #188

* Incorporated review comments 1 & 3 on git - ticket #188

* Incorporated review comments on git - ticket #188

* Incorporated review comments on git - ticket #188

* Incorporated review comments on git - ticket #188

* Incorporated review comments on git, rectified errors. - ticket #188

Co-authored-by: UmmulkiramR <[email protected]>
  • Loading branch information
2 people authored and justincorrigible committed Aug 17, 2022
1 parent 739891e commit 9ed8b79
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
Expand All @@ -30,14 +28,31 @@
import org.cancogenvirusseq.muse.model.SubmissionBundle;
import org.cancogenvirusseq.muse.model.SubmissionFile;
import org.cancogenvirusseq.muse.model.UploadRequest;
import org.cancogenvirusseq.muse.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.method.P;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class PayloadFileMapper {
private final String payloadJsonTemplate;

private static String multiTagDelimiter;
private static List<String> columnKeys;


@Value("${tsv.columnKeys:''}")
public void setColumnKeys(List<String> keys) {
columnKeys = keys;
}

@Value("${tsv.multiTagDelimiter}")
public void setMultiTagDelimiter(String delimiter) {
multiTagDelimiter = delimiter;
}

@Autowired
public PayloadFileMapper(MuseAppConfig config) {
this.payloadJsonTemplate = config.getPayloadJsonTemplate();
Expand Down Expand Up @@ -153,7 +168,11 @@ private static ObjectNode convertRecordToPayload(
} else if (value.toString().trim().equals("")) {
// empty string map to null value
return "null";
} else {
} else if((!Objects.isNull(columnKeys) && columnKeys.contains(key)) && (value.toString().split(multiTagDelimiter).length>0)) {
//for multiple tags in single cell
return StringUtils.stringToArrayOfStrings(value.toString(), multiTagDelimiter);
}
else {
// for string append double quotes and escape any existing double quotes
return format("\"%s\"", value.toString().replace("\"", "\\\""));
}
Expand All @@ -167,6 +186,8 @@ private static ObjectNode convertRecordToPayload(
return new ObjectMapper().readValue(templatedStr, ObjectNode.class);
}



private static JsonNode createFilesObject(SubmissionFile submissionFile, String fileName) {
val filesArray = JsonNodeFactory.instance.arrayNode(1);
val fileObj = JsonNodeFactory.instance.objectNode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class TsvFieldSchema {

public enum ValueType {
string,
number
number,
array
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ private Disposable createSubmitUploadDisposable() {
}

public Mono<Upload> submitAndUploadToSongScore(UploadEvent uploadEvent) {
log.debug("UploadEvent:payload for song - {}", uploadEvent.getPayload());
return ariaClient
.submitPayload(uploadEvent.getStudyId(), uploadEvent.getPayload())
.flatMap(
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/org/cancogenvirusseq/muse/utils/StringUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.util.regex.Pattern;
import lombok.experimental.UtilityClass;

import static java.lang.String.format;

@UtilityClass
public class StringUtils {
private static final Pattern INTEGER_PATTERN = Pattern.compile("^-?\\d+$");
Expand All @@ -15,4 +17,13 @@ public static Boolean isDouble(String s) {
public static Boolean isInteger(String s) {
return INTEGER_PATTERN.matcher(s).matches();
}

public static String stringToArrayOfStrings(String value, String delimiter){
StringBuilder sb = new StringBuilder();
for (String n : value.toString().split(delimiter)) {
if (sb.length() > 0) sb.append(',');
sb.append(format("\"%s\"", n.toString().replace("\"", "\\\"")));
}
return sb.toString();
}
}
5 changes: 5 additions & 0 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,8 @@ management:
endpoint:
health:
show-details: NEVER

tsv:
multiTagDelimiter: ";"
columnKeys: anatomical part,purpose of sequencing

4 changes: 2 additions & 2 deletions src/main/resources/payload-template
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"purpose_of_sampling": ${purpose of sampling},
"purpose_of_sampling_details": ${purpose of sampling details},
"anatomical_material": ${anatomical material},
"anatomical_part": ${anatomical part},
"anatomical_part": [${anatomical part}],
"body_product": ${body product},
"environmental_material": ${environmental material},
"environmental_site": ${environmental site},
Expand All @@ -50,7 +50,7 @@
"host_gender": ${host gender}
},
"experiment": {
"purpose_of_sequencing": ${purpose of sequencing},
"purpose_of_sequencing": [${purpose of sequencing}],
"purpose_of_sequencing_details": ${purpose of sequencing details},
"sequencing_instrument": ${sequencing instrument},
"sequencing_protocol": ${sequencing protocol}
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/tsv-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
{ "name": "purpose of sampling", "valueType": "string" },
{ "name": "purpose of sampling details", "valueType": "string" },
{ "name": "anatomical material", "valueType": "string" },
{ "name": "anatomical part", "valueType": "string" },
{ "name": "anatomical part", "valueType": "array" },
{ "name": "body product", "valueType": "string" },
{ "name": "environmental material", "valueType": "string" },
{ "name": "environmental site", "valueType": "string" },
Expand All @@ -26,7 +26,7 @@
{ "name": "host age unit", "valueType": "string" },
{ "name": "host age bin", "valueType": "string" },
{ "name": "host gender", "valueType": "string" },
{ "name": "purpose of sequencing", "valueType": "string" },
{ "name": "purpose of sequencing", "valueType": "array" },
{ "name": "purpose of sequencing details", "valueType": "string" },
{ "name": "sequencing instrument", "valueType": "string" },
{ "name": "sequencing protocol", "valueType": "string" },
Expand Down

0 comments on commit 9ed8b79

Please sign in to comment.