() {};
+ new ParameterizedTypeReference<>() {};
return apiClient.invokeAPI(
localVarPath,
HttpMethod.POST,
localVarQueryParams,
- localVarPostBody,
+ textSearchRequest,
localVarHeaderParams,
localVarFormParams,
localVarAccept,
@@ -969,6 +944,37 @@ public VectorSearchResults search(
localVarReturnType);
}
+ /**
+ * Search chunk by vector
+ *
+ * Search chunks
+ *
+ *
200 - Successful Response
+ *
+ *
400 - The specification of the resource was incorrect
+ *
+ *
404 - The specification of the resource was incorrect
+ *
+ *
422 - There are validation issues with the data.
+ *
+ * @param aiResourceGroup Resource Group ID
+ * @param textSearchRequest The value for the parameter textSearchRequest
+ * @return List
+ * @throws OpenApiRequestException if an error occurs while attempting to invoke the API
+ */
+ @Nonnull
+ public List searchAndGetChunks(
+ @Nonnull final String aiResourceGroup, @Nonnull final TextSearchRequest textSearchRequest)
+ throws OpenApiRequestException {
+ VectorSearchResults searchResult = search(aiResourceGroup, textSearchRequest);
+
+ return searchResult.getResults().stream()
+ .flatMap(results -> results.getResults().stream())
+ .flatMap(documentsChunk -> documentsChunk.getDocuments().stream())
+ .flatMap(documentOutput -> documentOutput.getChunks().stream())
+ .toList();
+ }
+
/**
* Upsert documents in collection
*
@@ -1015,18 +1021,16 @@ public DocumentsListResponse updateDocuments(
}
// create path and map variables
- final Map localVarPathParams = new HashMap();
+ final Map localVarPathParams = new HashMap<>();
localVarPathParams.put("collectionId", collectionId);
final String localVarPath =
UriComponentsBuilder.fromPath("/vector/collections/{collectionId}/documents")
.buildAndExpand(localVarPathParams)
.toUriString();
- final MultiValueMap localVarQueryParams =
- new LinkedMultiValueMap();
+ final MultiValueMap localVarQueryParams = new LinkedMultiValueMap<>();
final HttpHeaders localVarHeaderParams = new HttpHeaders();
- final MultiValueMap localVarFormParams =
- new LinkedMultiValueMap();
+ final MultiValueMap localVarFormParams = new LinkedMultiValueMap<>();
if (aiResourceGroup != null)
localVarHeaderParams.add("AI-Resource-Group", apiClient.parameterToString(aiResourceGroup));
@@ -1039,7 +1043,7 @@ public DocumentsListResponse updateDocuments(
final String[] localVarAuthNames = new String[] {};
final ParameterizedTypeReference localVarReturnType =
- new ParameterizedTypeReference() {};
+ new ParameterizedTypeReference<>() {};
return apiClient.invokeAPI(
localVarPath,
HttpMethod.PATCH,
diff --git a/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/client/VectorApiTest.java b/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/client/VectorApiTest.java
new file mode 100644
index 000000000..99afd09ef
--- /dev/null
+++ b/core-services/document-grounding/src/test/java/com/sap/ai/sdk/grounding/client/VectorApiTest.java
@@ -0,0 +1,108 @@
+package com.sap.ai.sdk.grounding.client;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+import com.sap.ai.sdk.grounding.model.DocumentOutput;
+import com.sap.ai.sdk.grounding.model.DocumentsChunk;
+import com.sap.ai.sdk.grounding.model.ResultsInner1;
+import com.sap.ai.sdk.grounding.model.TextSearchRequest;
+import com.sap.ai.sdk.grounding.model.VectorChunk;
+import com.sap.ai.sdk.grounding.model.VectorSearchResults;
+import com.sap.cloud.sdk.services.openapi.apiclient.ApiClient;
+import com.sap.cloud.sdk.services.openapi.core.OpenApiRequestException;
+import java.util.List;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentMatchers;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpMethod;
+
+class VectorApiTest {
+
+ private ApiClient apiClient;
+ private VectorApi vectorApi;
+
+ @BeforeEach
+ void setUp() {
+ apiClient = mock(ApiClient.class);
+ vectorApi = spy(new VectorApi(apiClient)); // make it a spy to stub instance methods
+ }
+
+ @Test
+ void testSearchReturnsResults() throws OpenApiRequestException {
+ String aiResourceGroup = "test-group";
+ TextSearchRequest request = mock(TextSearchRequest.class);
+ VectorSearchResults expectedResults = mock(VectorSearchResults.class);
+
+ when(apiClient.invokeAPI(
+ anyString(),
+ eq(HttpMethod.POST),
+ any(),
+ any(TextSearchRequest.class),
+ any(),
+ any(),
+ anyList(),
+ any(),
+ any(String[].class),
+ ArgumentMatchers.>any()))
+ .thenReturn(expectedResults);
+
+ VectorSearchResults actualResults = vectorApi.search(aiResourceGroup, request);
+
+ assertSame(expectedResults, actualResults);
+
+ verify(apiClient)
+ .invokeAPI(
+ anyString(),
+ eq(HttpMethod.POST),
+ any(),
+ any(TextSearchRequest.class),
+ any(),
+ any(),
+ anyList(),
+ any(),
+ any(String[].class),
+ ArgumentMatchers.>any());
+ }
+
+ @Test
+ void searchAndGetChunks_returnsFlattenedChunks_whenSearchHasResults()
+ throws OpenApiRequestException {
+ String aiResourceGroup = "test-group";
+ TextSearchRequest request = mock(TextSearchRequest.class);
+
+ // Leaf chunks
+ VectorChunk chunk1 = mock(VectorChunk.class);
+ VectorChunk chunk2 = mock(VectorChunk.class);
+
+ // DocumentOutput -> List
+ DocumentOutput documentOutput = mock(DocumentOutput.class);
+ when(documentOutput.getChunks()).thenReturn(List.of(chunk1, chunk2));
+
+ // DocumentsChunk -> List
+ DocumentsChunk documentsChunk = mock(DocumentsChunk.class);
+ when(documentsChunk.getDocuments()).thenReturn(List.of(documentOutput));
+
+ // ResultsInner1 -> List
+ ResultsInner1 vectorSearchResult = mock(ResultsInner1.class);
+ when(vectorSearchResult.getResults()).thenReturn(List.of(documentsChunk));
+
+ // VectorSearchResults -> List
+ VectorSearchResults searchResults = mock(VectorSearchResults.class);
+ when(searchResults.getResults()).thenReturn(List.of(vectorSearchResult));
+
+ // Stub VectorApi.search(...) on the spy
+ doReturn(searchResults).when(vectorApi).search(eq(aiResourceGroup), eq(request));
+
+ List chunks = vectorApi.searchAndGetChunks(aiResourceGroup, request);
+
+ assertNotNull(chunks);
+ assertEquals(2, chunks.size());
+ assertTrue(chunks.contains(chunk1));
+ assertTrue(chunks.contains(chunk2));
+
+ verify(vectorApi).search(aiResourceGroup, request);
+ }
+}