Skip to content

Commit 12626c9

Browse files
authored
Merge pull request #126 from Planview-JamesK/fix/dataset-metadata-empty
fix: DatasetCase.metadata() always empty when fetching dataset rows from Braintrust
2 parents 2eb83ff + 372f9bb commit 12626c9

2 files changed

Lines changed: 56 additions & 3 deletions

File tree

‎braintrust-sdk/src/main/java/dev/braintrust/eval/DatasetBrainstoreImpl.java‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,18 @@ public Optional<DatasetCase<INPUT, OUTPUT>> next() {
118118
OUTPUT expected = (OUTPUT) event.getExpected();
119119

120120
var metadataObj = event.getMetadata();
121-
Map<String, Object> metadata =
122-
metadataObj != null ? metadataObj.getAdditionalProperties() : Map.of();
123-
if (metadata == null) metadata = Map.of();
121+
// InsertProjectLogsEventMetadata extends HashMap<String,Object>. Jackson stores
122+
// unknown fields in the HashMap base (not in additionalProperties) for Map subclasses,
123+
// so copy from both sources defensively.
124+
Map<String, Object> metadata;
125+
if (metadataObj != null) {
126+
metadata = new HashMap<>(metadataObj);
127+
if (metadataObj.getAdditionalProperties() != null) {
128+
metadata.putAll(metadataObj.getAdditionalProperties());
129+
}
130+
} else {
131+
metadata = Map.of();
132+
}
124133

125134
List<String> tags = event.getTags() != null ? event.getTags() : List.of();
126135

‎braintrust-sdk/src/test/java/dev/braintrust/eval/DatasetBrainstoreImplTest.java‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,50 @@ void testFetchWithPinnedVersion() {
221221
.withRequestBody(matchingJsonPath("$.version", equalTo(pinnedVersion))));
222222
}
223223

224+
@Test
225+
void testMetadataPopulatedFromDatasetRow() {
226+
wireMock.stubFor(
227+
post(urlEqualTo("/v1/dataset/" + datasetId + "/fetch"))
228+
.willReturn(
229+
aResponse()
230+
.withStatus(200)
231+
.withHeader("Content-Type", "application/json")
232+
.withBody(
233+
"""
234+
{
235+
"events": [
236+
{
237+
"object_type": "dataset",
238+
"dataset_id": "%s",
239+
"id": "meta-row-1",
240+
"_xact_id": "1",
241+
"created": "2024-01-01T00:00:00Z",
242+
"input": "test input",
243+
"expected": "test output",
244+
"metadata": {
245+
"performance_strategy": "TURBO",
246+
"userId": "user123"
247+
}
248+
}
249+
],
250+
"cursor": null
251+
}
252+
"""
253+
.formatted(datasetId))));
254+
255+
DatasetBrainstoreImpl<String, String> dataset =
256+
new DatasetBrainstoreImpl<>(apiClient, datasetId, "test-version");
257+
258+
List<DatasetCase<String, String>> cases = new ArrayList<>();
259+
dataset.forEach(cases::add);
260+
261+
assertEquals(1, cases.size());
262+
Map<String, Object> metadata = cases.get(0).metadata();
263+
assertFalse(metadata.isEmpty(), "metadata should not be empty");
264+
assertEquals("TURBO", metadata.get("performance_strategy"));
265+
assertEquals("user123", metadata.get("userId"));
266+
}
267+
224268
@Test
225269
void testFetchFromBraintrustNotFound() {
226270
String projectName = "test-project";

0 commit comments

Comments
 (0)