PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/bower_components/arcgis_js/arcgis_js_api/library/3.13/3.13compact/esri/workers/indexWorker.js

https://gitlab.com/railway/railway-land
JavaScript | 190 lines | 165 code | 12 blank | 13 comment | 47 complexity | 964bc5543eb47c8ccc074641cd4e4d7b MD5 | raw file
  1. /* jshint worker: true */
  2. /* global self: true, postMessage: true */
  3. /* REQUIRES esri/workers/scripts/indexInterface */
  4. /* global Indexer: false, geomToBbox: false, merge: false */
  5. (function(context) {
  6. var self = context;
  7. var index;
  8. var system;
  9. function createIndex(msg) {
  10. try {
  11. index = new Indexer(msg);
  12. system = index.system;
  13. postMessage({
  14. msgId: msg.msgId,
  15. insert: msg.data && msg.data.length
  16. });
  17. } catch (err) {
  18. postMessage({
  19. msgId: msg.msgId,
  20. status: 'error',
  21. message: err.message
  22. });
  23. }
  24. }
  25. function updateIndex(msg) {
  26. if (msg.insert || msg.update) {
  27. if (!index) { //no indexer instance got created yet
  28. createIndex({
  29. 'data': msg.insert || msg.update,
  30. 'system': msg.system, //if this is null or undefined, Indexer will use default
  31. 'indexOptions': msg.options,
  32. 'idField': msg.idField,
  33. 'layerId': msg.layerId
  34. });
  35. } else if (!index.index) { //indexer instance but no index created yet
  36. index.create(msg.insert || msg.update, merge({
  37. layerId: msg.layerId
  38. }, msg.options));
  39. } else { //we have an indexer with an active index
  40. if(msg.insert){
  41. var len = msg.insert.length;
  42. while (len--) {
  43. index.insert(msg.insert[len], null, msg.layerId);
  44. }
  45. } //TODO Support Update
  46. /*else {
  47. var len = msg.insert.length;
  48. while (len--) {
  49. index.search()
  50. }
  51. }*/
  52. }
  53. postMessage({
  54. msgId: msg.msgId,
  55. insert: msg.insert.length
  56. });
  57. } else if (msg.remove) {
  58. if (!index || !index.index) {
  59. postMessage({
  60. msgId: msg.msgId,
  61. status: 'error',
  62. message: 'no active index to remove from'
  63. });
  64. } else {
  65. msg.remove.forEach(index.remove, index);
  66. }
  67. postMessage({
  68. msgId: msg.msgId,
  69. remove: msg.remove.length
  70. });
  71. }
  72. }
  73. function search(msg) {
  74. if (!index || !index.index) {
  75. postMessage({
  76. msgId: msg.msgId,
  77. status: 'error',
  78. message: 'no active index to search'
  79. });
  80. } else {
  81. var layer = msg.layerId;
  82. var results = index.search(msg.search, msg.returnNode);
  83. var found=[], len=results.length, item;
  84. if(!layer){
  85. found = results;
  86. } else {
  87. while(len--){
  88. item = results[len];
  89. if(item.layerId === layer){
  90. found.push(item);
  91. }
  92. }
  93. }
  94. postMessage({
  95. msgId: msg.msgId,
  96. 'results': found
  97. });
  98. }
  99. }
  100. function getIndex(msg) {
  101. if (!index || !index.index) {
  102. postMessage({
  103. msgId: msg.msgId,
  104. status: 'error',
  105. message: 'no active index to serialize'
  106. });
  107. } else {
  108. var indexJson = index.serialize();
  109. postMessage({
  110. msgId: msg.msgId,
  111. index: indexJson
  112. });
  113. }
  114. }
  115. function loadIndex(msg) {
  116. index = new Indexer({
  117. system: msg.system
  118. });
  119. try {
  120. index.load(msg.index);
  121. postMessage({
  122. msgId: msg.msgId
  123. });
  124. } catch (err) {
  125. postMessage({
  126. msgId: msg.msgId,
  127. status: 'error',
  128. message: err.message
  129. });
  130. }
  131. }
  132. function messageHandler(evt) {
  133. var msg = evt.data || {};
  134. if (msg.index) {
  135. loadIndex(msg);
  136. } else if (msg.insert || msg.remove || msg.update) {
  137. updateIndex(msg);
  138. } else if ((msg.data && Array.isArray(msg.data)) || msg.system) {
  139. createIndex(msg);
  140. } else if (msg.search) {
  141. search(msg);
  142. } else if (msg.action && msg.action == 'getIndex') {
  143. getIndex(msg);
  144. }
  145. }
  146. self.addEventListener('message', messageHandler, false);
  147. self.searchIndex = function(criteria, returnNodes){
  148. return index.search(criteria, returnNodes);
  149. };
  150. self.main = function(msg) {
  151. var response = msg.response;
  152. var inserts;
  153. if (response && response.features) {
  154. var features = response.features;
  155. if (!features[0].geometry) {
  156. //returned without geometry, can't do anything
  157. return true;
  158. }
  159. //if points then don't need to modify
  160. //otherwise convert geoms to bbox
  161. if (!features[0].geometry.x && !features[0].geometry.y) {
  162. inserts = features.map(function(feat) {
  163. var item = geomToBbox(feat.geometry);
  164. item.id = feat.attributes[response.objectIdFieldName];
  165. return item;
  166. });
  167. } else {
  168. inserts = features.map(function(feat) {
  169. feat.geometry.id = feat.attributes[response.objectIdFieldName];
  170. return feat.geometry;
  171. });
  172. }
  173. updateIndex({
  174. 'inserts': inserts
  175. });
  176. }
  177. };
  178. })(self);