Skip to content

Commit f7eb8a1

Browse files
author
Grace Calianese
committed
Merge branch 'master' into RLPNC-7547-error-list
# Conflicts: # json/src/test/java/com/basistech/rosette/apimodel/recordsimilarity/RecordSimilarityResponseTest.java
2 parents d7bedd3 + 4187c67 commit f7eb8a1

File tree

5 files changed

+69
-58
lines changed

5 files changed

+69
-58
lines changed

json/src/main/java/com/basistech/rosette/apimodel/jackson/recordsimilaritydeserializers/RecordSimilarityDeserializerUtilities.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,18 @@ final class RecordSimilarityDeserializerUtilities {
4747
private RecordSimilarityDeserializerUtilities() {
4848
}
4949

50-
public static RecordSimilarityResult parseResult(
51-
JsonNode node,
52-
JsonParser jsonParser,
53-
@Valid Map<String, RecordSimilarityFieldInfo> fields
54-
) throws IOException {
50+
public static RecordSimilarityResult parseResult(JsonNode node, JsonParser jsonParser) throws IOException {
5551
final Double score = node.get("score") != null
5652
? node.get("score").traverse(jsonParser.getCodec()).readValueAs(Double.class)
5753
: null;
5854
final RecordSimilarityExplainInfo explainInfo = node.get("explainInfo") != null
5955
? node.get("explainInfo").traverse(jsonParser.getCodec()).readValueAs(RecordSimilarityExplainInfo.class)
6056
: null;
61-
final Map<String, RecordSimilarityField> left = node.get("left") != null && fields != null
62-
? parseRecord(node.get("left"), jsonParser, fields)
57+
final Map<String, RecordSimilarityField> left = node.get("left") != null
58+
? parseRecordForResponse(node.get("left"), jsonParser)
6359
: null;
64-
final Map<String, RecordSimilarityField> right = node.get("right") != null && fields != null
65-
? parseRecord(node.get("right"), jsonParser, fields)
60+
final Map<String, RecordSimilarityField> right = node.get("right") != null
61+
? parseRecordForResponse(node.get("right"), jsonParser)
6662
: null;
6763

6864
List<String> errorList = new ArrayList<>();
@@ -87,6 +83,20 @@ public static RecordSimilarityResult parseResult(
8783
.build();
8884
}
8985

86+
static Map<String, RecordSimilarityField> parseRecordForResponse(JsonNode jsonNode, JsonParser jsonParser) {
87+
final Map<String, RecordSimilarityField> recordMap = new HashMap<>();
88+
jsonNode.fields().forEachRemaining(entry -> {
89+
String fieldName = entry.getKey();
90+
try {
91+
recordMap.put(fieldName, jsonNode.get(fieldName).traverse(jsonParser.getCodec())
92+
.readValueAs(UnknownField.class));
93+
} catch (IOException e) {
94+
throw new RuntimeException(e);
95+
}
96+
});
97+
return recordMap;
98+
}
99+
90100
static Map<String, RecordSimilarityField> parseRecord(
91101
JsonNode jsonNode,
92102
JsonParser jsonParser,

json/src/main/java/com/basistech/rosette/apimodel/jackson/recordsimilaritydeserializers/RecordSimilarityResponseDeserializer.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,22 @@
1616

1717
package com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers;
1818

19-
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityFieldInfo;
2019
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResponse;
2120
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResult;
2221
import com.fasterxml.jackson.core.JsonParser;
23-
import com.fasterxml.jackson.core.type.TypeReference;
2422
import com.fasterxml.jackson.databind.DeserializationContext;
2523
import com.fasterxml.jackson.databind.JsonNode;
2624
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
2725

2826
import java.io.IOException;
2927
import java.util.ArrayList;
3028
import java.util.List;
31-
import java.util.Map;
3229
import java.util.Optional;
3330
import java.util.stream.Collectors;
3431
import java.util.stream.StreamSupport;
3532

3633
public class RecordSimilarityResponseDeserializer extends StdDeserializer<RecordSimilarityResponse> {
3734

38-
private static final TypeReference<Map<String, RecordSimilarityFieldInfo>> FIELDS_TYPE_REFERENCE = new TypeReference<>() {
39-
};
40-
4135
public RecordSimilarityResponseDeserializer() {
4236
super(RecordSimilarityResponse.class);
4337
}
@@ -46,9 +40,6 @@ public RecordSimilarityResponseDeserializer() {
4640
public RecordSimilarityResponse deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
4741
final JsonNode node = jsonParser.getCodec().readTree(jsonParser);
4842

49-
JsonNode fieldsNode = node.get("fields");
50-
51-
Map<String, RecordSimilarityFieldInfo> fields = fieldsNode != null ? node.get("fields").traverse(jsonParser.getCodec()).readValueAs(FIELDS_TYPE_REFERENCE) : null;
5243
List<String> info = Optional.ofNullable(node.get("info"))
5344
.map(jsonNode -> StreamSupport.stream(jsonNode.spliterator(), false)
5445
.map(JsonNode::asText)
@@ -60,12 +51,10 @@ public RecordSimilarityResponse deserialize(JsonParser jsonParser, Deserializati
6051
List<RecordSimilarityResult> results = new ArrayList<>();
6152
if (resultsNode != null) {
6253
for (JsonNode resultNode : resultsNode) {
63-
results.add(RecordSimilarityDeserializerUtilities.parseResult(resultNode, jsonParser, fields));
54+
results.add(RecordSimilarityDeserializerUtilities.parseResult(resultNode, jsonParser));
6455
}
6556
}
66-
6757
return RecordSimilarityResponse.builder()
68-
.fields(fields)
6958
.results(results)
7059
.info(info)
7160
.errorMessage(errorMessage)

json/src/test/java/com/basistech/rosette/apimodel/recordsimilarity/RecordSimilarityResponseTest.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -43,26 +43,14 @@ public class RecordSimilarityResponseTest {
4343

4444
private static final String EXPECTED_JSON = "{\"fields\":{\"addr\":{\"scoreIfNull\":0.8,\"type\":\"rni_address\",\"weight\":0.3},\"dob\":{\"type\":\"rni_date\",\"weight\":0.2},\"primaryName\":{\"type\":\"rni_name\",\"weight\":0.5}},\"info\":[\"Field threshold not found in properties! Defaulting to 0.0\",\"Field weight not found in fields! Defaulting to 1.0 for all entries\"],\"results\":[{\"error\":[],\"explainInfo\":{\"leftOnlyFields\":[\"addr\"],\"scoredFields\":{\"dob\":{\"calculatedWeight\":0.2857142857142857,\"finalScore\":0.74,\"rawScore\":0.8,\"weight\":0.5},\"primaryName\":{\"calculatedWeight\":0.7142857142857143,\"details\":\"any details\",\"finalScore\":0.85,\"rawScore\":0.99,\"weight\":0.5}}},\"left\":{\"addr\":{\"houseNumber\":\"123\",\"road\":\"Roadlane Ave\"},\"dob\":{\"date\":\"1993-04-16\"},\"primaryName\":{\"entityType\":\"PERSON\",\"language\":\"eng\",\"languageOfOrigin\":\"eng\",\"script\":\"Latn\",\"text\":\"Ethan R\"}},\"right\":{\"dob\":\"1993-04-16\",\"primaryName\":{\"text\":\"Seth R\"}},\"score\":0.87},{\"error\":[\"Field foo not found in field mapping\"],\"info\":[\"Some info message\",\"Some other info message\"],\"left\":{\"addr\":{\"houseNumber\":\"123\",\"road\":\"Roadlane Ave\"},\"dob\":{\"date\":\"1993-04-16\"},\"primaryName\":{\"entityType\":\"PERSON\",\"language\":\"eng\",\"languageOfOrigin\":\"eng\",\"script\":\"Latn\",\"text\":\"Ethan R\"}},\"right\":{\"dob\":\"1993-04-16\",\"primaryName\":{\"text\":\"Seth R\"}}}]}";
4545

46+
private static final String EXPECTED_JSON = "{\"info\":[\"Field threshold not found in properties! Defaulting to 0.0\",\"Field weight not found in fields! Defaulting to 1.0 for all entries\"],\"results\":[{\"explainInfo\":{\"leftOnlyFields\":[\"addr\"],\"scoredFields\":{\"dob\":{\"calculatedWeight\":0.2857142857142857,\"finalScore\":0.74,\"rawScore\":0.8,\"weight\":0.5},\"primaryName\":{\"calculatedWeight\":0.7142857142857143,\"details\":\"any details\",\"finalScore\":0.85,\"rawScore\":0.99,\"weight\":0.5}}},\"left\":{\"addr\":{\"houseNumber\":\"123\",\"road\":\"Roadlane Ave\"},\"dob\":{\"date\":\"1993-04-16\"},\"primaryName\":{\"entityType\":\"PERSON\",\"language\":\"eng\",\"languageOfOrigin\":\"eng\",\"script\":\"Latn\",\"text\":\"Ethan R\"}},\"right\":{\"dob\":\"1993-04-16\",\"primaryName\":{\"text\":\"Seth R\"}},\"score\":0.87},{\"error\":\"Field foo not found in field mapping\",\"info\":[\"Some info message\",\"Some other info message\"],\"left\":{\"addr\":{\"houseNumber\":\"123\",\"road\":\"Roadlane Ave\"},\"dob\":{\"date\":\"1993-04-16\"},\"primaryName\":{\"entityType\":\"PERSON\",\"language\":\"eng\",\"languageOfOrigin\":\"eng\",\"script\":\"Latn\",\"text\":\"Ethan R\"}},\"right\":{\"dob\":\"1993-04-16\",\"primaryName\":{\"text\":\"Seth R\"}}}]}";
47+
4648
private static final RecordSimilarityResponse EXPECTED_RESPONSE;
4749

4850
static {
4951
RecordSimilarityResponse temp;
5052
try {
5153
temp = RecordSimilarityResponse.builder()
52-
.fields(Map.of("primaryName", RecordSimilarityFieldInfo.builder()
53-
.type(RecordFieldType.RNI_NAME)
54-
.weight(0.5)
55-
.build(),
56-
"dob", RecordSimilarityFieldInfo.builder()
57-
.type(RecordFieldType.RNI_DATE)
58-
.weight(0.2)
59-
.scoreIfNull(null)
60-
.build(),
61-
"addr", RecordSimilarityFieldInfo.builder()
62-
.type(RecordFieldType.RNI_ADDRESS)
63-
.weight(0.3)
64-
.scoreIfNull(0.8)
65-
.build()))
6654
.results(List.of(RecordSimilarityResult.builder()
6755
.score(0.87)
6856
.left(Map.of("primaryName", NameField.FieldedName.builder()
@@ -102,7 +90,6 @@ public class RecordSimilarityResponseTest {
10290
.build()
10391
))
10492
.build())
105-
.error(new ArrayList<>())
10693
.build(),
10794
RecordSimilarityResult.builder()
10895
.left(Map.of("primaryName", NameField.FieldedName.builder()
@@ -144,8 +131,9 @@ public void testDeserialization() throws JsonProcessingException {
144131
MAPPER.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
145132
MAPPER.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
146133
final RecordSimilarityResponse response = MAPPER.readValue(EXPECTED_JSON, RecordSimilarityResponse.class);
147-
assertEquals(MAPPER.writeValueAsString(EXPECTED_RESPONSE), MAPPER.writeValueAsString(response));
148-
// assertEquals(EXPECTED_RESPONSE, response);
134+
//Can't compare response objects directly since fields within names and other RecordSimilarityField may
135+
// change order, so compare the content of their json strings with fields sorted alphabetically
136+
assertEquals(MAPPER.writeValueAsString(response), MAPPER.writeValueAsString(EXPECTED_RESPONSE));
149137
}
150138

151139
@Test

model/src/main/java/com/basistech/rosette/apimodel/recordsimilarity/RecordSimilarityResponse.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.basistech.rosette.apimodel.recordsimilarity;
1818

1919
import java.util.List;
20-
import java.util.Map;
2120

2221
import com.fasterxml.jackson.annotation.JsonInclude;
2322
import lombok.Builder;
@@ -34,7 +33,6 @@
3433
@Builder
3534
@JsonInclude(JsonInclude.Include.NON_NULL)
3635
public class RecordSimilarityResponse extends Response {
37-
@Valid Map<String, RecordSimilarityFieldInfo> fields;
3836
/**
3937
* @return list of record match results
4038
*/

model/src/main/java/com/basistech/rosette/apimodel/recordsimilarity/records/UnknownField.java

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616

1717
package com.basistech.rosette.apimodel.recordsimilarity.records;
1818

19-
import java.util.LinkedHashMap;
20-
import java.util.Map;
21-
2219
import com.fasterxml.jackson.annotation.JsonCreator;
2320
import com.fasterxml.jackson.annotation.JsonFormat;
2421
import com.fasterxml.jackson.annotation.JsonValue;
2522
import com.fasterxml.jackson.core.JsonProcessingException;
2623
import com.fasterxml.jackson.databind.JsonNode;
24+
import com.fasterxml.jackson.databind.MapperFeature;
2725
import com.fasterxml.jackson.databind.ObjectMapper;
26+
import com.fasterxml.jackson.databind.SerializationFeature;
2827

2928
public class UnknownField implements RecordSimilarityField {
3029
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@@ -35,24 +34,51 @@ public UnknownField(JsonNode data) {
3534
this.data = data;
3635
}
3736

37+
@Override
38+
public String toString() {
39+
return String.valueOf(getData())
40+
.replace("\"", "")
41+
.replace(":", "=")
42+
.replace("{", "(")
43+
.replace("}", ")")
44+
.replace(",", ", ");
45+
}
46+
3847
@JsonValue
3948
public Object getData() {
40-
if (data == null) {
41-
return "";
42-
} else {
43-
if (data.isObject()) {
44-
Map<String, JsonNode> map = new LinkedHashMap<>();
45-
data.fields().forEachRemaining(fieldEntry -> map.put(fieldEntry.getKey(), fieldEntry.getValue()));
46-
try {
47-
ObjectMapper mapper = new ObjectMapper();
48-
String jsonString = mapper.writeValueAsString(map);
49-
return mapper.readTree(jsonString);
50-
} catch (JsonProcessingException e) {
51-
return this.data;
52-
}
49+
return this.data;
50+
}
51+
52+
//compare the content of the String form of the UnknownFields' data
53+
//enforce ordering
54+
@Override
55+
public boolean equals(Object o) {
56+
try {
57+
if (o instanceof UnknownField) {
58+
UnknownField other = (UnknownField) o;
59+
ObjectMapper mapper = new ObjectMapper();
60+
mapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
61+
mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
62+
return mapper.writeValueAsString(this.data).equals(mapper.writeValueAsString(other.data));
63+
} else {
64+
return false;
5365
}
54-
// if given input is not an Object node, it's a String so return it
55-
return this.data;
66+
} catch (JsonProcessingException ex) {
67+
return false;
5668
}
5769
}
70+
71+
//hashcode based on String form
72+
@Override
73+
public int hashCode() {
74+
try {
75+
ObjectMapper mapper = new ObjectMapper();
76+
mapper.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
77+
mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS);
78+
return 19 * mapper.writeValueAsString(this.data).hashCode();
79+
} catch (JsonProcessingException e) {
80+
throw new RuntimeException(e);
81+
}
82+
}
83+
5884
}

0 commit comments

Comments
 (0)