Skip to content

Commit 9d89095

Browse files
committed
Better way to handle client and server side sharing of code
1 parent 8734bb0 commit 9d89095

File tree

2 files changed

+201
-173
lines changed

2 files changed

+201
-173
lines changed

curious.js

+168-173
Original file line numberDiff line numberDiff line change
@@ -1,202 +1,197 @@
11
// Curious client-side JSON parsing
22
//
33

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];
2811
}
29-
objects.push(new CuriousObject(obj_data, url));
12+
this.__url = url;
3013
}
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.
3914

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];
5324
}
25+
objects.push(new CuriousObject(obj_data, url));
5426
}
55-
objects.push(d);
27+
return objects;
5628
}
5729

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+
}
8350
}
51+
objects.push(d);
8452
}
85-
}
8653

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+
}
8982

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+
}
9585

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;
10090
}
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];
10996
}
97+
return d;
11098
}
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);
150105
}
151106
}
107+
return ids;
152108
}
153109

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+
}
156115

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
161122
}
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);
164169
}
165170

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);
178174
}
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);
181182
}
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
192188
}
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

Comments
 (0)