1 package com.vladmihalcea.hibernate.type.search.internal;
2
3 import org.hibernate.annotations.common.reflection.XProperty;
4 import org.hibernate.annotations.common.reflection.java.JavaXMember;
5 import org.hibernate.type.descriptor.WrapperOptions;
6 import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
7 import org.hibernate.usertype.DynamicParameterizedType;
8
9 import java.lang.reflect.ParameterizedType;
10 import java.lang.reflect.Type;
11 import java.lang.reflect.TypeVariable;
12 import java.util.Properties;
13
14 public class PostgreSQLTSVectorTypeDescriptor extends AbstractTypeDescriptor<Object> implements DynamicParameterizedType {
15
16 public PostgreSQLTSVectorTypeDescriptor() {
17 super(Object.class);
18 }
19
20 private Type type;
21
22 @Override
23 public void setParameterValues(Properties parameters) {
24 final XProperty xProperty = (XProperty) parameters.get(DynamicParameterizedType.XPROPERTY);
25 if (xProperty instanceof JavaXMember) {
26 type = ((JavaXMember) xProperty).getJavaType();
27 } else {
28 type = ((ParameterType) parameters.get(PARAMETER_TYPE)).getReturnedClass();
29 }
30 }
31
32 @Override
33 public boolean areEqual(Object one, Object another) {
34 if (one == another) {
35 return true;
36 }
37 if (one == null || another == null) {
38 return false;
39 }
40 if (one instanceof String && another instanceof String) {
41 return one.equals(another);
42 }
43 return one.equals(another);
44 }
45
46 @Override
47 public String toString(Object value) {
48 return value.toString();
49 }
50
51 @Override
52 public Object fromString(String string) {
53 if (String.class.isAssignableFrom(typeToClass())) {
54 return string;
55 }
56 return string;
57 }
58
59 @SuppressWarnings({"unchecked"})
60 @Override
61 public <X> X unwrap(Object value, Class<X> type, WrapperOptions options) {
62 if (value == null) {
63 return null;
64 }
65 if (String.class.isAssignableFrom(type)) {
66 return (X) toString(value);
67 }
68 throw unknownUnwrap(type);
69 }
70
71 @Override
72 public <X> Object wrap(X value, WrapperOptions options) {
73 if (value == null) {
74 return null;
75 }
76 return fromString(value.toString());
77 }
78
79 private Class typeToClass() {
80 Type classType = type;
81 if (type instanceof ParameterizedType) {
82 classType = ((ParameterizedType) type).getRawType();
83 } else if (type instanceof TypeVariable) {
84 classType = ((TypeVariable) type).getGenericDeclaration().getClass();
85 }
86 return (Class) classType;
87 }
88 }
89