diff --git a/extended/src/main/java/apoc/get/GetProcedures.java b/extended/src/main/java/apoc/get/GetProcedures.java index db3da2daa2..6d828767b6 100644 --- a/extended/src/main/java/apoc/get/GetProcedures.java +++ b/extended/src/main/java/apoc/get/GetProcedures.java @@ -4,7 +4,6 @@ import apoc.result.NodeResult; import apoc.result.RelationshipResult; import org.neo4j.graphdb.Transaction; -import org.neo4j.kernel.impl.coreapi.InternalTransaction; import org.neo4j.procedure.Context; import org.neo4j.procedure.Description; import org.neo4j.procedure.Name; @@ -21,13 +20,13 @@ public class GetProcedures { @Procedure @Description("apoc.get.nodes(node|id|[ids]) - quickly returns all nodes with these id's") public Stream nodes(@Name("nodes") Object ids) { - return new Get((InternalTransaction) tx).nodes(ids); + return new Get(tx).nodes(ids); } @Procedure @Description("apoc.get.rels(rel|id|[ids]) - quickly returns all relationships with these id's") public Stream rels(@Name("relationships") Object ids) { - return new Get((InternalTransaction) tx).rels(ids); + return new Get(tx).rels(ids); } } diff --git a/extended/src/main/java/apoc/ml/OpenAI.java b/extended/src/main/java/apoc/ml/OpenAI.java index 0c0d862e4a..894701b14a 100644 --- a/extended/src/main/java/apoc/ml/OpenAI.java +++ b/extended/src/main/java/apoc/ml/OpenAI.java @@ -43,7 +43,6 @@ public EmbeddingResult(long index, String text, List embedding) { } static Stream executeRequest(String apiKey, Map configuration, String path, String model, String key, Object inputs, String jsonPath, ApocConfig apocConfig) throws JsonProcessingException, MalformedURLException { - // todo - something like that? apiKey = apocConfig.getString(APOC_OPENAI_KEY, apiKey); if (apiKey == null || apiKey.isBlank()) throw new IllegalArgumentException("API Key must not be empty"); @@ -60,7 +59,7 @@ static Stream executeRequest(String apiKey, Map configur String payload = new ObjectMapper().writeValueAsString(config); var url = new URL(new URL(endpoint), path).toString(); - return JsonUtil.loadJson(url, headers, payload, jsonPath); + return JsonUtil.loadJson(url, headers, payload, jsonPath, true, List.of()); } @Procedure("apoc.ml.openai.embedding") diff --git a/extended/src/main/java/apoc/ml/VertexAI.java b/extended/src/main/java/apoc/ml/VertexAI.java index 4c6a0e8215..784d44ad61 100644 --- a/extended/src/main/java/apoc/ml/VertexAI.java +++ b/extended/src/main/java/apoc/ml/VertexAI.java @@ -58,7 +58,7 @@ private static Stream executeRequest(String accessToken, String project, Map data = Map.of("instances", inputs, "parameters", getParameters(configuration, retainConfigKeys)); String payload = new ObjectMapper().writeValueAsString(data); - return JsonUtil.loadJson(endpoint, headers, payload, jsonPath); + return JsonUtil.loadJson(endpoint, headers, payload, jsonPath, true, List.of()); } @Procedure("apoc.ml.vertexai.embedding") diff --git a/extended/src/main/java/apoc/util/ExtendedUtil.java b/extended/src/main/java/apoc/util/ExtendedUtil.java index 5b57d900d8..9a72826430 100644 --- a/extended/src/main/java/apoc/util/ExtendedUtil.java +++ b/extended/src/main/java/apoc/util/ExtendedUtil.java @@ -2,20 +2,25 @@ import static apoc.export.cypher.formatter.CypherFormatterUtils.formatProperties; import static apoc.export.cypher.formatter.CypherFormatterUtils.formatToString; -import static apoc.util.JsonUtil.streamObjetsFromIStream; +import static apoc.util.JsonUtil.OBJECT_MAPPER; import java.io.IOException; import java.io.InputStream; -import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.time.Duration; import java.time.temporal.TemporalAccessor; import java.util.List; import java.util.Map; -import java.util.function.Function; +import java.util.Spliterators; import java.util.stream.LongStream; import java.util.stream.Stream; +import java.util.stream.StreamSupport; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.MappingIterator; +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.JsonPath; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; @@ -28,9 +33,6 @@ import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; import org.neo4j.graphdb.Entity; public class ExtendedUtil @@ -57,48 +59,39 @@ public static HttpRequestBase fromMethodName(String method, String uri) { * Similar to JsonUtil.loadJson(..) but works e.g. with GET method as well, * for which it would return a FileNotFoundException */ - public static Stream getModelItemResultStream(String method, HttpClient httpClient, String payloadString, Map headers, String endpoint, String path, List of - /*Function, Stream> function*/) { + public static Stream getModelItemResultStream(String method, HttpClient httpClient, String payloadString, Map headers, String endpoint, String path, List pathOptions) { try { + // -- request with headers and payload HttpRequestBase request = fromMethodName(method, endpoint); headers.forEach((k, v) -> request.setHeader(k, v.toString())); if (request instanceof HttpEntityEnclosingRequestBase entityRequest) { - try { - entityRequest.setEntity(new StringEntity(payloadString)); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + entityRequest.setEntity(new StringEntity(payloadString)); } -// try ( -// HttpClient httpClient = HttpClientBuilder.create().build();//) { -// DefaultHttpClient httpClient = new DefaultHttpClient(); + // -- response HttpResponse response = httpClient.execute(request); - InputStream stream = response.getEntity().getContent(); - return streamObjetsFromIStream(stream, path, of); -// Stream objStream = streamObjetsFromIStream(stream, path, of); -// -// return function.apply(objStream); -// .onClose(() -> { -// try { -// httpClient.close(); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// }); -// return objectStream -// .flatMap(i -> ((List>) i).stream()) -// .map(ModelItemResult::new); + return streamObjetsFromIStream(stream, path, pathOptions); } catch (Exception e) { throw new RuntimeException(e); } } + /** + * Along the lines of {@link JsonUtil#loadJson(Object, Map, String, String, boolean, List)} + * after the `FileUtils.inputStreamFor` method + */ + public static Stream streamObjetsFromIStream(InputStream input, String path, List options) throws IOException { + JsonParser parser = OBJECT_MAPPER.getFactory().createParser(input); + MappingIterator it = OBJECT_MAPPER.readValues(parser, Object.class); + Stream stream = StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, 0), false); + return StringUtils.isBlank(path) ? stream : stream.map((value) -> JsonPath.parse(value, Configuration.builder().build()).read(path)); + } + public static String dateFormat( TemporalAccessor value, String format){ return Util.getFormat(format).format(value); diff --git a/extended/src/test/java/apoc/ml/OpenAITest.java b/extended/src/test/java/apoc/ml/OpenAITest.java index 9aecb8d599..87dc84b100 100644 --- a/extended/src/test/java/apoc/ml/OpenAITest.java +++ b/extended/src/test/java/apoc/ml/OpenAITest.java @@ -48,7 +48,7 @@ public void getEmbedding() { @Test public void completion() { - testCall(db, "CALL apoc.ml.openai.completion('What color is the sky? Answer: ', 'fake-api-key1')", (row) -> { + testCall(db, "CALL apoc.ml.openai.completion('What color is the sky? Answer: ', 'fake-api-key')", (row) -> { var result = (Map)row.get("value"); assertEquals(true, result.get("created") instanceof Number); assertEquals(true, result.containsKey("choices")); diff --git a/extended/src/test/java/apoc/ml/VertexAIIT.java b/extended/src/test/java/apoc/ml/VertexAIIT.java index 511670972a..e70f49fd61 100644 --- a/extended/src/test/java/apoc/ml/VertexAIIT.java +++ b/extended/src/test/java/apoc/ml/VertexAIIT.java @@ -36,7 +36,6 @@ public void setUp() throws Exception { parameters = Map.of("apiKey", vertexAiKey, "project", vertexAiProject); } - @Test public void getEmbedding() { testCall(db, "CALL apoc.ml.vertexai.embedding(['Some Text'], $apiKey, $project)", parameters,(row) -> { diff --git a/extended/src/test/java/apoc/ml/bedrock/BedrockTest.java b/extended/src/test/java/apoc/ml/bedrock/BedrockTest.java index 058b00b6d9..daf9dffda8 100644 --- a/extended/src/test/java/apoc/ml/bedrock/BedrockTest.java +++ b/extended/src/test/java/apoc/ml/bedrock/BedrockTest.java @@ -14,10 +14,9 @@ /** - * NB: WORK IN PROGRESS. + * NB: WORK IN PROGRESS. Mock Test, with local endpoint * TODO: - * // test with fake api like OpenAITest?? - * // via fake url + * // like OpenAITest, via fake url * // try with apocConfig() and wrong confMap --> should work * // try with wrong apocConfig() and right confMap --> should NOT work * // try deactivating apocConfig() and put in confMap