001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *      http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.oozie.store;
019
020import java.util.List;
021import java.util.Map;
022
023import org.apache.oozie.client.OozieClient;
024import org.apache.oozie.util.XLog;
025
026public class StoreStatusFilter {
027    public static final String coordSeletStr = "Select w.id, w.appName, w.statusStr, w.user, w.group, w.startTimestamp, w.endTimestamp, w.appPath, w.concurrency, w.frequency, w.lastActionTimestamp, w.nextMaterializedTimestamp, w.createdTimestamp, w.timeUnitStr, w.timeZone, w.timeOut from CoordinatorJobBean w";
028
029    public static final String coordCountStr = "Select count(w) from CoordinatorJobBean w";
030
031    public static final String wfSeletStr = "Select w.id, w.appName, w.statusStr, w.run, w.user, w.group, w.createdTimestamp, w.startTimestamp, w.lastModifiedTimestamp, w.endTimestamp from WorkflowJobBean w";
032
033    public static final String wfCountStr = "Select count(w) from WorkflowJobBean w";
034
035    public static final String bundleSeletStr = "Select w.id, w.appName, w.appPath, w.conf, w.statusStr, w.kickoffTimestamp, w.startTimestamp, w.endTimestamp, w.pauseTimestamp, w.createdTimestamp, w.user, w.group, w.timeUnitStr, w.timeOut from BundleJobBean w";
036
037    public static final String bundleCountStr = "Select count(w) from BundleJobBean w";
038
039    public static void filter(Map<String, List<String>> filter, List<String> orArray, List<String> colArray,
040            List<String> valArray, StringBuilder sb, String seletStr, String countStr) {
041        boolean isStatus = false;
042        boolean isAppName = false;
043        boolean isUser = false;
044        boolean isEnabled = false;
045        boolean isFrequency = false;
046        boolean isId = false;
047        boolean isUnit = false;
048
049        int index = 0;
050
051        for (Map.Entry<String, List<String>> entry : filter.entrySet()) {
052            String colName = null;
053            String colVar = null;
054            if (entry.getKey().equals(OozieClient.FILTER_GROUP)) {
055                XLog.getLog(StoreStatusFilter.class).warn("Filter by 'group' is not supported anymore");
056            }
057            else {
058                if (entry.getKey().equals(OozieClient.FILTER_STATUS)) {
059                    List<String> values = filter.get(OozieClient.FILTER_STATUS);
060                    colName = "status";
061                    for (int i = 0; i < values.size(); i++) {
062                        colVar = "status";
063                        colVar = colVar + index;
064                        if (!isEnabled && !isStatus) {
065                            sb.append(seletStr).append(" where w.statusStr IN (:status" + index);
066                            isStatus = true;
067                            isEnabled = true;
068                        }
069                        else {
070                            if (isEnabled && !isStatus) {
071                                sb.append(" and w.statusStr IN (:status" + index);
072                                isStatus = true;
073                            }
074                            else {
075                                if (isStatus) {
076                                    sb.append(", :status" + index);
077                                }
078                            }
079                        }
080                        if (i == values.size() - 1) {
081                            sb.append(")");
082                        }
083                        index++;
084                        valArray.add(values.get(i));
085                        orArray.add(colName);
086                        colArray.add(colVar);
087                    }
088                }
089                else {
090                    if (entry.getKey().equals(OozieClient.FILTER_NAME)) {
091                        List<String> values = filter.get(OozieClient.FILTER_NAME);
092                        colName = "appName";
093                        for (int i = 0; i < values.size(); i++) {
094                            colVar = "appName";
095                            colVar = colVar + index;
096                            if (!isEnabled && !isAppName) {
097                                sb.append(seletStr).append(" where w.appName IN (:appName" + index);
098                                isAppName = true;
099                                isEnabled = true;
100                            }
101                            else {
102                                if (isEnabled && !isAppName) {
103                                    sb.append(" and w.appName IN (:appName" + index);
104                                    isAppName = true;
105                                }
106                                else {
107                                    if (isAppName) {
108                                        sb.append(", :appName" + index);
109                                    }
110                                }
111                            }
112                            if (i == values.size() - 1) {
113                                sb.append(")");
114                            }
115                            index++;
116                            valArray.add(values.get(i));
117                            orArray.add(colName);
118                            colArray.add(colVar);
119                        }
120                    }
121                    else {
122                        if (entry.getKey().equals(OozieClient.FILTER_USER)) {
123                            List<String> values = filter.get(OozieClient.FILTER_USER);
124                            colName = "user";
125                            for (int i = 0; i < values.size(); i++) {
126                                colVar = "user";
127                                colVar = colVar + index;
128                                if (!isEnabled && !isUser) {
129                                    sb.append(seletStr).append(" where w.user IN (:user" + index);
130                                    isUser = true;
131                                    isEnabled = true;
132                                }
133                                else {
134                                    if (isEnabled && !isUser) {
135                                        sb.append(" and w.user IN (:user" + index);
136                                        isUser = true;
137                                    }
138                                    else {
139                                        if (isUser) {
140                                            sb.append(", :user" + index);
141                                        }
142                                    }
143                                }
144                                if (i == values.size() - 1) {
145                                    sb.append(")");
146                                }
147                                index++;
148                                valArray.add(values.get(i));
149                                orArray.add(colName);
150                                colArray.add(colVar);
151                            }
152                        }
153                        else if (entry.getKey().equals(OozieClient.FILTER_FREQUENCY)) {
154                            List<String> values = filter.get(OozieClient.FILTER_FREQUENCY);
155                            colName = "frequency";
156                            for (int i = 0; i < values.size(); i++) {
157                                colVar = "frequency";
158                                colVar = colVar + index;
159                                if (!isEnabled && !isFrequency) {
160                                    sb.append(seletStr).append(" where w.frequency IN (:frequency" + index);
161                                    isFrequency = true;
162                                    isEnabled = true;
163                                }
164                                else {
165                                    if (isEnabled && !isFrequency) {
166                                        sb.append(" and w.frequency IN (:frequency" + index);
167                                        isFrequency = true;
168                                    }
169                                    else {
170                                        if (isFrequency) {
171                                            sb.append(", :frequency" + index);
172                                        }
173                                    }
174                                }
175                                if (i == values.size() - 1) {
176                                    sb.append(")");
177                                }
178                                index++;
179                                valArray.add(values.get(i));
180                                orArray.add(colName);
181                                colArray.add(colVar);
182                            }
183                        }
184                        else if (entry.getKey().equals(OozieClient.FILTER_ID)) {
185                            List<String> values = filter.get(OozieClient.FILTER_ID);
186                            colName = "id";
187                            for (int i = 0; i < values.size(); i++) {
188                                colVar = "id";
189                                colVar = colVar + index;
190                                if (!isEnabled && !isId) {
191                                    sb.append(seletStr).append(" where w.id IN (:id" + index);
192                                    isId = true;
193                                    isEnabled = true;
194                                }
195                                else {
196                                    if (isEnabled && !isId) {
197                                        sb.append(" and w.id IN (:id" + index);
198                                        isId = true;
199                                    }
200                                    else {
201                                        if (isId) {
202                                            sb.append(", :id" + index);
203                                        }
204                                    }
205                                }
206                                if (i == values.size() - 1) {
207                                    sb.append(")");
208                                }
209                                index++;
210                                valArray.add(values.get(i));
211                                orArray.add(colName);
212                                colArray.add(colVar);
213                            }
214                        }
215                        // Filter map has time unit filter specified
216                        else if (entry.getKey().equals(OozieClient.FILTER_UNIT)) {
217                            List<String> values = filter.get(OozieClient.FILTER_UNIT);
218                            colName = "timeUnitStr";
219                            for (int i = 0; i < values.size(); ++i) {
220                                colVar = colName + index;
221                                // This unit filter value is the first condition to be added to the where clause of
222                                // query
223                                if (!isEnabled && !isUnit) {
224                                    sb.append(seletStr).append(" where w.timeUnitStr IN (:timeUnitStr" + index);
225                                    isUnit = true;
226                                    isEnabled = true;
227                                } else {
228                                    // Unit filter is neither the first nor the last condition to be added to the where
229                                    // clause of query
230                                    if (isEnabled && !isUnit) {
231                                        sb.append(" and w.timeUnitStr IN (:timeUnitStr" + index);
232                                        isUnit = true;
233                                    } else {
234                                        if (isUnit) {
235                                            sb.append(", :timeUnitStr" + index);
236                                        }
237                                    }
238                                }
239                                // This unit filter value is the last condition to be added to the where clause of query
240                                if (i == values.size() - 1) {
241                                    sb.append(")");
242                                }
243                                ++index;
244                                valArray.add(values.get(i));
245                                orArray.add(colName);
246                                colArray.add(colVar);
247                            }
248                        }
249                    }
250                }
251            }
252        }
253    }
254}