View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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  }