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 PGJPAJSONAnyDAO extends AbstractJPAJSONAnyDAO {
33
34 public PGJPAJSONAnyDAO(final PlainSchemaDAO plainSchemaDAO) {
35 super(plainSchemaDAO);
36 }
37
38 @Override
39 protected String queryBegin(final String table) {
40 return "SELECT DISTINCT id FROM " + table + " u,"
41 + "jsonb_array_elements(u.plainAttrs) attrs,"
42 + "jsonb_array_elements(COALESCE(attrs -> 'values', '[{}]'::jsonb)) attrValues ";
43 }
44
45 @Override
46 protected String attrValueMatch(
47 final AnyUtils anyUtils,
48 final PlainSchema schema,
49 final PlainAttrValue attrValue,
50 final boolean ignoreCaseMatch) {
51
52 Pair<String, Boolean> schemaInfo = schemaInfo(schema.getType(), ignoreCaseMatch);
53 if (schemaInfo.getRight()) {
54 return "attrs ->> 'schema' = ? "
55 + "AND "
56 + (schemaInfo.getRight() ? "LOWER(" : "")
57 + (schema.isUniqueConstraint() ? "attrs -> 'uniqueValue'" : "attrValues")
58 + " ->> '" + schemaInfo.getLeft()
59 + '\'' + (schemaInfo.getRight() ? ")" : "")
60 + " = "
61 + (schemaInfo.getRight() ? "LOWER(" : "")
62 + '?'
63 + (schemaInfo.getRight() ? ")" : "");
64 }
65
66 PlainAttr<?> container = anyUtils.newPlainAttr();
67 container.setSchema(schema);
68 if (attrValue instanceof PlainAttrUniqueValue) {
69 container.setUniqueValue((PlainAttrUniqueValue) attrValue);
70 } else {
71 ((JSONPlainAttr) container).add(attrValue);
72 }
73 return "plainAttrs::jsonb @> '" + POJOHelper.serialize(List.of(container)).replace("'", "''") + "'::jsonb";
74 }
75 }