Skip to content

Commit 314cdb9

Browse files
committed
HHH-19679 Support binary, float16 and sparse vector types
1 parent 97ce030 commit 314cdb9

File tree

67 files changed

+4213
-413
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+4213
-413
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/OracleTypes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ public class OracleTypes {
1515
public static final int VECTOR_INT8 = -106;
1616
public static final int VECTOR_FLOAT32 = -107;
1717
public static final int VECTOR_FLOAT64 = -108;
18+
public static final int VECTOR_BINARY = -109;
1819
}

hibernate-core/src/main/java/org/hibernate/dialect/function/SumReturnTypeResolver.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,14 @@ public ReturnableType<?> resolveFunctionReturnType(
9090
case NUMERIC:
9191
return BigInteger.class.isAssignableFrom( basicType.getJavaType() ) ? bigIntegerType : bigDecimalType;
9292
case VECTOR:
93+
case VECTOR_BINARY:
94+
case VECTOR_INT8:
95+
case VECTOR_FLOAT16:
9396
case VECTOR_FLOAT32:
9497
case VECTOR_FLOAT64:
95-
case VECTOR_INT8:
98+
case SPARSE_VECTOR_INT8:
99+
case SPARSE_VECTOR_FLOAT32:
100+
case SPARSE_VECTOR_FLOAT64:
96101
return basicType;
97102
}
98103
return bigDecimalType;
@@ -126,9 +131,14 @@ public BasicValuedMapping resolveFunctionReturnType(
126131
final Class<?> argTypeClass = jdbcMapping.getJavaTypeDescriptor().getJavaTypeClass();
127132
return BigInteger.class.isAssignableFrom( argTypeClass ) ? bigIntegerType : bigDecimalType;
128133
case VECTOR:
134+
case VECTOR_BINARY:
135+
case VECTOR_INT8:
136+
case VECTOR_FLOAT16:
129137
case VECTOR_FLOAT32:
130138
case VECTOR_FLOAT64:
131-
case VECTOR_INT8:
139+
case SPARSE_VECTOR_INT8:
140+
case SPARSE_VECTOR_FLOAT32:
141+
case SPARSE_VECTOR_FLOAT64:
132142
return (BasicValuedMapping) jdbcMapping;
133143
}
134144
return bigDecimalType;

hibernate-core/src/main/java/org/hibernate/dialect/type/OracleArrayJdbcType.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.sql.SQLException;
1111
import java.sql.Types;
1212
import java.util.Locale;
13+
import java.util.Objects;
1314

1415
import org.hibernate.HibernateException;
1516
import org.hibernate.boot.model.relational.Database;
@@ -288,4 +289,16 @@ public String getFriendlyName() {
288289
public String toString() {
289290
return "OracleArrayTypeDescriptor(" + typeName + ")";
290291
}
292+
293+
@Override
294+
public boolean equals(Object that) {
295+
return super.equals( that )
296+
&& that instanceof OracleArrayJdbcType jdbcType
297+
&& Objects.equals( typeName, jdbcType.typeName );
298+
}
299+
300+
@Override
301+
public int hashCode() {
302+
return Objects.hashCode( typeName ) + 31 * super.hashCode();
303+
}
291304
}

hibernate-core/src/main/java/org/hibernate/type/BasicCollectionType.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ public BasicCollectionType(
3535
this.name = determineName( collectionTypeDescriptor, baseDescriptor );
3636
}
3737

38+
public BasicCollectionType(
39+
BasicType<E> baseDescriptor,
40+
JdbcType arrayJdbcType,
41+
JavaType<C> collectionTypeDescriptor,
42+
String typeName) {
43+
super( arrayJdbcType, collectionTypeDescriptor );
44+
this.baseDescriptor = baseDescriptor;
45+
this.name = typeName;
46+
}
47+
3848
private static String determineName(BasicCollectionJavaType<?, ?> collectionTypeDescriptor, BasicType<?> baseDescriptor) {
3949
final String elementTypeName = determineElementTypeName( baseDescriptor );
4050
switch ( collectionTypeDescriptor.getSemantics().getCollectionClassification() ) {

hibernate-core/src/main/java/org/hibernate/type/BasicTypeRegistry.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
import org.hibernate.internal.CoreMessageLogger;
1717
import org.hibernate.internal.util.StringHelper;
1818
import org.hibernate.internal.util.collections.CollectionHelper;
19+
import org.hibernate.tool.schema.extract.spi.ColumnTypeInformation;
1920
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
2021
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
2122
import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
2223
import org.hibernate.type.descriptor.java.JavaType;
2324
import org.hibernate.type.descriptor.jdbc.ArrayJdbcType;
25+
import org.hibernate.type.descriptor.jdbc.DelegatingJdbcTypeIndicators;
2426
import org.hibernate.type.descriptor.jdbc.JdbcType;
2527
import org.hibernate.type.internal.BasicTypeImpl;
2628
import org.hibernate.type.internal.ConvertedBasicTypeImpl;
@@ -166,8 +168,48 @@ private <E> BasicType<?> resolvedType(ArrayJdbcType arrayType, BasicPluralJavaTy
166168
typeConfiguration,
167169
typeConfiguration.getCurrentBaseSqlTypeIndicators().getDialect(),
168170
elementType,
169-
null,
170-
typeConfiguration.getCurrentBaseSqlTypeIndicators()
171+
new ColumnTypeInformation() {
172+
@Override
173+
public Boolean getNullable() {
174+
return null;
175+
}
176+
177+
@Override
178+
public int getTypeCode() {
179+
return arrayType.getDefaultSqlTypeCode();
180+
}
181+
182+
@Override
183+
public String getTypeName() {
184+
return null;
185+
}
186+
187+
@Override
188+
public int getColumnSize() {
189+
return 0;
190+
}
191+
192+
@Override
193+
public int getDecimalDigits() {
194+
return 0;
195+
}
196+
},
197+
new DelegatingJdbcTypeIndicators( typeConfiguration.getCurrentBaseSqlTypeIndicators() ) {
198+
@Override
199+
public Integer getExplicitJdbcTypeCode() {
200+
return arrayType.getDefaultSqlTypeCode();
201+
}
202+
203+
@Override
204+
public int getPreferredSqlTypeCodeForArray() {
205+
return arrayType.getDefaultSqlTypeCode();
206+
}
207+
208+
@Override
209+
public int getPreferredSqlTypeCodeForArray(int elementSqlTypeCode) {
210+
return arrayType.getDefaultSqlTypeCode();
211+
}
212+
}
171213
);
172214
if ( resolvedType instanceof BasicPluralType<?,?> ) {
173215
register( resolvedType );

hibernate-core/src/main/java/org/hibernate/type/SqlTypes.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -681,10 +681,10 @@ public class SqlTypes {
681681

682682

683683
/**
684-
* A type code representing an {@code embedding vector} type for databases
684+
* A type code representing a {@code vector} type for databases
685685
* like {@link org.hibernate.dialect.PostgreSQLDialect PostgreSQL},
686686
* {@link org.hibernate.dialect.OracleDialect Oracle 23ai} and {@link org.hibernate.dialect.MariaDBDialect MariaDB}.
687-
* An embedding vector essentially is a {@code float[]} with a fixed size.
687+
* A vector essentially is a {@code float[]} with a fixed length.
688688
*
689689
* @since 6.4
690690
*/
@@ -701,10 +701,39 @@ public class SqlTypes {
701701
public static final int VECTOR_FLOAT32 = 10_002;
702702

703703
/**
704-
* A type code representing a double-precision floating-point type for Oracle 23ai database.
704+
* A type code representing a double-precision floating-point vector type for Oracle 23ai database.
705705
*/
706706
public static final int VECTOR_FLOAT64 = 10_003;
707707

708+
/**
709+
* A type code representing a bit precision vector type for databases
710+
* like {@link org.hibernate.dialect.PostgreSQLDialect PostgreSQL} and
711+
* {@link org.hibernate.dialect.OracleDialect Oracle 23ai}.
712+
*/
713+
public static final int VECTOR_BINARY = 10_004;
714+
715+
/**
716+
* A type code representing a half-precision floating-point vector type for databases
717+
* like {@link org.hibernate.dialect.PostgreSQLDialect PostgreSQL}.
718+
*/
719+
public static final int VECTOR_FLOAT16 = 10_005;
720+
721+
/**
722+
* A type code representing a sparse single-byte integer vector type for Oracle 23ai database.
723+
*/
724+
public static final int SPARSE_VECTOR_INT8 = 10_006;
725+
726+
/**
727+
* A type code representing a sparse single-precision floating-point vector type for Oracle 23ai database.
728+
*/
729+
public static final int SPARSE_VECTOR_FLOAT32 = 10_007;
730+
731+
/**
732+
* A type code representing a sparse double-precision floating-point vector type for Oracle 23ai database.
733+
*/
734+
public static final int SPARSE_VECTOR_FLOAT64 = 10_008;
735+
736+
708737
private SqlTypes() {
709738
}
710739

hibernate-core/src/main/java/org/hibernate/type/StandardBasicTypes.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,14 @@ private StandardBasicTypes() {
749749
"byte_vector", byte[].class, SqlTypes.VECTOR_INT8
750750
);
751751

752+
/**
753+
* The standard Hibernate type for mapping {@code float[]} to JDBC {@link org.hibernate.type.SqlTypes#VECTOR_FLOAT16 VECTOR_FLOAT16},
754+
* specifically for embedding half-precision floating-point (16-bits) vectors like provided by the PostgreSQL extension pgvector.
755+
*/
756+
public static final BasicTypeReference<float[]> VECTOR_FLOAT16 = new BasicTypeReference<>(
757+
"float16_vector", float[].class, SqlTypes.VECTOR_FLOAT16
758+
);
759+
752760
/**
753761
* The standard Hibernate type for mapping {@code float[]} to JDBC {@link org.hibernate.type.SqlTypes#VECTOR VECTOR},
754762
* specifically for embedding single-precision floating-point (32-bits) vectors like provided by Oracle 23ai.
@@ -765,6 +773,38 @@ private StandardBasicTypes() {
765773
"double_vector", double[].class, SqlTypes.VECTOR_FLOAT64
766774
);
767775

776+
/**
777+
* The standard Hibernate type for mapping {@code byte[]} to JDBC {@link org.hibernate.type.SqlTypes#VECTOR_BINARY VECTOR_BIT},
778+
* specifically for embedding bit vectors like provided by Oracle 23ai.
779+
*/
780+
public static final BasicTypeReference<byte[]> VECTOR_BINARY = new BasicTypeReference<>(
781+
"binary_vector", byte[].class, SqlTypes.VECTOR_BINARY
782+
);
783+
784+
// /**
785+
// * The standard Hibernate type for mapping {@code byte[]} to JDBC {@link org.hibernate.type.SqlTypes#VECTOR_INT8 VECTOR_INT8},
786+
// * specifically for embedding integer vectors (8-bits) like provided by Oracle 23ai.
787+
// */
788+
// public static final BasicTypeReference<byte[]> SPARSE_VECTOR_INT8 = new BasicTypeReference<>(
789+
// "sparse_byte_vector", byte[].class, SqlTypes.SPARSE_VECTOR_INT8
790+
// );
791+
//
792+
// /**
793+
// * The standard Hibernate type for mapping {@code float[]} to JDBC {@link org.hibernate.type.SqlTypes#VECTOR VECTOR},
794+
// * specifically for embedding single-precision floating-point (32-bits) vectors like provided by Oracle 23ai.
795+
// */
796+
// public static final BasicTypeReference<float[]> SPARSE_VECTOR_FLOAT32 = new BasicTypeReference<>(
797+
// "sparse_float_vector", float[].class, SqlTypes.SPARSE_VECTOR_FLOAT32
798+
// );
799+
//
800+
// /**
801+
// * The standard Hibernate type for mapping {@code double[]} to JDBC {@link org.hibernate.type.SqlTypes#VECTOR VECTOR},
802+
// * specifically for embedding double-precision floating-point (64-bits) vectors like provided by Oracle 23ai.
803+
// */
804+
// public static final BasicTypeReference<double[]> SPARSE_VECTOR_FLOAT64 = new BasicTypeReference<>(
805+
// "sparse_double_vector", double[].class, SqlTypes.SPARSE_VECTOR_FLOAT64
806+
// );
807+
768808

769809
public static void prime(TypeConfiguration typeConfiguration) {
770810
BasicTypeRegistry basicTypeRegistry = typeConfiguration.getBasicTypeRegistry();
@@ -1286,6 +1326,34 @@ public static void prime(TypeConfiguration typeConfiguration) {
12861326
"byte_vector"
12871327
);
12881328

1329+
handle(
1330+
VECTOR_BINARY,
1331+
null,
1332+
basicTypeRegistry,
1333+
"bit_vector"
1334+
);
1335+
1336+
// handle(
1337+
// SPARSE_VECTOR_FLOAT32,
1338+
// null,
1339+
// basicTypeRegistry,
1340+
// "sparse_float_vector"
1341+
// );
1342+
//
1343+
// handle(
1344+
// SPARSE_VECTOR_FLOAT64,
1345+
// null,
1346+
// basicTypeRegistry,
1347+
// "sparse_double_vector"
1348+
// );
1349+
//
1350+
// handle(
1351+
// SPARSE_VECTOR_INT8,
1352+
// null,
1353+
// basicTypeRegistry,
1354+
// "sparse_byte_vector"
1355+
// );
1356+
12891357

12901358
// Specialized version handlers
12911359

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/XmlAsStringArrayJdbcType.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,20 @@ protected X doExtract(CallableStatement statement, String name, WrapperOptions o
174174

175175
};
176176
}
177+
178+
@Override
179+
public boolean equals(Object that) {
180+
return super.equals( that )
181+
&& that instanceof XmlAsStringArrayJdbcType jdbcType
182+
&& ddlTypeCode == jdbcType.ddlTypeCode
183+
&& nationalized == jdbcType.nationalized;
184+
}
185+
186+
@Override
187+
public int hashCode() {
188+
int result = super.hashCode();
189+
result = 31 * result + Boolean.hashCode( nationalized );
190+
result = 31 * result + ddlTypeCode;
191+
return result;
192+
}
177193
}

0 commit comments

Comments
 (0)