输入

{"where": {"number": {"gt": 35},"OR": [{"name1": {"startsWith": "ssss"},"name2": {"not": {"contains":"22"}},"name3": "35"},{"name1": "35"}]}
}

转换代码

注:图中所使用的的函数是lodash的函数

import { concat, isArray, template } from 'lodash';
export class Builder {static generateWhere(condition: object, name?: string, negate?: string) {let arr = [];// key是prisma where条件中的关键词,value值是lodash中模板字符串const kvMap = new Map([['contains', '(<%=negate%>@<%=key%>_ext:{<%=value%>})'],['startsWith', '(<%=negate%>@<%=key%>_ext:{<%=value%>*})'],['equals', '(<%=negate%>@<%=key%>:{<%=value%>})'],['gt', '(<%=negate%>@<%=key%>:[(<%=value%> +inf])'],['lt', '(<%=negate%>@<%=key%>:[-inf (<%=value%>])'],['lte', '(<%=negate%>@<%=key%>:[-inf <%=value%>])'],['gte', '(<%=negate%>@<%=key%>:[<%=value%> +inf])'],['in', '(<%=negate%>@<%=key%>:{<%=value.join("|")%>})'],]);// 使用map简化if else代码for (const [key, value] of Object.entries(condition)) {if (kvMap.has(key)) {const compiled = template(kvMap.get(key));// 编译模板字符串arr.push(compiled({key: name,value: value,negate: negate,}));} else if (key === 'AND') {/// 是AND,就继续递归if (isArray(value)) {if (value.length !== 1) {arr.push('(');}for (const it of value) {arr = concat(arr, this.generateWhere(it));}if (value.length !== 1) {arr.push(')');}} else {arr.push('(');arr = concat(arr, this.generateWhere(value));arr.push(')');}} else if (key === 'OR') {/// 是OR,就继续递归/// 如果是 OR:[{"name1":"222"}]if (isArray(value) && value.length === 1) {arr = concat(arr,this.generateWhere({OR: value[0],}));} else if (isArray(value) && value.length > 1) {for (let i = 0; i < value.length; i++) {arr = concat(arr, this.generateWhere({ OR: value[i] }));}} else if (UtilGroup.isObject(value)) {if (Object.keys(value).length === 1) {arr.push('|');} else {arr.push('|(');}arr = concat(arr, this.generateWhere(value));if (Object.keys(value).length !== 1) {arr.push(')');}}} else if (key === 'not') {/// 是对象,就继续递归if (UtilGroup.isString(value)) {const temp = {};temp[`${name}`] = value;arr = concat(arr, this.generateWhere(temp, undefined, '-'));} else {arr = concat(arr, this.generateWhere(value, name, '-'));}} else if (UtilGroup.isObject(value)) {/// 是对象,就继续递归arr = concat(arr, this.generateWhere(value, key));} else {if (negate) {arr.push(`(${negate}@${key}:{${value}})`);} else {arr.push(`(@${key}:{${value}})`);}}}return arr;}/*** 判断是否是对象* @param value*/static isObject(value: any) {return Object.prototype.toString.call(value) === '[object Object]';}/*** 判断是否是字符串* @param value*/static isString(value: any) {return Object.prototype.toString.call(value) === '[object String]';}
}

调用

const data: string = Builder.generateWhere(params).join('');

输出

(@number:[(35 +inf])|((@name1_ext:{ssss*})(-@name2_ext:{22})(@name3:{35}))|(@name1:{35})

推荐

redis-om
prisma

prisma中where对象转换RedisJson查询字符串相关推荐

  1. 把对象转换成JSON字符串 第二稿支持移动设备

    /*** 导入jackson包 把对象转换成JSON字符串 第二稿 支持移动设备* @param pn* @param request* @return*/@RequestMapping(value ...

  2. Java对象转换成JSON对象/JSON对象转换成JSON字符串/JSON字符串转换成JS对象

    文章目录 后端部分 前端部分 后端部分 Option op = new Option("海淀","hd");//java对象转换json对象 JSONObjec ...

  3. python post json 解析失败_python中json对象转换出错解决方法

    今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串: s={"username":"admin","passwor ...

  4. mybatis中使用mysql的模糊查询字符串拼接(like)

    方法一: <!-- 根据hid,hanme,grade,模糊查询医院信息--> 方法一: List<Hospital> getHospitalLike(@Param(" ...

  5. java把对象转成json_java 把对象 对象转换成json字符串 | 学步园

    publicclassJSONCreateDemoActivity { // 创建以下的JSON对象 publicString createJSONObject() { Gsongson = newG ...

  6. 对List中的对象的模糊查询

    将string和 controlPersonList中的Id和Name作比较. Matcher类的matches()方法是全字段匹配,find()方法是模糊搜搜匹配 @Overridepublic v ...

  7. Nodejs--querystring (URL 查询字符串)

    2019独角兽企业重金招聘Python工程师标准>>> querystring 模块提供了一些实用函数,用于解析与格式化 URL 查询字符串 querystring.parse(st ...

  8. android 中XML和对象转换利器Xstream的使用

    XStream框架: 虽说pull dom dom4j等优秀的xml解析工具使用非常广泛,但对于复杂庞大的数据交互来说,使用它们无疑让你倍加痛苦,你可能大部分精力都放在无聊繁琐的解析和拼装上,如果接口 ...

  9. js中自定义对象、json对象、json字符串、普通js对象 --js学习那本书上的

    4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...

  10. js中自定义对象、json对象、json字符串、普通js对象

    4.7 自定义对象 JS除了内置对象之外,还允许我们程序自己定义属于我们自己的对象,在JS中自定义对象的方式有2种:通过构造器创建对象,通过初始化器创建对象. 4.7.1 构造器创建对象(原生JS对象 ...

最新文章

  1. python库开源网站_开源Python库
  2. Linux下时间戳格式和标准时间格式的转换
  3. linux e32,linux PXE无人值守安装出现 PXE-E32:TFTP OPen timeout的解
  4. 自定义EventSource(三)IncrementingEventCounter
  5. 怎么样解决小交换机引起的路由环路故障?
  6. docker查看容器并运行
  7. 大一计算机论文_计算机二级基础,60集全套视频教程+500习题,送给你参考下
  8. 【xshell】xshell 自动换行设置
  9. 计算机维修与护理论文,计算机维修与维护方面论文选题 计算机维修与维护论文题目怎样定...
  10. Compressor 4.6.1 for Mac(视频转码工具)
  11. HashMap 在 JDK 1.8 中新增的数据结构 – 红黑树
  12. html数字什么字体样式,css字体样式属性有哪些?
  13. nachos中文教程java_Nachos3.4系列-2 Makefile 与Nachos中文教程 【转】
  14. verilog源码积累:ram和axi slaver
  15. 西瓜错时上市销售,提高经济效益的背后是技术支持!
  16. CentOS7挂载NTFS分区步骤
  17. 练习打字速度效果很好的网站(本人亲测)
  18. 中小型项目请求限流设计
  19. MySQL及数据库相关
  20. 广东省佛山市谷歌卫星地图下载

热门文章

  1. Windows影子账户创立
  2. 浅谈车联网与大数据分析
  3. 防火墙——Efficient理论讲解(IPSec4)
  4. 脑子里想的是A,嘴巴上说的是B,实际上做的是C,幻想前景远大的是D,可真正赚钱的恰恰却是E...
  5. 5G核心网技术基础自学系列 | 5G无线网
  6. 链家网爬取深圳租房信息并存入MySQL
  7. 2016年俄罗斯M2M市场达100亿俄罗斯卢布
  8. php代码加nofollow,给WordPress友情链接添加Nofollow方法详解
  9. 技术研究:DOOM3网络模型的演化与网络架构
  10. 几何算法合集(3D)