migrate sdnr features to phosphorus
[ccsdk/features.git] / sdnr / wt / data-provider / dblib / src / main / java / org / onap / ccsdk / features / sdnr / wt / dataprovider / database / sqldb / query / InsertQuery.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP : ccsdk features
4  * ================================================================================
5  * Copyright (C) 2021 highstreet technologies GmbH Intellectual Property.
6  * All rights reserved.
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
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  *
21  */
22 package org.onap.ccsdk.features.sdnr.wt.dataprovider.database.sqldb.query;
23
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;
35
36 public class InsertQuery<T extends DataObject> implements SqlQuery {
37
38     private final Logger LOG = LoggerFactory.getLogger(InsertQuery.class);
39
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;
45     private String id;
46     private final boolean ignoreIdField;
47
48     public InsertQuery(Entity e, T object, String controllerId) {
49         this(e, object, controllerId, SqlQuery.DEFAULT_IGNORE_CONTROLLERID);
50     }
51
52     public InsertQuery(Entity e, T object, String controllerId, boolean ignoreControllerId) {
53         this(e, object, controllerId, ignoreControllerId, SqlQuery.DEFAULT_IGNORE_ID_FIELD);
54     }
55
56     public InsertQuery(Entity e, T object, String controllerId, boolean ignoreControllerId, boolean ignoreIdField) {
57         this.entity = e;
58         this.controllerId = controllerId;
59         this.object = object;
60         this.ignoreNull = true;
61         this.id = null;
62         this.ignoreControllerId = ignoreControllerId;
63         this.ignoreIdField = ignoreIdField;
64     }
65
66     @Override
67     public String toSql() {
68         try {
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);
73         }
74         return null;
75     }
76
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<>();
83         Object value;
84         String col;
85         StringBuilder sb = new StringBuilder();
86         sb.append("INSERT INTO `" + entity.getName() + "` (");
87         for (Method m : SqlDBMapper.getFilteredMethods(cls, true)) {
88
89             m.setAccessible(true);
90             value = m.invoke(this.object);
91             col = SqlDBMapper.getColumnName(m);
92             if (col.equals("id")) {
93                 if (this.ignoreIdField) {
94                     continue;
95                 }
96                 if (this.id != null) {
97                     value = this.id;
98                 }
99             }
100             if (ignoreNull && value == null) {
101                 continue;
102             }
103             DBKeyValuePair<String> kvp = SqlDBMapper.getEscapedKeyValue(m, col, value);
104             cols.add(kvp.getKey());
105             args.add(kvp.getValue());
106             kvps.add(kvp);
107         }
108         if (this.id != null && !cols.contains("`id`")) {
109             cols.add("`id`");
110             args.add("'" + this.id + "'");
111         }
112         if (!this.ignoreControllerId) {
113             args.add("'" + this.controllerId + "'");
114         }
115         sb.append(String.join(",", cols));
116         if (!this.ignoreControllerId) {
117             sb.append(",`" + SqlDBMapper.ODLID_DBCOL + "`) VALUES (");
118         } else {
119             sb.append(") VALUES (");
120         }
121         sb.append(String.join(",", args) + " )");
122         this.appendAdditionalToQuery(sb, kvps);
123         return sb.toString();
124     }
125
126     protected void appendAdditionalToQuery(StringBuilder sb, List<DBKeyValuePair<String>> keyValues) {
127
128     }
129
130     public void setId(String id) {
131         this.id = id;
132     }
133 }