Skip to content

Commit 1dab66c

Browse files
committed
Fix bugs: tag trim.
1 parent d185614 commit 1dab66c

File tree

5 files changed

+138
-14
lines changed

5 files changed

+138
-14
lines changed

example.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ def main():
4242
# sql, param_list = mm.update("testSet", {'category': "banana", "price": 500, "name":"a"})
4343
# print(sql, param_list)
4444

45-
sql, param_list = mm.select("testStringReplace", {'id':1, 'date':"20241204"})
45+
# sql, param_list = mm.select("testStringReplace", {'id':1, 'date':"20241204"})
46+
# print(sql, param_list)
47+
48+
sql, param_list = mm.insert("testInsertSelective", {'name': 'Candy', 'category': "C", 'price':500})
4649
print(sql, param_list)
4750

4851
# cur.execute(sql, param_list, multi=True)

example_profile.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from flask import Flask
2+
import mysql.connector
3+
from mybatis import Mybatis
4+
import json
5+
6+
app = Flask(__name__)
7+
8+
9+
# 连接到 MySQL 数据库
10+
conn = mysql.connector.connect(
11+
host="localhost", # MySQL 主机地址
12+
user="mybatis", # MySQL 用户名
13+
password="mybatis", # MySQL 密码
14+
database="mybatis" # 需要连接的数据库
15+
)
16+
17+
mb = Mybatis(conn, "mapper", cache_memory_limit=50*1024*1024)
18+
19+
@app.route('/')
20+
def hello():
21+
ret = mb.select_one("testBasic1", {'id':1})
22+
return json.dumps(ret)
23+
24+
25+
def main():
26+
for i in range(100000):
27+
hello()
28+
29+
if __name__ == "__main__":
30+
main()

mapper/test.xml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,30 @@
155155
<select id="testBasic1">
156156
SELECT * from fruits where id=#{id}
157157
</select>
158+
159+
<insert id="testInsertSelective">
160+
insert into fruits
161+
<trim prefix="(" suffix=")" suffixOverrides=",">
162+
<if test="'name' in params">
163+
name,
164+
</if>
165+
<if test="'category' in params">
166+
category,
167+
</if>
168+
<if test="'price' in params">
169+
price,
170+
</if>
171+
</trim>
172+
<trim prefix="values (" suffix=")" suffixOverrides=",">
173+
<if test="'name' in params">
174+
#{name},
175+
</if>
176+
<if test="'category' in params">
177+
#{category},
178+
</if>
179+
<if test="'price' in params">
180+
#{price},
181+
</if>
182+
</trim>
183+
</insert>
158184
</mapper>

mybatis/mapper_manager.py

Lines changed: 67 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,53 @@ def read_mapper_xml_file(self, mapper_xml_file_path):
2222
self.id_2_element_map[child_id] = child
2323

2424

25+
# @staticmethod
26+
# def _trim_prefix(s : str, prefixes : Set[str]):
27+
# l = [term.strip() for term in s.split()]
28+
# idx = 0
29+
# for term in l:
30+
# if term in prefixes:
31+
# idx += 1
32+
# continue
33+
# else:
34+
# break
35+
#
36+
# return " ".join(l[idx:])
37+
2538
@staticmethod
26-
def _trim_prefix(s : str, prefixes : Set[str]):
39+
def _trim_prefix(s: str, prefixes: Set[str]):
40+
p = [term[0] for term in sorted([(prefix, len(prefix)) for prefix in prefixes], key=lambda x: x[1], reverse=True)]
2741
l = [term.strip() for term in s.split()]
28-
idx = 0
29-
for term in l:
30-
if term in prefixes:
31-
idx += 1
32-
continue
33-
else:
42+
s = " ".join(l)
43+
while True:
44+
to_break = True
45+
for prefix in p:
46+
if s.startswith(prefix):
47+
s = s[len(prefix):].strip()
48+
to_break = False
49+
break
50+
if to_break:
51+
break
52+
53+
return s.strip()
54+
55+
@staticmethod
56+
def _trim_suffix(s: str, suffixes: Set[str]):
57+
suffixes = [term[0] for term in
58+
sorted([(suffix, len(suffix)) for suffix in suffixes], key=lambda x: x[1], reverse=True)]
59+
l = [term.strip() for term in s.split()]
60+
s = " ".join(l)
61+
while True:
62+
to_break = True
63+
for suffix in suffixes:
64+
if s.endswith(suffix):
65+
s = s[:-1*len(suffix)].strip()
66+
to_break = False
67+
break
68+
if to_break:
3469
break
3570

36-
return " ".join(l[idx:])
71+
return s.strip()
3772

3873
def parse_element(self, element : et.Element, param: dict) -> str:
3974
# print ("++++>", element)
@@ -86,9 +121,23 @@ def parse_element(self, element : et.Element, param: dict) -> str:
86121
else:
87122
return "WHERE " + ' '.join(l[idx:])
88123
elif element.tag == "trim":
89-
prefix = element.attrib['prefix']
90-
prefix_overrides_set = set()
91-
[prefix_overrides_set.add(term.strip()) for term in element.attrib['prefixOverrides'].split("|")]
124+
prefix = ""
125+
if 'prefix' in element.attrib:
126+
prefix = element.attrib['prefix']
127+
128+
suffix = ""
129+
if 'suffix' in element.attrib:
130+
suffix = element.attrib['suffix']
131+
132+
if 'prefixOverrides' in element.attrib:
133+
prefix_overrides_set = set([term.strip() for term in element.attrib['prefixOverrides'].split("|")])
134+
else:
135+
prefix_overrides_set = set()
136+
137+
if 'suffixOverrides' in element.attrib:
138+
suffix_overrides_set = set([term.strip() for term in element.attrib['suffixOverrides'].split("|")])
139+
else:
140+
suffix_overrides_set = set()
92141

93142
ret = ""
94143
if element.text is not None:
@@ -97,8 +146,13 @@ def parse_element(self, element : et.Element, param: dict) -> str:
97146
ret += self.parse_element(child, param)
98147
ret += child.tail
99148

100-
ret = MapperManager._trim_prefix(ret, prefix_overrides_set)
101-
return prefix + " " + ret
149+
if len(prefix_overrides_set) > 0:
150+
ret = MapperManager._trim_prefix(ret, prefix_overrides_set)
151+
152+
if len(suffix_overrides_set) > 0:
153+
ret = MapperManager._trim_suffix(ret, suffix_overrides_set)
154+
155+
return prefix + " " + ret + " " + suffix
102156

103157
elif element.tag == "set":
104158
prefix_overrides_set = set()

test/test_mapper_manager.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ def test_trim():
6565
sql, param_list = mm.select("testTrim", {'names': [1, 2, 3, 4]})
6666
assert sql == "SELECT name, category, price FROM fruits WHERE category = 'apple' OR price = 200 AND (type = 1 OR type= 0)"
6767

68+
def test_trim2():
69+
mm = MapperManager()
70+
mm.read_mapper_xml_file("mapper/test.xml")
71+
72+
sql, param_list = mm.insert("testInsertSelective", {'name': 'Candy', 'category': "C", 'price': 500})
73+
assert sql == "insert into fruits ( name, category, price ) values ( ?, ?, ? )"
74+
assert len(param_list) == 3
75+
assert param_list[0] == "Candy"
76+
assert param_list[1] == 'C'
77+
assert param_list[2] == 500
78+
6879
def test_set():
6980
mm = MapperManager()
7081
mm.read_mapper_xml_file("mapper/test.xml")

0 commit comments

Comments
 (0)