001 /**
002 * Copyright (c) 2010 Yahoo! Inc. All rights reserved.
003 * Licensed under the Apache License, Version 2.0 (the "License");
004 * you may not use this file except in compliance with the License.
005 * You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software
010 * distributed under the License is distributed on an "AS IS" BASIS,
011 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 * See the License for the specific language governing permissions and
013 * limitations under the License. See accompanying LICENSE file.
014 */
015 package org.apache.oozie;
016
017 import java.io.DataInput;
018 import java.io.DataOutput;
019 import java.io.IOException;
020 import java.sql.Timestamp;
021 import java.util.Date;
022
023 import javax.persistence.Basic;
024 import javax.persistence.Column;
025 import javax.persistence.ColumnResult;
026 import javax.persistence.Entity;
027 import javax.persistence.Lob;
028 import javax.persistence.NamedNativeQueries;
029 import javax.persistence.NamedNativeQuery;
030 import javax.persistence.NamedQueries;
031 import javax.persistence.NamedQuery;
032 import javax.persistence.SqlResultSetMapping;
033
034 import org.apache.hadoop.io.Writable;
035 import org.apache.oozie.client.CoordinatorAction;
036 import org.apache.oozie.client.rest.JsonCoordinatorAction;
037 import org.apache.oozie.util.DateUtils;
038 import org.apache.oozie.util.WritableUtils;
039 import org.apache.openjpa.persistence.jdbc.Index;
040
041 @SqlResultSetMapping(
042 name = "CoordActionJobIdLmt",
043 columns = {@ColumnResult(name = "job_id"),
044 @ColumnResult(name = "min_lmt")})
045
046 @Entity
047 @NamedQueries({
048
049 @NamedQuery(name = "UPDATE_COORD_ACTION", query = "update CoordinatorActionBean w set w.actionNumber = :actionNumber, w.actionXml = :actionXml, w.consoleUrl = :consoleUrl, w.createdConf = :createdConf, w.errorCode = :errorCode, w.errorMessage = :errorMessage, w.externalStatus = :externalStatus, w.missingDependencies = :missingDependencies, w.runConf = :runConf, w.timeOut = :timeOut, w.trackerUri = :trackerUri, w.type = :type, w.createdTimestamp = :createdTime, w.externalId = :externalId, w.jobId = :jobId, w.lastModifiedTimestamp = :lastModifiedTime, w.nominalTimestamp = :nominalTime, w.slaXml = :slaXml, w.status = :status where w.id = :id"),
050
051 @NamedQuery(name = "UPDATE_COORD_ACTION_MIN", query = "update CoordinatorActionBean w set w.actionXml = :actionXml, w.missingDependencies = :missingDependencies, w.lastModifiedTimestamp = :lastModifiedTime, w.status = :status where w.id = :id"),
052
053 @NamedQuery(name = "DELETE_COMPLETED_COORD_ACTIONS", query = "delete from CoordinatorActionBean a where a.id = :id and (a.status = 'SUCCEEDED' OR a.status = 'FAILED' OR a.status = 'KILLED')"),
054
055 @NamedQuery(name = "GET_COORD_ACTIONS", query = "select OBJECT(w) from CoordinatorActionBean w"),
056
057 @NamedQuery(name = "GET_COMPLETED_ACTIONS_OLDER_THAN", query = "select OBJECT(a) from CoordinatorActionBean a where a.createdTimestamp < :createdTime and (a.status = 'SUCCEEDED' OR a.status = 'FAILED' OR a.status = 'KILLED')"),
058
059 @NamedQuery(name = "GET_COORD_ACTION", query = "select OBJECT(a) from CoordinatorActionBean a where a.id = :id"),
060
061 @NamedQuery(name = "GET_COORD_ACTION_FOR_EXTERNALID", query = "select OBJECT(a) from CoordinatorActionBean a where a.externalId = :externalId"),
062
063 @NamedQuery(name = "GET_COORD_ACTIONS_FOR_JOB_FIFO", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.status = 'READY' order by a.nominalTimestamp"),
064
065 @NamedQuery(name = "GET_COORD_ACTIONS_FOR_JOB_LIFO", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.status = 'READY' order by a.nominalTimestamp desc"),
066
067 @NamedQuery(name = "GET_COORD_RUNNING_ACTIONS_COUNT", query = "select count(a) from CoordinatorActionBean a where a.jobId = :jobId AND (a.status = 'RUNNING' OR a.status='SUBMITTED')"),
068
069 @NamedQuery(name = "GET_COORD_ACTIONS_COUNT_BY_JOBID", query = "select count(a) from CoordinatorActionBean a where a.jobId = :jobId"),
070
071 @NamedQuery(name = "GET_ACTIONS_FOR_COORD_JOB", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId"),
072
073 @NamedQuery(name = "GET_RUNNING_ACTIONS_FOR_COORD_JOB", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.status = 'RUNNING'"),
074
075 @NamedQuery(name = "GET_RUNNING_ACTIONS_OLDER_THAN", query = "select OBJECT(a) from CoordinatorActionBean a where a.status = 'RUNNING' AND a.lastModifiedTimestamp <= :lastModifiedTime"),
076
077 @NamedQuery(name = "GET_WAITING_SUBMITTED_ACTIONS_OLDER_THAN", query = "select OBJECT(a) from CoordinatorActionBean a where (a.status = 'WAITING' OR a.status = 'SUBMITTED') AND a.lastModifiedTimestamp <= :lastModifiedTime"),
078
079 @NamedQuery(name = "GET_ACTIONS_FOR_DATES", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND (a.status = 'TIMEDOUT' OR a.status = 'SUCCEEDED' OR a.status = 'KILLED' OR a.status = 'FAILED') AND a.nominalTimestamp >= :startTime AND a.nominalTimestamp <= :endTime"),
080
081 @NamedQuery(name = "GET_ACTION_FOR_NOMINALTIME", query = "select OBJECT(a) from CoordinatorActionBean a where a.jobId = :jobId AND a.nominalTimestamp = :nominalTime"),
082
083 @NamedQuery(name = "GET_COORD_ACTIONS_COUNT", query = "select count(w) from CoordinatorActionBean w")})
084
085 @NamedNativeQueries({
086
087 @NamedNativeQuery(name = "GET_READY_ACTIONS_GROUP_BY_JOBID", query = "select a.job_id as job_id, MIN(a.last_modified_time) as min_lmt from COORD_ACTIONS a where a.status = 'READY' GROUP BY a.job_id HAVING MIN(a.last_modified_time) < ?", resultSetMapping = "CoordActionJobIdLmt")
088 })
089 public class CoordinatorActionBean extends JsonCoordinatorAction implements
090 Writable {
091 @Basic
092 @Index
093 @Column(name = "job_id")
094 private String jobId;
095
096 @Basic
097 @Index
098 @Column(name = "status")
099 private String status = null;
100
101 @Basic
102 @Column(name = "nominal_time")
103 private java.sql.Timestamp nominalTimestamp = null;
104
105 @Basic
106 @Index
107 @Column(name = "last_modified_time")
108 private java.sql.Timestamp lastModifiedTimestamp = null;
109
110 @Basic
111 @Index
112 @Column(name = "created_time")
113 private java.sql.Timestamp createdTimestamp = null;
114
115 @Basic
116 @Index
117 @Column(name = "rerun_time")
118 private java.sql.Timestamp rerunTimestamp = null;
119
120 @Basic
121 @Index
122 @Column(name = "external_id")
123 private String externalId;
124
125 @Column(name = "sla_xml")
126 @Lob
127 private String slaXml = null;
128
129 public CoordinatorActionBean() {
130 }
131
132 /**
133 * Serialize the coordinator bean to a data output.
134 *
135 * @param dataOutput data output.
136 * @throws IOException thrown if the coordinator bean could not be serialized.
137 */
138 public void write(DataOutput dataOutput) throws IOException {
139 WritableUtils.writeStr(dataOutput, getJobId());
140 WritableUtils.writeStr(dataOutput, getType());
141 WritableUtils.writeStr(dataOutput, getId());
142 WritableUtils.writeStr(dataOutput, getCreatedConf());
143 WritableUtils.writeStr(dataOutput, getStatus().toString());
144 dataOutput.writeInt(getActionNumber());
145 WritableUtils.writeStr(dataOutput, getRunConf());
146 WritableUtils.writeStr(dataOutput, getExternalStatus());
147 WritableUtils.writeStr(dataOutput, getTrackerUri());
148 WritableUtils.writeStr(dataOutput, getErrorCode());
149 WritableUtils.writeStr(dataOutput, getErrorMessage());
150 }
151
152 /**
153 * Deserialize a coordinator bean from a data input.
154 *
155 * @param dataInput data input.
156 * @throws IOException thrown if the workflow bean could not be deserialized.
157 */
158 public void readFields(DataInput dataInput) throws IOException {
159 setJobId(WritableUtils.readStr(dataInput));
160 setType(WritableUtils.readStr(dataInput));
161 setId(WritableUtils.readStr(dataInput));
162 setCreatedConf(WritableUtils.readStr(dataInput));
163 setStatus(CoordinatorAction.Status.valueOf(WritableUtils
164 .readStr(dataInput)));
165 setRunConf(WritableUtils.readStr(dataInput));
166 setExternalStatus(WritableUtils.readStr(dataInput));
167 setTrackerUri(WritableUtils.readStr(dataInput));
168 setConsoleUrl(WritableUtils.readStr(dataInput));
169 long d = dataInput.readLong();
170 if (d != -1) {
171 setCreatedTime(new Date(d));
172 }
173 d = dataInput.readLong();
174 if (d != -1) {
175 setLastModifiedTime(new Date(d));
176 }
177 d = dataInput.readLong();
178 d = dataInput.readLong();
179 }
180
181 @Override
182 public String getJobId() {
183 return this.jobId;
184 }
185
186 @Override
187 public void setJobId(String id) {
188 super.setJobId(id);
189 this.jobId = id;
190 }
191
192 @Override
193 public Status getStatus() {
194 return Status.valueOf(status);
195 }
196
197 @Override
198 public void setStatus(Status status) {
199 super.setStatus(status);
200 this.status = status.toString();
201 }
202
203 @Override
204 public void setCreatedTime(Date createdTime) {
205 this.createdTimestamp = DateUtils.convertDateToTimestamp(createdTime);
206 super.setCreatedTime(createdTime);
207 }
208
209 public void setRerunTime(Date rerunTime) {
210 this.rerunTimestamp = DateUtils.convertDateToTimestamp(rerunTime);
211 }
212
213 @Override
214 public void setNominalTime(Date nominalTime) {
215 this.nominalTimestamp = DateUtils.convertDateToTimestamp(nominalTime);
216 super.setNominalTime(nominalTime);
217 }
218
219 @Override
220 public void setLastModifiedTime(Date lastModifiedTime) {
221 this.lastModifiedTimestamp = DateUtils.convertDateToTimestamp(lastModifiedTime);
222 super.setLastModifiedTime(lastModifiedTime);
223 }
224
225 @Override
226 public Date getCreatedTime() {
227 return DateUtils.toDate(createdTimestamp);
228 }
229
230 public Timestamp getCreatedTimestamp() {
231 return createdTimestamp;
232 }
233
234 public Date getRerunTime() {
235 return DateUtils.toDate(rerunTimestamp);
236 }
237
238 public Timestamp getRerunTimestamp() {
239 return rerunTimestamp;
240 }
241
242 @Override
243 public Date getLastModifiedTime() {
244 return DateUtils.toDate(lastModifiedTimestamp);
245 }
246
247 public Timestamp getLastModifiedTimestamp() {
248 return lastModifiedTimestamp;
249 }
250
251 @Override
252 public Date getNominalTime() {
253 return DateUtils.toDate(nominalTimestamp);
254 }
255
256 public Timestamp getNominalTimestamp() {
257 return nominalTimestamp;
258 }
259
260 @Override
261 public String getExternalId() {
262 return externalId;
263 }
264
265 @Override
266 public void setExternalId(String externalId) {
267 super.setExternalId(externalId);
268 this.externalId = externalId;
269 }
270
271 public String getSlaXml() {
272 return slaXml;
273 }
274
275 public void setSlaXml(String slaXml) {
276 this.slaXml = slaXml;
277 }
278
279 /**
280 * @return true if in terminal status
281 */
282 public boolean isTerminalStatus() {
283 boolean isTerminal = true;
284 switch (getStatus()) {
285 case WAITING:
286 case READY:
287 case SUBMITTED:
288 case RUNNING:
289 isTerminal = false;
290 break;
291 default:
292 isTerminal = true;
293 break;
294 }
295 return isTerminal;
296 }
297
298 }