dataset_mapper.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. var App = require('app');
  19. App.dataSetMapper = App.QuickDataMapper.create({
  20. model: App.Dataset,
  21. Jobs_model: App.DataSetJob,
  22. config: {
  23. id: 'id', // approach 2 : to be calculated (TBC1)
  24. name: 'Feeds.name', // from json
  25. status: 'Feeds.status', // from json
  26. source_cluster_name: 'Feeds.clusters.cluster[0].name', // approach1 : from json
  27. $target_cluster: 'none', // will be loaded outside parser ( TBC2 ),
  28. source_dir: 'Feeds.locations.location.path',
  29. $schedule_id: 'none', // will be loaded outside parser
  30. dataset_jobs: 'dataset_jobs', // TBC3 ( set of ids will be added )
  31. // all below are unknown at present and may be blank
  32. last_failed_date: 'last_failed_date', // TBC4
  33. last_succeeded_date: 'last_succeeded_date', // TBC5
  34. last_duration: 'last_duration', // TBC6
  35. avg_data: 'avg_data', // TBC7
  36. created_date: 'created_date', // TBC8
  37. target_dir: 'target_dir'
  38. },
  39. jobs_config: {
  40. $dataset_id: 'none', // will be loaded outside parser
  41. id: 'Instances.id',
  42. status : 'Instances.status',
  43. start_date: 'start_date',
  44. end_date: 'end_date',
  45. duration: 'duration'
  46. //data: 'Instances.details'
  47. },
  48. schedule_config: {
  49. $dataset_id: 'none', // will be loaded outside parser
  50. id: 'id',
  51. start_date : 'start_date',
  52. end_date : 'end_date',
  53. start_time : 'start_time',
  54. end_time : 'end_time',
  55. timezone : 'timezone',
  56. frequency : 'frequency'
  57. },
  58. loadSchedule: function (datasetItemFromJson) {
  59. App.store.load(App.Dataset.Schedule, this.parseSchedule(datasetItemFromJson));
  60. },
  61. parseSchedule: function(datasetItemFromJson) {
  62. var schedule = {};
  63. schedule.id = datasetItemFromJson.id;
  64. var source_cluster = datasetItemFromJson.Feeds.clusters.cluster.findProperty("type", "source");
  65. var start_date = new Date(source_cluster.validity.start);
  66. var end_date = new Date(source_cluster.validity.end);
  67. var d = new Date();
  68. var start_mm = start_date.getMonth() + 1; // In future may consider using getUTCMonth()
  69. var start_dd = start_date.getDay();
  70. var start_yyyy = start_date.getFullYear();
  71. var end_mm = end_date.getMonth() + 1;
  72. var end_dd = end_date.getDay();
  73. var end_yyyy = end_date.getFullYear();
  74. schedule.start_date = start_mm + "/" + start_dd + "/" + start_yyyy;
  75. schedule.end_date = end_mm + "/" + end_dd + "/" + end_yyyy;
  76. var start_hh = start_date.getHours();
  77. var start_mi = start_date.getMinutes();
  78. var start_ampm = (start_hh < 12 ? 'AM' : 'PM');
  79. var end_hh = end_date.getHours();
  80. var end_mi = end_date.getMinutes();
  81. var end_ampm = (end_hh < 12 ? 'AM' : 'PM');
  82. if (start_hh) {
  83. start_hh %= 12;
  84. }
  85. if (end_hh) {
  86. end_hh %= 12;
  87. }
  88. schedule.start_time = start_hh + ":" + start_mi + ":" + start_ampm;
  89. schedule.end_time = end_hh + ":" + end_mi + ":" + end_ampm;
  90. schedule.frequency = datasetItemFromJson.Feeds.frequency;
  91. schedule.timezone = datasetItemFromJson.Feeds.timezone;
  92. schedule.dataset_id = datasetItemFromJson.id;
  93. return schedule;
  94. },
  95. map: function (json) {
  96. if (!this.get('model')) {
  97. return;
  98. }
  99. if (json && json.items && json.items.length > 0) {
  100. var dataset_results = [];
  101. json.items.forEach(function (item) {
  102. try {
  103. // TBC1
  104. item.id = this.getId(item.Feeds.name);
  105. // TBC3
  106. item.dataset_jobs = [];
  107. var last_failed_date = null;
  108. var last_succeeded_date = null;
  109. var last_end_date = null;
  110. item.instances.forEach(function (job) {
  111. var end_date = new Date(job.Instances.end);
  112. if (!last_end_date) {
  113. last_end_date = end_date;
  114. item.last_job = job;
  115. }
  116. else if (end_date > last_end_date) {
  117. last_end_date = end_date;
  118. item.last_job = job;
  119. }
  120. if (job.Instances.status === 'FAILED') {
  121. if (last_failed_date == null || last_failed_date < end_date) {
  122. item.last_failed_date = end_date.getTime();
  123. last_failed_date = end_date;
  124. }
  125. }
  126. else if (job.Instances.status === 'SUCCESSFUL') {
  127. if (last_succeeded_date == null || last_succeeded_date < end_date) {
  128. item.last_succeeded_date = end_date.getTime();
  129. last_succeeded_date = end_date;
  130. }
  131. }
  132. item.dataset_jobs.push(job.Instances.id);
  133. });
  134. // calculate last_duration
  135. var last_end_date = new Date(item.last_job.Instances.end);
  136. var last_start_date = new Date(item.last_job.Instances.start);
  137. item.last_duration = last_end_date - last_start_date;
  138. item.avg_data = '';
  139. item.created_date = '';
  140. item.target_dir = '';
  141. var newitem = this.parseIt(item, this.config);
  142. // TBC2 - but shd be loaded after parsing
  143. var target_cluster_name = (item.Feeds.clusters.cluster.findProperty("type", "target")).name;
  144. var target_cluster_id = (item.Feeds.clusters.cluster.findProperty("type", "target")).name;
  145. newitem.target_cluster_id = this.getId(target_cluster_id);
  146. newitem.schedule_id = newitem.id;
  147. this.loadSchedule(item);
  148. dataset_results.push(newitem);
  149. } catch (ex) {
  150. console.debug('Exception occured : ' + ex);
  151. }
  152. }, this);
  153. console.debug('Before load: App.Dataset.find().content : ' + App.Dataset.find().content);
  154. App.store.loadMany(this.get('model'), dataset_results);
  155. console.debug('After load: App.Dataset.find().content : ' + App.Dataset.find().content);
  156. try {
  157. // Child records
  158. var dataset_job_results = [];
  159. json.items.forEach(function (item) {
  160. item.instances.forEach(function (instance) {
  161. instance.Instances.start = new Date(instance.Instances.start); // neeed to be calulated end -start
  162. instance.Instances.end = new Date(instance.Instances.end); // neeed to be calulated end -start
  163. instance.duration = instance.Instances.end - instance.Instances.start;
  164. instance.start_date = instance.Instances.start;
  165. instance.end_date = instance.Instances.end;
  166. var result = this.parseIt(instance, this.jobs_config);
  167. result.dataset_id = item.id;
  168. dataset_job_results.push(result);
  169. }, this)
  170. }, this);
  171. console.debug('Before load: App.DataSetJob.find().content : ' + App.DataSetJob.find().content);
  172. App.store.loadMany(this.get('Jobs_model'), dataset_job_results);
  173. console.debug('After load: App.DataSetJob.find().content : ' + App.DataSetJob.find().content);
  174. }
  175. catch (ex) {
  176. console.debug('Exception occured : ' + ex);
  177. }
  178. }
  179. },
  180. getId: function(n) {
  181. var re = new RegExp(" ", "g");
  182. return n.replace(re, "_");
  183. }
  184. });