1 package com.vladmihalcea.hibernate.type.search.internal;
2
3 import com.vladmihalcea.hibernate.util.ReflectionUtils;
4 import org.hibernate.type.descriptor.ValueBinder;
5 import org.hibernate.type.descriptor.ValueExtractor;
6 import org.hibernate.type.descriptor.WrapperOptions;
7 import org.hibernate.type.descriptor.java.JavaTypeDescriptor;
8 import org.hibernate.type.descriptor.sql.BasicBinder;
9 import org.hibernate.type.descriptor.sql.BasicExtractor;
10 import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
11
12 import java.sql.*;
13
14 public class PostgreSQLTSVectorSqlTypeDescriptor implements SqlTypeDescriptor {
15
16     public static final PostgreSQLTSVectorSqlTypeDescriptor INSTANCE = new PostgreSQLTSVectorSqlTypeDescriptor();
17
18     @Override
19     public int getSqlType() {
20         return Types.OTHER;
21     }
22
23     @Override
24     public boolean canBeRemapped() {
25         return false;
26     }
27
28     @Override
29     public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
30         return new BasicBinder<X>(javaTypeDescriptor, this) {
31             @Override
32             protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException {
33                 Object holder = ReflectionUtils.newInstance("org.postgresql.util.PGobject");
34                 ReflectionUtils.invokeSetter(holder, "type""tsvector");
35                 ReflectionUtils.invokeSetter(holder, "value", javaTypeDescriptor.unwrap(value, String.class, options));
36                 st.setObject(index, holder);
37             }
38
39             @Override
40             protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
41                     throws SQLException {
42                 Object holder = ReflectionUtils.newInstance("org.postgresql.util.PGobject");
43                 ReflectionUtils.invokeSetter(holder, "type""tsvector");
44                 ReflectionUtils.invokeSetter(holder, "value", javaTypeDescriptor.unwrap(value, String.class, options));
45
46                 st.setObject(name, holder);
47             }
48         };
49     }
50
51     @Override
52     public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
53         return new BasicExtractor<X>(javaTypeDescriptor, this) {
54             @Override
55             protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException {
56                 return javaTypeDescriptor.wrap(rs.getString( name ), options);
57             }
58
59             @Override
60             protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
61                 return javaTypeDescriptor.wrap(statement.getString(index), options);
62             }
63
64             @Override
65             protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException {
66                 return javaTypeDescriptor.wrap(statement.getString(name), options);
67             }
68         };
69     }
70 }
71