Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 06f9768

Browse files
committed
HHH-19679 Support binary, float16 and sparse vector types
1 parent 47da341 commit 06f9768

File tree

66 files changed

+4144
-418
lines changed

Some content is hidden

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

66 files changed

+4144
-418
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)

AltStyle によって変換されたページ (->オリジナル) /