Skip to content

Commit e3ea6a2

Browse files
authored
Merge branch 'main' into pom_and_demos1
2 parents d8b6895 + 9a7c650 commit e3ea6a2

5 files changed

Lines changed: 217 additions & 1 deletion

File tree

  • data/semantickernel-data-jdbc/src/main/java/com/microsoft/semantickernel/data/jdbc/oracle
  • samples
    • semantickernel-concepts/semantickernel-syntax-examples
    • semantickernel-learn-resources/src/main/java/com/microsoft/semantickernel/samples/documentationexamples/data/vectorstores/oracle
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package com.microsoft.semantickernel.data.jdbc.oracle;
2+
3+
import com.fasterxml.jackson.databind.JsonNode;
4+
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreQueryProvider;
6+
import com.microsoft.semantickernel.data.jdbc.postgres.PostgreSQLVectorStoreQueryProvider;
7+
import com.microsoft.semantickernel.data.vectorstorage.definition.VectorStoreRecordDefinition;
8+
import com.microsoft.semantickernel.data.vectorstorage.options.UpsertRecordOptions;
9+
import com.microsoft.semantickernel.exceptions.SKException;
10+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
11+
12+
import javax.annotation.Nonnull;
13+
import javax.sql.DataSource;
14+
import java.sql.Connection;
15+
import java.sql.PreparedStatement;
16+
import java.sql.SQLException;
17+
import java.util.List;
18+
19+
public class OracleVectorStoreQueryProvider extends JDBCVectorStoreQueryProvider {
20+
21+
// This could be removed if super.collectionTable made protected
22+
private final String collectionsTable;
23+
24+
// This could be common to all query providers
25+
private final ObjectMapper objectMapper;
26+
27+
private OracleVectorStoreQueryProvider(@Nonnull DataSource dataSource, @Nonnull String collectionsTable, @Nonnull String prefixForCollectionTables,
28+
ObjectMapper objectMapper) {
29+
super(dataSource, collectionsTable, prefixForCollectionTables);
30+
this.collectionsTable = collectionsTable;
31+
this.objectMapper = objectMapper;
32+
}
33+
34+
@Override
35+
public void prepareVectorStore() {
36+
String createCollectionsTable = formatQuery(
37+
"CREATE TABLE IF NOT EXISTS %s (collectionId VARCHAR(255) PRIMARY KEY)",
38+
validateSQLidentifier(collectionsTable));
39+
40+
try (Connection connection = dataSource.getConnection();
41+
PreparedStatement createTable = connection.prepareStatement(createCollectionsTable)) {
42+
createTable.execute();
43+
} catch (SQLException e) {
44+
throw new SKException("Failed to prepare vector store", e);
45+
}
46+
}
47+
48+
@Override
49+
public void createCollection(String collectionName,
50+
VectorStoreRecordDefinition recordDefinition) {
51+
// TODO Override implementation. Eg: mapping TEXT to VARCHAR
52+
super.createCollection(collectionName, recordDefinition);
53+
}
54+
55+
@Override
56+
public void upsertRecords(String collectionName, List<?> records, VectorStoreRecordDefinition recordDefinition, UpsertRecordOptions options) {
57+
58+
// TODO look for public void createCollection(String collectionName, VectorStoreRecordDefinition recordDefinition) {
59+
60+
// TODO Make this a MERGE query
61+
62+
// String upsertStatemente = formatQuery("""
63+
// MERGE INTO %s EXIST_REC USING (SELECT ? AS ID) NEW_REC ON (EXIST_REC.%s = NEW_REC.ID)
64+
// WHEN MATACHED THEN UPDATE SET EXISTING REC
65+
// """,
66+
// getCollectionTableName(collectionName),
67+
// recordDefinition.getKeyField().getName(),
68+
// getQueryColumnsFromFields(fields),
69+
// getWildcardString(fields.size()),
70+
// onDuplicateKeyUpdate);super.upsertRecords(collectionName, records, recordDefinition, options);
71+
72+
String query = formatQuery("INSERT INTO %s (%s, %s, %s) values (?, ?, ?)",
73+
getCollectionTableName(collectionName),
74+
recordDefinition.getAllFields().get(0).getStorageName(),
75+
recordDefinition.getAllFields().get(1).getStorageName(),
76+
recordDefinition.getAllFields().get(2).getStorageName());
77+
78+
try (Connection connection = dataSource.getConnection();
79+
PreparedStatement statement = connection.prepareStatement(query)) {
80+
for (Object record : records) {
81+
JsonNode jsonNode = objectMapper.valueToTree(record);
82+
for (int i = 0; i < 3; i++) {
83+
statement.setObject(i + 1, jsonNode
84+
.get(recordDefinition.getAllFields().get(i).getStorageName()).asText());
85+
}
86+
statement.addBatch();
87+
}
88+
statement.executeBatch();
89+
} catch (SQLException e) {
90+
throw new SKException("Failed to upsert records", e);
91+
}
92+
}
93+
94+
public static Builder builder() {
95+
return new Builder();
96+
}
97+
98+
public static class Builder
99+
extends JDBCVectorStoreQueryProvider.Builder {
100+
101+
private DataSource dataSource;
102+
private String collectionsTable = DEFAULT_COLLECTIONS_TABLE;
103+
private String prefixForCollectionTables = DEFAULT_PREFIX_FOR_COLLECTION_TABLES;
104+
private ObjectMapper objectMapper = new ObjectMapper();
105+
106+
@SuppressFBWarnings("EI_EXPOSE_REP2")
107+
public Builder withDataSource(DataSource dataSource) {
108+
this.dataSource = dataSource;
109+
return this;
110+
}
111+
112+
/**
113+
* Sets the collections table name.
114+
* @param collectionsTable the collections table name
115+
* @return the builder
116+
*/
117+
public Builder withCollectionsTable(String collectionsTable) {
118+
this.collectionsTable = validateSQLidentifier(collectionsTable);
119+
return this;
120+
}
121+
122+
/**
123+
* Sets the prefix for collection tables.
124+
* @param prefixForCollectionTables the prefix for collection tables
125+
* @return the builder
126+
*/
127+
public Builder withPrefixForCollectionTables(String prefixForCollectionTables) {
128+
this.prefixForCollectionTables = validateSQLidentifier(prefixForCollectionTables);
129+
return this;
130+
}
131+
132+
public Builder withObjectMapper(
133+
ObjectMapper objectMapper) {
134+
this.objectMapper = objectMapper;
135+
return this;
136+
}
137+
138+
@Override
139+
public OracleVectorStoreQueryProvider build() {
140+
return new OracleVectorStoreQueryProvider(dataSource, collectionsTable,
141+
prefixForCollectionTables, objectMapper);
142+
}
143+
}
144+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
<module>semantickernel-bom</module>
7272
<module>semantickernel-api</module>
7373
<module>semantickernel-experimental</module>
74+
<module>samples</module>
7475
<module>aiservices/openai</module>
7576
<module>aiservices/google</module>
7677
<module>aiservices/huggingface</module>

samples/semantickernel-concepts/semantickernel-syntax-examples/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,17 @@
136136
<groupId>com.github.victools</groupId>
137137
<artifactId>jsonschema-module-jackson</artifactId>
138138
</dependency>
139+
<dependency>
140+
<groupId>com.microsoft.semantic-kernel</groupId>
141+
<artifactId>semantickernel-data-jdbc</artifactId>
142+
<version>1.4.4-SNAPSHOT</version>
143+
</dependency>
144+
<dependency>
145+
<groupId>com.microsoft.semantic-kernel</groupId>
146+
<artifactId>semantickernel-learn-resources</artifactId>
147+
<version>1.4.4-SNAPSHOT</version>
148+
<scope>compile</scope>
149+
</dependency>
139150
</dependencies>
140151

141152
<profiles>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright (c) Microsoft. All rights reserved.
2+
package com.microsoft.semantickernel.samples.syntaxexamples.memory;
3+
4+
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStore;
5+
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreOptions;
6+
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollection;
7+
import com.microsoft.semantickernel.data.jdbc.JDBCVectorStoreRecordCollectionOptions;
8+
import com.microsoft.semantickernel.data.jdbc.oracle.OracleVectorStoreQueryProvider;
9+
import com.microsoft.semantickernel.data.vectorstorage.VectorStoreRecordCollection;
10+
import com.microsoft.semantickernel.samples.documentationexamples.data.index.Hotel;
11+
import java.sql.SQLException;
12+
import java.util.Collections;
13+
import oracle.jdbc.datasource.impl.OracleDataSource;
14+
15+
public class VectorStoreWithOracle {
16+
17+
public static void main(String[] args) throws SQLException {
18+
System.out.println("==============================================================");
19+
System.out.println("============== Oracle Vector Store Example ===================");
20+
System.out.println("==============================================================");
21+
22+
// Configure the data source
23+
OracleDataSource dataSource = new OracleDataSource();
24+
dataSource.setURL("jdbc:oracle:thin:@localhost:1521/FREEPDB1");
25+
dataSource.setUser("scott");
26+
dataSource.setPassword("tiger");
27+
28+
// Build a query provider
29+
OracleVectorStoreQueryProvider queryProvider = OracleVectorStoreQueryProvider.builder()
30+
.withDataSource(dataSource)
31+
.build();
32+
33+
// Build a vector store
34+
JDBCVectorStore vectorStore = JDBCVectorStore.builder()
35+
.withDataSource(dataSource)
36+
.withOptions(JDBCVectorStoreOptions.builder()
37+
.withQueryProvider(queryProvider)
38+
.build())
39+
.build();
40+
41+
// Get a collection from the vector store
42+
VectorStoreRecordCollection<String, Hotel> collection =
43+
vectorStore.getCollection("skhotels",
44+
JDBCVectorStoreRecordCollectionOptions.<Hotel>builder()
45+
.withRecordClass(Hotel.class)
46+
.build());
47+
48+
// Create the collection if it doesn't exist yet.
49+
collection.createCollectionAsync().block();
50+
51+
collection.upsertAsync(new Hotel("1",
52+
"HotelOne",
53+
"Desc for HotelOne",
54+
Collections.emptyList(), Collections.emptyList()),
55+
null)
56+
.block();
57+
58+
}
59+
60+
}

samples/semantickernel-learn-resources/src/main/java/com/microsoft/semantickernel/samples/documentationexamples/data/vectorstores/oracle/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@ public static void main(String[] args) {
4040

4141
collection.upsertBatchAsync(getHotels(), null).block();
4242
}
43-
}
43+
}

0 commit comments

Comments
 (0)