1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.persistence.jpa.dao;
20
21 import java.util.List;
22 import org.apache.commons.lang3.tuple.Pair;
23 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
24 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
25 import org.apache.syncope.core.persistence.api.entity.JSONPlainAttr;
26 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
27 import org.apache.syncope.core.persistence.api.entity.PlainAttrUniqueValue;
28 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
29 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
30 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
31
32 public class MyJPAJSONAnyDAO extends AbstractJPAJSONAnyDAO {
33
34 public MyJPAJSONAnyDAO(final PlainSchemaDAO plainSchemaDAO) {
35 super(plainSchemaDAO);
36 }
37
38 @Override
39 protected String queryBegin(final String table) {
40 return "SELECT DISTINCT id FROM " + view(table) + ' ';
41 }
42
43 @Override
44 protected String attrValueMatch(
45 final AnyUtils anyUtils,
46 final PlainSchema schema,
47 final PlainAttrValue attrValue,
48 final boolean ignoreCaseMatch) {
49
50 Pair<String, Boolean> schemaInfo = schemaInfo(schema.getType(), ignoreCaseMatch);
51 if (schemaInfo.getRight()) {
52 return "plainSchema = ? "
53 + "AND "
54 + (schemaInfo.getRight() ? "LOWER(" : "")
55 + (schema.isUniqueConstraint()
56 ? "attrUniqueValue ->> '$." + schemaInfo.getLeft() + '\''
57 : schemaInfo.getLeft())
58 + (schemaInfo.getRight() ? ")" : "")
59 + " = "
60 + (schemaInfo.getRight() ? "LOWER(" : "")
61 + '?'
62 + (schemaInfo.getRight() ? ")" : "");
63 } else {
64 PlainAttr<?> container = anyUtils.newPlainAttr();
65 container.setSchema(schema);
66 if (attrValue instanceof PlainAttrUniqueValue) {
67 container.setUniqueValue((PlainAttrUniqueValue) attrValue);
68 } else {
69 ((JSONPlainAttr) container).add(attrValue);
70 }
71 return "JSON_CONTAINS(plainAttrs, '" + POJOHelper.serialize(List.of(container)).replace("'", "''") + "')";
72 }
73 }
74 }