|
1 | 1 | // Curious client-side JSON parsing
|
2 | 2 | //
|
3 | 3 |
|
4 |
| -var ex = undefined; |
5 |
| -if (typeof window !== 'undefined') { ex = window; } |
6 |
| -else if (typeof exports !== 'undefined' && exports) { |
7 |
| - ex = exports; |
8 |
| -} |
9 |
| - |
10 |
| -ex.CuriousObjects = (function() { |
11 |
| - function CuriousObject(hash_data, url) { |
12 |
| - this.id = hash_data.id; |
13 |
| - for (var k in hash_data) { |
14 |
| - this[k] = hash_data[k]; |
15 |
| - } |
16 |
| - this.__url = url; |
17 |
| - } |
18 |
| - |
19 |
| - function parse_objects(data) { |
20 |
| - if (data.objects === undefined) { return []; } |
21 |
| - var objects = []; |
22 |
| - for (var i=0; i<data.objects.length; i++) { |
23 |
| - var obj = data.objects[i]; |
24 |
| - var url = data.urls[i]; |
25 |
| - var obj_data = {}; |
26 |
| - for (var j=0; j<data.fields.length; j++) { |
27 |
| - obj_data[data.fields[j]] = obj[j]; |
| 4 | +(function(){ |
| 5 | + |
| 6 | + var CuriousObjects = (function() { |
| 7 | + function CuriousObject(hash_data, url) { |
| 8 | + this.id = hash_data.id; |
| 9 | + for (var k in hash_data) { |
| 10 | + this[k] = hash_data[k]; |
28 | 11 | }
|
29 |
| - objects.push(new CuriousObject(obj_data, url)); |
| 12 | + this.__url = url; |
30 | 13 | }
|
31 |
| - return objects; |
32 |
| - } |
33 |
| - |
34 |
| - function parse_results(relationships, results, existing_object_dicts) { |
35 |
| - // get objects associated with each subquery. for each subquery, build a |
36 |
| - // hash of ID to object. existing_object_dicts should be an array of dicts, |
37 |
| - // each dict is a mapping of ID to existing objects. if existing objects |
38 |
| - // are specified, will build relationships using existing objects. |
39 | 14 |
|
40 |
| - var objects = []; |
41 |
| - |
42 |
| - for (var i=0; i<results.data.length; i++) { |
43 |
| - var result_objects = parse_objects(results.data[i]); |
44 |
| - var d = {}; |
45 |
| - for (var j=0; j<result_objects.length; j++) { |
46 |
| - if (existing_object_dicts !== undefined && existing_object_dicts !== null && |
47 |
| - existing_object_dicts[i] !== undefined && existing_object_dicts[i] !== null && |
48 |
| - existing_object_dicts[i][result_objects[j].id] !== undefined) { |
49 |
| - d[result_objects[j].id] = existing_object_dicts[i][result_objects[j].id]; |
50 |
| - } |
51 |
| - else { |
52 |
| - d[result_objects[j].id] = result_objects[j]; |
| 15 | + function parse_objects(data) { |
| 16 | + if (data.objects === undefined) { return []; } |
| 17 | + var objects = []; |
| 18 | + for (var i=0; i<data.objects.length; i++) { |
| 19 | + var obj = data.objects[i]; |
| 20 | + var url = data.urls[i]; |
| 21 | + var obj_data = {}; |
| 22 | + for (var j=0; j<data.fields.length; j++) { |
| 23 | + obj_data[data.fields[j]] = obj[j]; |
53 | 24 | }
|
| 25 | + objects.push(new CuriousObject(obj_data, url)); |
54 | 26 | }
|
55 |
| - objects.push(d); |
| 27 | + return objects; |
56 | 28 | }
|
57 | 29 |
|
58 |
| - // for each subquery, add a relationship to results of next subquery, and |
59 |
| - // then a reverse relationship |
60 |
| - for (var i=1; i<results.results.length; i++) { |
61 |
| - var rel = relationships[i]; |
62 |
| - |
63 |
| - var res_tups = results.results[i].objects; |
64 |
| - var join_idx = results.results[i].join_index; |
65 |
| - var join_src = objects[join_idx]; |
66 |
| - var join_obj = objects[i]; |
67 |
| - var rev = relationships[join_idx]; |
68 |
| - |
69 |
| - // add empty replationship |
70 |
| - for (var k in join_src) { join_src[k][rel] = []; } |
71 |
| - for (var k in join_obj) { join_obj[k][rev] = []; } |
72 |
| - |
73 |
| - for (var j=0; j<res_tups.length; j++) { |
74 |
| - var obj_src = res_tups[j]; |
75 |
| - var src = join_src[obj_src[1]]; |
76 |
| - if (obj_src[0]) { |
77 |
| - var obj = join_obj[obj_src[0]]; |
78 |
| - |
79 |
| - // forward relationship from query to next query |
80 |
| - src[rel].push(obj); |
81 |
| - // reverse relationship |
82 |
| - obj[rev].push(src); |
| 30 | + function parse_results(relationships, results, existing_object_dicts) { |
| 31 | + // get objects associated with each subquery. for each subquery, build a |
| 32 | + // hash of ID to object. existing_object_dicts should be an array of dicts, |
| 33 | + // each dict is a mapping of ID to existing objects. if existing objects |
| 34 | + // are specified, will build relationships using existing objects. |
| 35 | + |
| 36 | + var objects = []; |
| 37 | + |
| 38 | + for (var i=0; i<results.data.length; i++) { |
| 39 | + var result_objects = parse_objects(results.data[i]); |
| 40 | + var d = {}; |
| 41 | + for (var j=0; j<result_objects.length; j++) { |
| 42 | + if (existing_object_dicts !== undefined && existing_object_dicts !== null && |
| 43 | + existing_object_dicts[i] !== undefined && existing_object_dicts[i] !== null && |
| 44 | + existing_object_dicts[i][result_objects[j].id] !== undefined) { |
| 45 | + d[result_objects[j].id] = existing_object_dicts[i][result_objects[j].id]; |
| 46 | + } |
| 47 | + else { |
| 48 | + d[result_objects[j].id] = result_objects[j]; |
| 49 | + } |
83 | 50 | }
|
| 51 | + objects.push(d); |
84 | 52 | }
|
85 |
| - } |
86 | 53 |
|
87 |
| - return objects; |
88 |
| - } |
| 54 | + // for each subquery, add a relationship to results of next subquery, and |
| 55 | + // then a reverse relationship |
| 56 | + for (var i=1; i<results.results.length; i++) { |
| 57 | + var rel = relationships[i]; |
| 58 | + |
| 59 | + var res_tups = results.results[i].objects; |
| 60 | + var join_idx = results.results[i].join_index; |
| 61 | + var join_src = objects[join_idx]; |
| 62 | + var join_obj = objects[i]; |
| 63 | + var rev = relationships[join_idx]; |
| 64 | + |
| 65 | + // add empty replationship |
| 66 | + for (var k in join_src) { join_src[k][rel] = []; } |
| 67 | + for (var k in join_obj) { join_obj[k][rev] = []; } |
| 68 | + |
| 69 | + for (var j=0; j<res_tups.length; j++) { |
| 70 | + var obj_src = res_tups[j]; |
| 71 | + var src = join_src[obj_src[1]]; |
| 72 | + if (obj_src[0]) { |
| 73 | + var obj = join_obj[obj_src[0]]; |
| 74 | + |
| 75 | + // forward relationship from query to next query |
| 76 | + src[rel].push(obj); |
| 77 | + // reverse relationship |
| 78 | + obj[rev].push(src); |
| 79 | + } |
| 80 | + } |
| 81 | + } |
89 | 82 |
|
90 |
| - function dict_to_array(d) { |
91 |
| - var r = []; |
92 |
| - for (var k in d) { r.push(d[k]); } |
93 |
| - return r; |
94 |
| - } |
| 83 | + return objects; |
| 84 | + } |
95 | 85 |
|
96 |
| - function array_to_dict(a) { |
97 |
| - var d = {}; |
98 |
| - for (var i=0; i<a.length; i++) { |
99 |
| - d[a[i].id] = a[i]; |
| 86 | + function dict_to_array(d) { |
| 87 | + var r = []; |
| 88 | + for (var k in d) { r.push(d[k]); } |
| 89 | + return r; |
100 | 90 | }
|
101 |
| - return d; |
102 |
| - } |
103 |
| - |
104 |
| - function id_list(objects) { |
105 |
| - var ids = []; |
106 |
| - for (var i=0; i<objects.length; i++) { |
107 |
| - if (ids.indexOf(objects[i].id) < 0) { |
108 |
| - ids.push(objects[i].id); |
| 91 | + |
| 92 | + function array_to_dict(a) { |
| 93 | + var d = {}; |
| 94 | + for (var i=0; i<a.length; i++) { |
| 95 | + d[a[i].id] = a[i]; |
109 | 96 | }
|
| 97 | + return d; |
110 | 98 | }
|
111 |
| - return ids; |
112 |
| - } |
113 |
| - |
114 |
| - function id_str(objects) { |
115 |
| - var ids = id_list(objects); |
116 |
| - if (ids.length === 0) { return null; } |
117 |
| - return ids.join(','); |
118 |
| - } |
119 |
| - |
120 |
| - return { |
121 |
| - parse: parse_results, |
122 |
| - d2a: dict_to_array, |
123 |
| - a2d: array_to_dict, |
124 |
| - id_list: id_list, |
125 |
| - id_str: id_str |
126 |
| - } |
127 |
| - |
128 |
| -}()); |
129 |
| - |
130 |
| - |
131 |
| -// Helper for making a Curious query and getting back parsed objects. Use with |
132 |
| -// angular $http compatible HTTP request facilities (e.g. jQuery?) |
133 |
| - |
134 |
| -ex.CuriousQ = function(curious_url, http, node_requests, ns) { |
135 |
| - if (!ns && typeof window !== 'undefined') { ns = window; } |
136 |
| - |
137 |
| - function __get(q, params, relationships, existing_object_arrays, cb) { |
138 |
| - console.log(q); |
139 |
| - |
140 |
| - var existing_object_dicts = undefined; |
141 |
| - if (existing_object_arrays) { |
142 |
| - existing_object_dicts = []; |
143 |
| - for (var i=0; i<existing_object_arrays.length; i++) { |
144 |
| - var data_array = existing_object_arrays[i]; |
145 |
| - if (data_array) { |
146 |
| - existing_object_dicts.push(ns.CuriousObjects.a2d(data_array)); |
147 |
| - } |
148 |
| - else { |
149 |
| - existing_object_dicts.push(null); |
| 99 | + |
| 100 | + function id_list(objects) { |
| 101 | + var ids = []; |
| 102 | + for (var i=0; i<objects.length; i++) { |
| 103 | + if (ids.indexOf(objects[i].id) < 0) { |
| 104 | + ids.push(objects[i].id); |
150 | 105 | }
|
151 | 106 | }
|
| 107 | + return ids; |
152 | 108 | }
|
153 | 109 |
|
154 |
| - var args = {d: 1, fk: 0, q: q}; |
155 |
| - var overwrite_args = {x: 0}; |
| 110 | + function id_str(objects) { |
| 111 | + var ids = id_list(objects); |
| 112 | + if (ids.length === 0) { return null; } |
| 113 | + return ids.join(','); |
| 114 | + } |
156 | 115 |
|
157 |
| - if (params) { |
158 |
| - for (var k in params) { |
159 |
| - if (args[k] === undefined) { args[k] = params[k]; } |
160 |
| - } |
| 116 | + return { |
| 117 | + parse: parse_results, |
| 118 | + d2a: dict_to_array, |
| 119 | + a2d: array_to_dict, |
| 120 | + id_list: id_list, |
| 121 | + id_str: id_str |
161 | 122 | }
|
162 |
| - for (var k in overwrite_args) { |
163 |
| - if (args[k] === undefined) { args[k] = overwrite_args[k]; } |
| 123 | + |
| 124 | + }()); |
| 125 | + |
| 126 | + |
| 127 | + // Helper for making a Curious query and getting back parsed objects. Use with |
| 128 | + // angular $http compatible HTTP request facilities (e.g. jQuery?) |
| 129 | + |
| 130 | + var CuriousQ = function(curious_url, http) { |
| 131 | + |
| 132 | + function __get(q, params, relationships, existing_object_arrays, cb) { |
| 133 | + console.log(q); |
| 134 | + |
| 135 | + var existing_object_dicts = undefined; |
| 136 | + if (existing_object_arrays) { |
| 137 | + existing_object_dicts = []; |
| 138 | + for (var i=0; i<existing_object_arrays.length; i++) { |
| 139 | + var data_array = existing_object_arrays[i]; |
| 140 | + if (data_array) { |
| 141 | + existing_object_dicts.push(CuriousObjects.a2d(data_array)); |
| 142 | + } |
| 143 | + else { |
| 144 | + existing_object_dicts.push(null); |
| 145 | + } |
| 146 | + } |
| 147 | + } |
| 148 | + |
| 149 | + var args = {d: 1, fk: 0, q: q}; |
| 150 | + var overwrite_args = {x: 0}; |
| 151 | + |
| 152 | + if (params) { |
| 153 | + for (var k in params) { |
| 154 | + if (args[k] === undefined) { args[k] = params[k]; } |
| 155 | + } |
| 156 | + } |
| 157 | + for (var k in overwrite_args) { |
| 158 | + if (args[k] === undefined) { args[k] = overwrite_args[k]; } |
| 159 | + } |
| 160 | + |
| 161 | + var post_cb = function(resp) { |
| 162 | + var objects = CuriousObjects.parse(relationships, resp.result, existing_object_dicts); |
| 163 | + for (var i=0; i<objects.length; i++) { objects[i] = CuriousObjects.d2a(objects[i]); } |
| 164 | + // console.log(objects); |
| 165 | + cb(objects); |
| 166 | + }; |
| 167 | + |
| 168 | + http.post(curious_url, args).success(post_cb); |
164 | 169 | }
|
165 | 170 |
|
166 |
| - var post_cb = function(resp) { |
167 |
| - var objects = ns.CuriousObjects.parse(relationships, resp.result, existing_object_dicts); |
168 |
| - for (var i=0; i<objects.length; i++) { objects[i] = ns.CuriousObjects.d2a(objects[i]); } |
169 |
| - // console.log(objects); |
170 |
| - cb(objects); |
171 |
| - }; |
172 |
| - |
173 |
| - if (node_requests) { |
174 |
| - http.post({url: curious_url, body: JSON.stringify(args)}, function(error, response, body) { |
175 |
| - var resp = JSON.parse(body); |
176 |
| - post_cb(resp); |
177 |
| - }); |
| 171 | + function get(q, relationships, cb, params) { __get(q, params, relationships, null, cb); } |
| 172 | + function get_with_objs(q, relationships, existing_object_arrays, cb, params) { |
| 173 | + __get(q, params, relationships, existing_object_arrays, cb); |
178 | 174 | }
|
179 |
| - else { |
180 |
| - http.post(curious_url, args).success(post_cb); |
| 175 | + function get_with_start(q, relationships, starting_objects, cb, params) { |
| 176 | + var existing_object_arrays = []; |
| 177 | + for (var i=0; i<relationships.length; i++) { |
| 178 | + existing_object_arrays.push(null); |
| 179 | + } |
| 180 | + existing_object_arrays[0] = starting_objects; |
| 181 | + __get(q, params, relationships, existing_object_arrays, cb); |
181 | 182 | }
|
182 |
| - } |
183 |
| - |
184 |
| - function get(q, relationships, cb, params) { __get(q, params, relationships, null, cb); } |
185 |
| - function get_with_objs(q, relationships, existing_object_arrays, cb, params) { |
186 |
| - __get(q, params, relationships, existing_object_arrays, cb); |
187 |
| - } |
188 |
| - function get_with_start(q, relationships, starting_objects, cb, params) { |
189 |
| - var existing_object_arrays = []; |
190 |
| - for (var i=0; i<relationships.length; i++) { |
191 |
| - existing_object_arrays.push(null); |
| 183 | + |
| 184 | + return { |
| 185 | + get: get, |
| 186 | + get_with_objs: get_with_objs, |
| 187 | + get_with_start: get_with_start |
192 | 188 | }
|
193 |
| - existing_object_arrays[0] = starting_objects; |
194 |
| - __get(q, params, relationships, existing_object_arrays, cb); |
195 |
| - } |
196 |
| - |
197 |
| - return { |
198 |
| - get: get, |
199 |
| - get_with_objs: get_with_objs, |
200 |
| - get_with_start: get_with_start |
201 |
| - } |
202 |
| -}; |
| 189 | + }; |
| 190 | + |
| 191 | + var ex = undefined; |
| 192 | + if (typeof window !== 'undefined') { ex = window; } |
| 193 | + else if (typeof exports !== 'undefined' && exports) { ex = exports; } |
| 194 | + ex.CuriousQ = CuriousQ; |
| 195 | + ex.CuriousObjects = CuriousObjects; |
| 196 | + |
| 197 | +})(); |
0 commit comments