-
Notifications
You must be signed in to change notification settings - Fork 0
/
odata.js
137 lines (110 loc) · 3.68 KB
/
odata.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
var OData = (function () {
// Constructor function
function OData(baseUrl) {
this.baseUrl = baseUrl;
this.statements = [];
}
// Utilities
function endsWith(str, term) {
return str.match(new RegExp(term + '$'));
}
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
function format(format, replacements) {
var formatted = format;
for (var i = 0; i < replacements.length; i++) {
var regexp = new RegExp('\\{' + (i) + '\\}', 'gi');
formatted = formatted.replace(regexp, replacements[i]);
}
return formatted;
};
if (!Array.prototype.filter) {
Array.prototype.filter = function (fun /*, thisp */) {
"use strict";
if (this == null)
throw new TypeError();
var t = Object(this);
var len = t.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var res = [];
var thisp = arguments[1];
for (var i = 0; i < len; i++) {
if (i in t) {
var val = t[i]; // in case fun mutates this
if (fun.call(thisp, val, i, t))
res.push(val);
}
}
return res;
};
}
// Instance methods
OData.prototype.orderby = function (properties) {
var args;
if (isArray(properties)) {
args = properties;
} else {
args = Array.prototype.slice.call(arguments);
}
var orderbyStatements = this.statements.filter(function (item) {
return item.type == 'orderby';
});
// If there is already an orderby statement, augment it with the new arguments
if (orderbyStatements.length > 0) {
var orderbyStatement = orderbyStatements[0];
orderbyStatement.properties = orderbyStatement.properties.concat(args);
} else {
this.statements.push({ type: 'orderby', properties: args });
}
return this;
};
OData.prototype.skip = function (amount) {
this.statements.push({ type: 'skip', amount: amount });
return this;
};
OData.prototype.top = function (amount) {
this.statements.push({ type: 'top', amount: amount });
return this;
};
OData.prototype.get_statements = function () {
return this.statements;
};
OData.prototype.url = function () {
var url = this.baseUrl;
if (!endsWith(url, '\\?')) {
url += '?';
}
for (var i = 0; i < this.statements.length; i++) {
var stmt = this.statements[i];
if (i > 0 && i < this.statements.length) {
url += '&';
}
switch (stmt.type) {
case 'orderby':
url += '$orderby=' + stmt.properties.join(',');
break;
case 'skip':
url += '$skip=' + stmt.amount;
break;
case 'top':
url += '$top=' + stmt.amount;
break;
case 'filter':
url += '$filter=' + stmt.string;
break;
}
}
return url;
};
OData.prototype.filter = function (filterString) {
var args = Array.prototype.slice.call(arguments);
args = args.slice(1);
filterString = format(filterString, args);
var stmt = { type: 'filter', string: filterString };
this.statements.push(stmt);
return this;
};
return OData;
})();