Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,16 @@ dependencies {
runtime 'io.netty:netty-tcnative-boringssl-static:2.0.59.Final'
implementation 'org.slf4j:slf4j-api:2.0.5'
implementation 'com.google.api.grpc:proto-google-common-protos:2.14.3'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
testImplementation("com.squareup.okhttp3:mockwebserver:4.10.0")
implementation 'org.asynchttpclient:async-http-client:2.12.1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.2'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.14.2'
compileOnly "org.apache.tomcat:annotations-api:6.0.53" // necessary for Java 9+

testImplementation "io.grpc:grpc-testing:${grpcVersion}"
testImplementation 'junit:junit:4.13.2'
testImplementation "org.hamcrest:hamcrest:2.2"
testImplementation 'org.mockito:mockito-core:4.8.0'
testImplementation 'org.mockito:mockito-inline:4.8.0'
testImplementation 'org.slf4j:slf4j-simple:2.0.5'
testImplementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.0'
Expand Down
3 changes: 0 additions & 3 deletions src/main/java/io/pinecone/PineconeClientConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,6 @@ public class PineconeClientConfig {
*/
private String apiKey;

/**
* Required project name
*/
private String projectName;

private String environment;
Expand Down
91 changes: 58 additions & 33 deletions src/main/java/io/pinecone/PineconeIndexOperationClient.java
Original file line number Diff line number Diff line change
@@ -1,52 +1,77 @@
package io.pinecone;

import io.pinecone.model.CreateIndexRequest;
import org.asynchttpclient.AsyncHttpClient;
import org.asynchttpclient.DefaultAsyncHttpClient;

import okhttp3.*;
import java.io.IOException;
import static io.pinecone.utils.Constants.*;

public class PineconeIndexOperationClient {
private AsyncHttpClient client;
private PineconeClientConfig clientConfig;
private String url;
private final OkHttpClient client;
private final PineconeClientConfig clientConfig;
private final String url;

PineconeIndexOperationClient(PineconeClientConfig clientConfig, AsyncHttpClient client) {
this.clientConfig = clientConfig;
private PineconeIndexOperationClient(PineconeClientConfig clientConfig, OkHttpClient client, String url) {
this.client = client;
this.url = "https://controller." + clientConfig.getEnvironment() + ".pinecone.io/databases/";
this.clientConfig = clientConfig;
this.url = url;
}

public PineconeIndexOperationClient(PineconeClientConfig clientConfig, OkHttpClient client) {
this(clientConfig, client, createUrl(clientConfig));
}

public PineconeIndexOperationClient(PineconeClientConfig clientConfig) {
this.clientConfig = clientConfig;
client = new DefaultAsyncHttpClient();
this.url = "https://controller." + clientConfig.getEnvironment() + ".pinecone.io/databases/";
this(clientConfig, new OkHttpClient());
}

private static String createUrl(PineconeClientConfig clientConfig) {
if (clientConfig.getApiKey() == null || clientConfig.getEnvironment() == null) {
throw new PineconeValidationException("Both API key and environment name are required for index operations.");
}

return BASE_URL_PREFIX + clientConfig.getEnvironment() + BASE_URL_SUFFIX;
}

public void deleteIndex(String indexName) throws IOException {
System.out.println("Sending delete index request:");
client.prepare("DELETE", url + indexName)
.setHeader("accept", "text/plain")
.setHeader("Api-Key", clientConfig.getApiKey())
.execute()
.toCompletableFuture()
.join();

client.close();
Request request = new Request.Builder()
.url(url + indexName)
.delete()
.addHeader(ACCEPT_HEADER, TEXT_PLAIN)
.addHeader(API_KEY, clientConfig.getApiKey())
.build();

try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException(response.message());
}
} finally {
close(client);
}
}

public void createIndex(CreateIndexRequest createIndexRequest) throws IOException {
client.prepare("POST", url)
.setHeader("accept", "text/plain")
.setHeader("content-type", "application/json")
.setHeader("Api-Key", clientConfig.getApiKey())
.setBody(createIndexRequest.toJson())
.execute()
.toCompletableFuture()
.join();

client.close();
}
}
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(createIndexRequest.toJson(), mediaType);

Request request = new Request.Builder()
.url(url)
.post(requestBody)
.addHeader(ACCEPT_HEADER, TEXT_PLAIN)
.addHeader(CONTENT_TYPE, CONTENT_TYPE_JSON)
.addHeader(API_KEY, clientConfig.getApiKey())
.build();

try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException(response.message());
}
} finally {
close(client);
}
}

public void close(OkHttpClient client) {
client.dispatcher().executorService().shutdown();
client.connectionPool().evictAll();
}
}
2 changes: 1 addition & 1 deletion src/main/java/io/pinecone/model/CreateIndexRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public static void validateJsonObject(JsonNode jsonNode) {
if(jsonNode.get("name").isNull()) {
throw new PineconeValidationException("Index name cannot be empty");
}
System.out.println("jsonString: " + jsonNode.get("dimension"));

if(jsonNode.get("dimension").isNull()) {
throw new PineconeValidationException("Dimension cannot be empty");
}
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/io/pinecone/utils/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package io.pinecone.utils;

public class Constants {
public static final String ACCEPT_HEADER = "accept";
public static final String API_KEY = "Api-Key";
public static final String BASE_URL_PREFIX = "https://controller.";
public static final String BASE_URL_SUFFIX = ".pinecone.io/databases/";
public static final String CONTENT_TYPE = "content-type";
public static final String CONTENT_TYPE_JSON = "application/json";
public static final String TEXT_PLAIN = "text/plain";
}
Loading