Skip to content

Commit 5c7d9b9

Browse files
committed
Merge branch 'refs/heads/master' into RLPNC-7519-fielded-address-to-record-matching
# Conflicts: # json/src/test/java/com/basistech/rosette/apimodel/RecordSimilarityRequestTest.java
2 parents 8216111 + 5019eed commit 5c7d9b9

20 files changed

Lines changed: 422 additions & 83 deletions

File tree

README.md

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
<a href="https://www.babelstreet.com/rosette"><img src="https://s3.amazonaws.com/styleguide.basistech.com/logos/rosette-logo.png" width="181" height="47" /></a>
1+
<a href="https://www.babelstreet.com/rosette"><img src="https://charts.babelstreet.com/icon.png" width="47" height="60"/></a>
2+
# Rosette by Babel Street
23

34
---
45

56
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.basistech.rosette/rosette-api/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.basistech.rosette/rosette-api-java-binding)
67

7-
## Rosette API
8-
The Rosette Text Analytics Platform uses natural language processing, statistical modeling, and machine learning to
9-
analyze unstructured and semi-structured text across 364 language-encoding-script combinations, revealing valuable
10-
information and actionable data. Rosette provides endpoints for extracting entities and relationships, translating and
11-
comparing the similarity of names, categorizing and adding linguistic tags to text and more.
8+
Rosette uses natural language processing, statistical modeling, and machine learning to analyze unstructured and semi-structured text across hundreds of language-script combinations, revealing valuable information and actionable data. Rosette provides endpoints for extracting entities and relationships, translating and comparing the similarity of names, categorizing and adding linguistic tags to text and more. Rosette Server is the on-premises installation of Rosette, with access to Rosette's functions as RESTful web service endpoints. This solves cloud security worries and allows customization (models/indexes) as needed for your business.
9+
1210

1311
## Rosette API Access
1412
- Rosette Cloud [Sign Up](https://developer.rosette.com/signup)
@@ -36,11 +34,10 @@ View small example programs for each Rosette endpoint in the
3634

3735
#### Documentation & Support
3836
- [Binding API](https://rosette-api.github.io/java/)
39-
- [Rosette Platform API](https://developer.rosette.com/features-and-functions)
37+
- [Rosette Platform API](https://docs.babelstreet.com/API/en/index-en.html)
4038
- [Binding Release Notes](https://github.com/rosette-api/java/wiki/Release-Notes)
41-
- [Rosette Platform Release Notes](https://support.rosette.com/hc/en-us/articles/360018354971-Release-Notes)
42-
- [Binding/Rosette Platform Compatibility](https://developer.rosette.com/features-and-functions?java#)
43-
- [Support](https://support.rosette.com)
39+
- [Rosette Platform Release Notes](https://babelstreet.my.site.com/support/s/article/Rosette-Cloud-Release-Notes)
40+
- [Support](https://babelstreet.my.site.com/support/s/)
4441
- [Binding License: Apache 2.0](LICENSE.txt)
4542

4643
## Binding Developer Information

annotations/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<parent>
2020
<groupId>com.basistech.rosette</groupId>
2121
<artifactId>rosette-api-java-binding</artifactId>
22-
<version>1.29.101-SNAPSHOT</version>
22+
<version>1.29.1-SNAPSHOT</version>
2323
</parent>
2424
<artifactId>rosette-api-annotations</artifactId>
2525
<name>rosette-api-annotations</name>

api/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<parent>
2020
<groupId>com.basistech.rosette</groupId>
2121
<artifactId>rosette-api-java-binding</artifactId>
22-
<version>1.29.101-SNAPSHOT</version>
22+
<version>1.29.1-SNAPSHOT</version>
2323
</parent>
2424
<artifactId>rosette-api</artifactId>
2525
<name>rosette-api</name>

common/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<parent>
2020
<groupId>com.basistech.rosette</groupId>
2121
<artifactId>rosette-api-java-binding</artifactId>
22-
<version>1.29.101-SNAPSHOT</version>
22+
<version>1.29.1-SNAPSHOT</version>
2323
</parent>
2424
<artifactId>rosette-api-common</artifactId>
2525
<name>rosette-api-common</name>

examples/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<parent>
2121
<groupId>com.basistech.rosette</groupId>
2222
<artifactId>rosette-api-java-binding</artifactId>
23-
<version>1.29.101-SNAPSHOT</version>
23+
<version>1.29.1-SNAPSHOT</version>
2424
</parent>
2525
<groupId>com.basistech.rosette</groupId>
2626
<artifactId>rosette-api-examples</artifactId>

json/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<parent>
2121
<groupId>com.basistech.rosette</groupId>
2222
<artifactId>rosette-api-java-binding</artifactId>
23-
<version>1.29.101-SNAPSHOT</version>
23+
<version>1.29.1-SNAPSHOT</version>
2424
</parent>
2525
<artifactId>rosette-api-json</artifactId>
2626
<name>rosette-api-json</name>

json/src/main/java/com/basistech/rosette/apimodel/jackson/ApiModelMixinModule.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
import com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers.AddressFieldDeserializer;
2828
import com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers.DateFieldDeserializer;
2929
import com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers.NameFieldDeserializer;
30-
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResult;
31-
import com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers.RecordSimilarityResultDeserializer;
30+
import com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers.RecordSimilarityResponseDeserializer;
31+
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResponse;
3232
import com.basistech.rosette.apimodel.recordsimilarity.records.AddressField;
3333
import com.basistech.rosette.apimodel.recordsimilarity.records.DateField;
3434
import com.basistech.rosette.apimodel.recordsimilarity.records.NameField;
@@ -98,7 +98,7 @@ public void setupModule(Module.SetupContext context) {
9898
deserializers.addDeserializer(DateField.class, new DateFieldDeserializer());
9999
deserializers.addDeserializer(AddressField.class, new AddressFieldDeserializer());
100100
deserializers.addDeserializer(RecordSimilarityRequest.class, new RecordSimilarityRequestDeserializer());
101-
deserializers.addDeserializer(RecordSimilarityResult.class, new RecordSimilarityResultDeserializer());
101+
deserializers.addDeserializer(RecordSimilarityResponse.class, new RecordSimilarityResponseDeserializer());
102102
context.addDeserializers(deserializers);
103103
}
104104

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

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,19 @@
1919
import java.io.IOException;
2020
import java.util.HashMap;
2121
import java.util.Iterator;
22+
import java.util.List;
2223
import java.util.Map;
24+
import java.util.Optional;
25+
import java.util.stream.Collectors;
26+
import java.util.stream.StreamSupport;
2327

28+
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityExplainInfo;
29+
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResult;
2430
import com.fasterxml.jackson.core.JsonParser;
2531
import com.fasterxml.jackson.databind.JsonNode;
32+
2633
import javax.validation.Valid;
34+
import javax.validation.constraints.NotNull;
2735

2836
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityFieldInfo;
2937
import com.basistech.rosette.apimodel.recordsimilarity.records.AddressField;
@@ -33,9 +41,47 @@
3341

3442
final class RecordSimilarityDeserializerUtilities {
3543

36-
private RecordSimilarityDeserializerUtilities() { }
44+
private RecordSimilarityDeserializerUtilities() {
45+
}
46+
47+
public static RecordSimilarityResult parseResult(
48+
JsonNode node,
49+
JsonParser jsonParser,
50+
@Valid Map<String, RecordSimilarityFieldInfo> fields
51+
) throws IOException {
52+
final Double score = node.get("score") != null
53+
? node.get("score").traverse(jsonParser.getCodec()).readValueAs(Double.class)
54+
: null;
55+
final RecordSimilarityExplainInfo explainInfo = node.get("explainInfo") != null
56+
? node.get("explainInfo").traverse(jsonParser.getCodec()).readValueAs(RecordSimilarityExplainInfo.class)
57+
: null;
58+
final Map<String, RecordSimilarityField> left = node.get("left") != null && fields != null
59+
? parseRecord(node.get("left"), jsonParser, fields)
60+
: null;
61+
final Map<String, RecordSimilarityField> right = node.get("right") != null && fields != null
62+
? parseRecord(node.get("right"), jsonParser, fields)
63+
: null;
64+
final String error = Optional.ofNullable(node.get("error")).map(JsonNode::asText).orElse(null);
65+
List<String> info = Optional.ofNullable(node.get("info"))
66+
.map(jsonNode -> StreamSupport.stream(jsonNode.spliterator(), false)
67+
.map(JsonNode::asText)
68+
.collect(Collectors.toList()))
69+
.orElse(null);
70+
return RecordSimilarityResult.builder()
71+
.score(score)
72+
.left(left)
73+
.right(right)
74+
.explainInfo(explainInfo)
75+
.error(error)
76+
.info(info)
77+
.build();
78+
}
3779

38-
static Map<String, RecordSimilarityField> parseRecord(JsonNode jsonNode, @Valid Map<String, RecordSimilarityFieldInfo> fields, JsonParser jsonParser) throws IOException {
80+
static Map<String, RecordSimilarityField> parseRecord(
81+
JsonNode jsonNode,
82+
JsonParser jsonParser,
83+
@NotNull @Valid Map<String, RecordSimilarityFieldInfo> fields
84+
) throws IOException {
3985
final Iterator<Map.Entry<String, JsonNode>> recordsIterator = jsonNode.fields();
4086
final Map<String, RecordSimilarityField> recordMap = new HashMap<>();
4187
while (recordsIterator.hasNext()) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private static List<Map<String, RecordSimilarityField>> parseRecords(final JsonN
6767
final JsonParser jsonParser) throws IOException {
6868
final List<Map<String, RecordSimilarityField>> records = new ArrayList<>();
6969
for (JsonNode recordNode : arrayNode) {
70-
records.add(RecordSimilarityDeserializerUtilities.parseRecord(recordNode, fields, jsonParser));
70+
records.add(RecordSimilarityDeserializerUtilities.parseRecord(recordNode, jsonParser, fields));
7171
}
7272
return records;
7373
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright 2024 Basis Technology Corp.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.basistech.rosette.apimodel.jackson.recordsimilaritydeserializers;
18+
19+
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityFieldInfo;
20+
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResponse;
21+
import com.basistech.rosette.apimodel.recordsimilarity.RecordSimilarityResult;
22+
import com.fasterxml.jackson.core.JsonParser;
23+
import com.fasterxml.jackson.core.type.TypeReference;
24+
import com.fasterxml.jackson.databind.DeserializationContext;
25+
import com.fasterxml.jackson.databind.JsonNode;
26+
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
27+
28+
import java.io.IOException;
29+
import java.util.ArrayList;
30+
import java.util.List;
31+
import java.util.Map;
32+
import java.util.Optional;
33+
import java.util.stream.Collectors;
34+
import java.util.stream.StreamSupport;
35+
36+
public class RecordSimilarityResponseDeserializer extends StdDeserializer<RecordSimilarityResponse> {
37+
38+
private static final TypeReference<Map<String, RecordSimilarityFieldInfo>> FIELDS_TYPE_REFERENCE = new TypeReference<>() {
39+
};
40+
41+
public RecordSimilarityResponseDeserializer() {
42+
super(RecordSimilarityResponse.class);
43+
}
44+
45+
@Override
46+
public RecordSimilarityResponse deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
47+
final JsonNode node = jsonParser.getCodec().readTree(jsonParser);
48+
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;
52+
List<String> info = Optional.ofNullable(node.get("info"))
53+
.map(jsonNode -> StreamSupport.stream(jsonNode.spliterator(), false)
54+
.map(JsonNode::asText)
55+
.collect(Collectors.toList()))
56+
.orElse(null);
57+
String errorMessage = Optional.ofNullable(node.get("errorMessage")).map(JsonNode::asText).orElse(null);
58+
59+
JsonNode resultsNode = node.get("results");
60+
List<RecordSimilarityResult> results = new ArrayList<>();
61+
if (resultsNode != null) {
62+
for (JsonNode resultNode : resultsNode) {
63+
results.add(RecordSimilarityDeserializerUtilities.parseResult(resultNode, jsonParser, fields));
64+
}
65+
}
66+
67+
return RecordSimilarityResponse.builder()
68+
.fields(fields)
69+
.results(results)
70+
.info(info)
71+
.errorMessage(errorMessage)
72+
.build();
73+
}
74+
}

0 commit comments

Comments
 (0)