gpt4 book ai didi

javascript - 如何从 SQL where 子句创建一个 JavaScript 函数,以将其作为谓词传递给 JavaScript 数组的过滤函数?

转载 作者:行者123 更新时间:2023-12-04 04:32:12 25 4
gpt4 key购买 nike

设想:

我有一个基于 JavaScript 的应用程序,它使用 网页sql 存储其数据的数据库

我开发了一个自定义实体集。

它有一个过滤器方法,它接受包含 sql 查询的字符串。

例如: People.filter("Name = 'Test' and ...")

我的实体集的行为有两种模式,内存 & 非内存

InMemory: filter 方法将过滤内存中的源数组,无需往返 db。

NonInMemory:过滤器方法将使用新过滤器再次从 db 读取源。

为了使开发更容易,我想让开发人员对这些行为的差异透明化。

而且我想让我的过滤方法在两种模式下都有效( InMemory & NonInMemory )使用相同的代码。

我有数千个这样的过滤器,它们在 .net 和 sql lite 中运行良好。

我想尽可能简单地将它们迁移到 JavaScript 和 web sql。

我的问题:

有没有可以处理这种情况的 JavaScript 库?

哪个接受 Sql 查询并为我创建一个 JavaScript 函数作为谓词?

谢谢

最佳答案

我实际上正在开发一个基于 sql 的 javascript 项目,该项目使用 where 子句的生成函数。一部分是将SQL语法差异转换为可行的JS(AND>&&等),另一部分是为子句提供SQL功能。项目不完整,没有100%甚至80%的目标兼容性,只是为了让最有用的 sql 特性和语法在 javascript 中工作。下面的 where-function 创建例程不是解析器或复杂的 AST 构建器,只是一个半天真的但快速且足够的字符串转换器。

它现在支持大量的 where-ish SQL,并且应该很容易扩展自己;这里没有很多黑魔法。

生成的函数非常适合 filter() 对象数组。

这是项目相关部分的一个端口,它非常大,where-clause builder:

// cache RegExps pseudo-globally for much better perf in query routine in webkit:
var rxOr = /\sOR\s/g,
rxAnd = /\sAND\s/g,
rxIn = /\sIN\(([\w\.\,\s]+)\)/g,
rxSep = /\s*\,\s*/,
rxDoubleEqual = /([^=])=([^=])/g,
asRx = /\s+AS\s+/,
eqRx = /(\w+)=/;
var fCache = {}; //

var SQLREPS = [
[/([^=])=([^=])/g, "$1==$2"],
[/\sAND\s/g, ") && ("],
[/\sOR\s/g, ") || ("],
[/\bUCASE\(/g, " ''.toUpperCase.call("],
[/\bLCASE\(/g, " ''.toLowerCase.call("],
[/\bUPPER\(/g, " ''.toUpperCase.call("],
[/\bLOWER\(/g, " ''.toLowerCase.call("],
[/\bINSTR\(/g, " 1+''.indexOf.call("],
[/\bCONCAT\(/g, " ''.concat("],
[/\bLTRIM\(/g, " ''.trimLeft.call("],
[/\bRTRIM\(/g, " ''.trimRight.call("],
[/\bTRIM\(/g, " ''.trim.call("],
[/\bQUOTE\(/g, " JSON.stringify("],
[/\bSPACE\(/g, " ' '.repeat("],
[/\bREPLACE\(/g, " (function(s,n,r){return s.split(n).join('r');})("],
[/\bRPAD\(/g, " (function(s,n,p){return (s+p.repeat(n)).slice(0,n)})("],
[/\bASCII\(/g, " ''.charCodeAt.call("],
[/\bBIN\(/g, " ''.charCodeAt.call("],
[/\bLENGTH\(/g, " [].push.call("],
[/\bSUBSTRING_INDEX\(/g, "(function(s,n,p){s=s.split(n);s=p>0?s.slice(0,p):s.slice(p);return s.join(n);})("],
[/\bSUBSTRING\(/g, '(function(a,b,c){return b=[b>0?b-1:b],"".substr.apply(a,arguments.length==3?b.concat(c):b)})('],
[/\bSUBSTR\(/g, '(function(a,b,c){return b=[b>0?b-1:b],"".substr.apply(a,arguments.length==3?b.concat(c):b)})('],
[/\bMID\(/g, '(function(a,b,c){return b=[b>0?b-1:b],"".substr.apply(a,arguments.length==3?b.concat(c):b)})('],
[/\bLOCATE\(/g, " (function(t,s,n){return 1+s.indexOf(t,n)})("],
[/\bPOSITION\(/g, " (function(t,s,n){return 1+s.indexOf(t,n)})("],
[/\bFIND_IN_SET\(/g, "(function(s,l){return l.split(',').indexOf(s)+1})("],
[/\bREVERSE\(/g, " (function(s){return s.split('').reverse().join('');})("],
[/\bLEFT\(/g, "(function(s,n){return s.slice(0,n)})("],
[/ NOT /g, " ! "]
];



function rewrite(s) {

var os = s;

SQLREPS.forEach(function(a) {
s = s.replace(a[0], a[1]);
});

s = s.replace(rxIn, function repIn(j, a) {
return " in { " + a.split(rxSep).map(function mapIn(a) {
return JSON.stringify(a)
}).join(":1,") + ":1} ";
return a;
});

return s;
}

function Function2(a, b, blnNoRewrite) {
var c;
if (!b.match(/return/)) {
b = "return " + b;
}
if (c = fCache[a + b]) {
return c;
}
return fCache[a + b] = Function(a, blnNoRewrite ? b : rewrite(b));
}


function sql(term) {
return Function2("me,index,all", "return (" + rewrite(term) + ");");
}




//example strings and resulting functions:
sql(" UPPER( me.gender ) =='F' "); // function anonymous(me,index,all){return(''.toUpperCase.call(me.gender)=='F');}

sql(" me.gender IN(M,F,O)"); // function anonymous(me,index,all){return(me.gender in{"M":1,"F":1,"O":1});}

sql("(me.name> 'j' AND me.age > 50) && NOT me.inActive "); // function anonymous(me,index,all){return((me.name>'j')&&(me.age>50)&&!me.inActive);}

大多数 js sql 库在 WHERE 功能上都有些吝啬,并且难以扩展,希望您和其他人可以从中获得一些使用或启发。作者认为它是公共(public)领域,我。

关于javascript - 如何从 SQL where 子句创建一个 JavaScript 函数,以将其作为谓词传递给 JavaScript 数组的过滤函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20403403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com