2 * ============LICENSE_START=======================================================
3 * ONAP : ccsdk features
4 * ================================================================================
5 * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query;
24 import com.fasterxml.jackson.core.JsonProcessingException;
25 import java.lang.reflect.InvocationTargetException;
26 import java.lang.reflect.Method;
27 import java.util.ArrayList;
28 import java.util.List;
29 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.database.SqlDBMapper;
30 import org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query.filters.DBKeyValuePair;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.data.provider.rev201110.Entity;
32 import org.opendaylight.yangtools.yang.binding.DataObject;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
36 public class InsertQuery<T extends DataObject> implements SqlQuery {
38 private final Logger LOG = LoggerFactory.getLogger(InsertQuery.class);
40 protected final Entity entity;
41 private final String controllerId;
42 private final boolean ignoreControllerId;
43 private final T object;
44 private final boolean ignoreNull;
46 private final boolean ignoreIdField;
48 public InsertQuery(Entity e, T object, String controllerId) {
49 this(e, object, controllerId, SqlQuery.DEFAULT_IGNORE_CONTROLLERID);
52 public InsertQuery(Entity e, T object, String controllerId, boolean ignoreControllerId) {
53 this(e, object, controllerId, ignoreControllerId, SqlQuery.DEFAULT_IGNORE_ID_FIELD);
56 public InsertQuery(Entity e, T object, String controllerId, boolean ignoreControllerId, boolean ignoreIdField) {
58 this.controllerId = controllerId;
60 this.ignoreNull = true;
62 this.ignoreControllerId = ignoreControllerId;
63 this.ignoreIdField = ignoreIdField;
67 public String toSql() {
69 return this.toSqlWithError();
70 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
71 | JsonProcessingException e) {
72 LOG.warn("unable to create insert statement for table {} from object {}: ", this.entity, this.object, e);
77 protected String toSqlWithError() throws IllegalAccessException, IllegalArgumentException,
78 InvocationTargetException, JsonProcessingException {
79 Class<?> cls = this.object.getClass();
80 List<DBKeyValuePair<String>> kvps = new ArrayList<>();
81 List<String> cols = new ArrayList<>();
82 List<String> args = new ArrayList<>();
85 StringBuilder sb = new StringBuilder();
86 sb.append("INSERT INTO `" + entity.getName() + "` (");
87 for (Method m : SqlDBMapper.getFilteredMethods(cls, true)) {
89 m.setAccessible(true);
90 value = m.invoke(this.object);
91 col = SqlDBMapper.getColumnName(m);
92 if (col.equals("id")) {
93 if (this.ignoreIdField) {
96 if (this.id != null) {
100 if (ignoreNull && value == null) {
103 DBKeyValuePair<String> kvp = SqlDBMapper.getEscapedKeyValue(m, col, value);
104 cols.add(kvp.getKey());
105 args.add(kvp.getValue());
108 if (this.id != null && !cols.contains("`id`")) {
110 args.add("'" + this.id + "'");
112 if (!this.ignoreControllerId) {
113 args.add("'" + this.controllerId + "'");
115 sb.append(String.join(",", cols));
116 if (!this.ignoreControllerId) {
117 sb.append(",`" + SqlDBMapper.ODLID_DBCOL + "`) VALUES (");
119 sb.append(") VALUES (");
121 sb.append(String.join(",", args) + " )");
122 this.appendAdditionalToQuery(sb, kvps);
123 return sb.toString();
126 protected void appendAdditionalToQuery(StringBuilder sb, List<DBKeyValuePair<String>> keyValues) {
130 public void setId(String id) {