jsonsql
/* * JsonSQL var _f1_obj = jsonsql.query("select id,mc,fid from json where (fid==475 && id==875 || fid==475)", json); */ var jsonsql = { query: function (sql, json) { var returnfields = sql.match(/^(select)\s+([a-z0-9_\,\.\s\*]+)\s+from\s+([a-z0-9_\.]+)(?: where\s+\((.+)\))?\s*(?:order\sby\s+([a-z0-9_\,]+))?\s*(asc|desc|ascnum|descnum)?\s*(?:limit\s+([0-9_\,]+))?/i); var ops = { fields: returnfields[2].replace(' ', '').split(','), from: returnfields[3].replace(' ', ''), where: (returnfields[4] == undefined) ? "true" : returnfields[4], orderby: (returnfields[5] == undefined) ? [] : returnfields[5].replace(' ', '').split(','), order: (returnfields[6] == undefined) ? "asc" : returnfields[6], limit: (returnfields[7] == undefined) ? [] : returnfields[7].replace(' ', '').split(',') }; return this.parse(json, ops); }, parse: function (json, ops) { var o = { fields: ["*"], from: "json", where: "", orderby: [], order: "asc", limit: [] }; for (i in ops) o[i] = ops[i]; var result = []; result = this.returnFilter(json, o); result = this.returnOrderBy(result, o.orderby, o.order); result = this.returnLimit(result, o.limit); return result; }, returnFilter: function (json, jsonsql_o) { var jsonsql_scope = eval(jsonsql_o.from); var jsonsql_result = []; var jsonsql_rc = 0; if (jsonsql_o.where == "") jsonsql_o.where = "true"; for (var jsonsql_i in jsonsql_scope) { with (jsonsql_scope[jsonsql_i]) { if (eval(jsonsql_o.where)) { jsonsql_result[jsonsql_rc++] = this.returnFields(jsonsql_scope[jsonsql_i], jsonsql_o.fields); } } } return jsonsql_result; }, returnFields: function (scope, fields) { if (fields.length == 0) fields = ["*"]; if (fields[0] == "*") return scope; var returnobj = {}; for (var i in fields) returnobj[fields[i]] = scope[fields[i]]; return returnobj; }, returnOrderBy: function (result, orderby, order) { if (orderby.length == 0) return result; result.sort(function (a, b) { switch (order.toLowerCase()) { case "desc": return (eval('a.' + orderby[0] + ' < b.' + orderby[0])) ? 1 : -1; case "asc": return (eval('a.' + orderby[0] + ' > b.' + orderby[0])) ? 1 : -1; case "descnum": return (eval('a.' + orderby[0] + ' - b.' + orderby[0])); case "ascnum": return (eval('b.' + orderby[0] + ' - a.' + orderby[0])); } }); return result; }, returnLimit: function (result, limit) { switch (limit.length) { case 0: return result; case 1: return result.splice(0, limit[0]); case 2: return result.splice(limit[0] - 1, limit[1]); } } };