Skip to content

v0.8.0 Release

Compare
Choose a tag to compare
@rohanshah18 rohanshah18 released this 22 Feb 21:59
· 61 commits to main since this release
1bde139

Added: Control plane operations for serverless indexes

Java SDK now supports control plane operations for serverless indexes. Users can now create, list, describe, and delete serverless indexes. Note that the PineconeIndexOperationClient has been renamed to PineconeControlPlaneClient.

Example

The following example shows how to use the create, list, describe, and delete serverless indexes.

import io.pinecone.PineconeControlPlaneClient;
import io.pinecone.helpers.RandomStringBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openapitools.client.model.*;

import java.util.Objects;

import static io.pinecone.helpers.IndexManager.isIndexReady;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

public class ServerlessIndexOperations {
    public void createAndDelete() throws InterruptedException {
        String indexName = RandomStringBuilder.build("index-name", 8);
        PineconeControlPlaneClient controlPlaneClient = new PineconeControlPlaneClient("PINECONE_API_KEY");
        ServerlessSpec serverlessSpec = new ServerlessSpec().cloud(ServerlessSpec.CloudEnum.AWS).region("us-west-2");
        CreateIndexRequestSpec createIndexRequestSpec = new CreateIndexRequestSpec().serverless(serverlessSpec);

        // Create the index
        CreateIndexRequest createIndexRequest = new CreateIndexRequest()
                .name(indexName)
                .metric(IndexMetric.COSINE)
                .dimension(10)
                .spec(createIndexRequestSpec);
        controlPlaneClient.createIndex(createIndexRequest);

        // Wait until index is ready
        Thread.sleep(3500);

        // Describe the index
        IndexModel indexModel = controlPlaneClient.describeIndex(indexName);
        assertNotNull(indexModel);
        assertEquals(10, indexModel.getDimension());
        assertEquals(indexName, indexModel.getName());
        assertEquals(IndexMetric.COSINE, indexModel.getMetric());

        // List the index
        IndexList indexList = controlPlaneClient.listIndexes();
        assert !Objects.requireNonNull(indexList.getIndexes()).isEmpty();

        // Delete the index
        controlPlaneClient.deleteIndex(indexName);
    }
}

Updated: Control plane operations for pod indexes

We have updated the api's for create, configure, list, describe, and delete operations for pod indexes.

Example

The following example how to create, list, describe, and delete pod indexes.

import io.pinecone.PineconeControlPlaneClient;
import io.pinecone.helpers.RandomStringBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openapitools.client.model.*;

import java.util.Objects;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

public class PodIndexOperations {
    public void createAndDelete() throws InterruptedException {
        String apiKey = System.getenv("PINECONE_API_KEY");
        String environment = System.getenv("PINECONE_ENVIRONMENT");
        String indexName = RandomStringBuilder.build("index-name", 8);
        PineconeControlPlaneClient controlPlaneClient = new PineconeControlPlaneClient(apiKey);
        CreateIndexRequestSpecPod podSpec = new CreateIndexRequestSpecPod().environment(environment).podType("p1.x1");
        CreateIndexRequestSpec createIndexRequestSpec = new CreateIndexRequestSpec().pod(podSpec);

        // Create the index
        CreateIndexRequest createIndexRequest = new CreateIndexRequest()
                .name(indexName)
                .metric(IndexMetric.COSINE)
                .dimension(10)
                .spec(createIndexRequestSpec);
        controlPlaneClient.createIndex(createIndexRequest);

        // Wait until index is ready
        Thread.sleep(3500);

        // Describe the index
        IndexModel indexModel = controlPlaneClient.describeIndex(indexName);
        assertNotNull(indexModel);
        assertEquals(10, indexModel.getDimension());
        assertEquals(indexName, indexModel.getName());
        assertEquals(IndexMetric.COSINE, indexModel.getMetric());

        // List the index
        IndexList indexList = controlPlaneClient.listIndexes();
        assert !Objects.requireNonNull(indexList.getIndexes()).isEmpty();

        // Delete the index
        controlPlaneClient.deleteIndex(indexName);
    }
}

The following example shows how to scale up and down a pod index using configure index operation.

public class PodIndexOperations {
    public void scaleUpAndDownPodIndex() {
        try {
            String apiKey = System.getenv("PINECONE_API_KEY");
            String environment = System.getenv("PINECONE_ENVIRONMENT");
            String indexName = RandomStringBuilder.build("index-name", 8);
            PineconeControlPlaneClient controlPlaneClient = new PineconeControlPlaneClient(apiKey);

            // Scale up for the test
            ConfigureIndexRequestSpecPod pod = new ConfigureIndexRequestSpecPod().replicas(3);
            ConfigureIndexRequestSpec spec = new ConfigureIndexRequestSpec().pod(pod);
            ConfigureIndexRequest configureIndexRequest = new ConfigureIndexRequest().spec(spec);
            controlPlaneClient.configureIndex(indexName, configureIndexRequest);

            // Verify the scaled up replicas
            PodSpec podSpec = controlPlaneClient.describeIndex(indexName).getSpec().getPod();
            assert (podSpec != null);
            assertEquals(podSpec.getReplicas(), 3);

            // Scaling down
            pod = new ConfigureIndexRequestSpecPod().replicas(1);
            spec = new ConfigureIndexRequestSpec().pod(pod);
            configureIndexRequest = new ConfigureIndexRequest().spec(spec);
            controlPlaneClient.configureIndex(indexName, configureIndexRequest);

            // Verify replicas were scaled down           
            podSpec = controlPlaneClient.describeIndex(indexName).getSpec().getPod();
            assert (podSpec != null);
            assertEquals(podSpec.getReplicas(), 1);
        } catch (Exception exception) {
            throw new PineconeException("Test failed: " + exception.getLocalizedMessage());
        }
    }
}

Added: Support for collections in Java SDK

We have added the support to create, list, describe, and delete the collections in java sdk.

Example

The following example shows how to create, list, describe, and delete collections:

public class Collections {
    public void testIndexToCollectionHappyPath() throws InterruptedException {
        String apiKey = System.getenv("PINECONE_API_KEY");
        String environment = System.getenv("PINECONE_ENVIRONMENT");
        PineconeControlPlaneClient controlPlaneClient = new PineconeControlPlaneClient(apiKey);
        String indexName = RandomStringBuilder.build("collection-test", 8);
        ArrayList<String> indexes = new ArrayList<>();
        ArrayList<String> collections = new ArrayList<>();
        IndexMetric indexMetric = IndexMetric.COSINE;
        List<String> upsertIds = Arrays.asList("v1", "v2", "v3");
        String namespace = RandomStringBuilder.build("ns", 8);
        int dimension = 4;

        String collectionName = RandomStringBuilder.build("collection-test", 8);

        // Create collection from index
        CreateCollectionRequest createCollectionRequest = new CreateCollectionRequest().name(collectionName).source(indexName);
        CollectionModel collection = controlPlaneClient.createCollection(createCollectionRequest);

        assertEquals(collection.getStatus(), CollectionModel.StatusEnum.INITIALIZING);

        // Wait until collection is ready
        Thread.sleep(120000);

        // List collections
        List<CollectionModel> collectionList = controlPlaneClient.listCollections().getCollections();
        // Verify collections is listed
        boolean collectionFound = false;
        if (collectionList != null && !collectionList.isEmpty()) {
            for (CollectionModel col : collectionList) {
                if (col.getName().equals(collectionName)) {
                    collectionFound = true;
                    break;
                }
            }
        }

        if (!collectionFound) {
            fail("Collection " + collectionName + " was not found when listing collections");
        }

        // Describe collections
        collection = controlPlaneClient.describeCollection(collectionName);
        assertEquals(collection.getStatus(), CollectionModel.StatusEnum.READY);
        assertEquals(collection.getDimension(), dimension);
        assertEquals(collection.getVectorCount(), 3);
        assertNotEquals(collection.getVectorCount(), null);
        assertTrue(collection.getSize() > 0);

        // Delete collections
        controlPlaneClient.deleteCollection(collectionName);
        collections.remove(collectionName);
        Thread.sleep(2500);
    }
}

What's Changed

New Contributors

Full Changelog: v0.7.4...v0.8.0