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]);
        }
    }

};

 

posted @ 2013-04-11 17:37  一千零一夜  阅读(2239)  评论(0编辑  收藏  举报