|
1 | 1 | import os, time |
2 | 2 |
|
3 | 3 | from python_helper import Constant as c |
4 | | -from python_helper import SettingHelper, EnvironmentHelper, ObjectHelper, StringHelper, log, Method, Function |
| 4 | +from python_helper import SettingHelper, EnvironmentHelper, ObjectHelper, StringHelper, log, Method, Function, ReflectionHelper |
5 | 5 |
|
6 | 6 | import sqlalchemy |
7 | 7 | from sqlalchemy import create_engine, exists, select |
@@ -210,6 +210,31 @@ def isNeitherNoneNorBlank(thing): |
210 | 210 | def isNoneOrBlank(thing): |
211 | 211 | return ObjectHelper.isNone(thing) or StringHelper.isBlank(str(thing)) |
212 | 212 |
|
| 213 | +def getUnitCondition(query: dict, modelClass): |
| 214 | + return { |
| 215 | + k: v |
| 216 | + for k, v in query.items() |
| 217 | + if (not k.endswith(LIST)) and ObjectHelper.isNotEmpty(v) |
| 218 | + } |
| 219 | + |
| 220 | +def getCollectionCondition(query: dict, modelClass, additionalCondition=None): |
| 221 | + condition = True |
| 222 | + for key in [ |
| 223 | + k |
| 224 | + for k, v in query.items() |
| 225 | + if k.endswith(LIST) and ObjectHelper.isNotEmpty(v) |
| 226 | + ]: |
| 227 | + condition = and_( |
| 228 | + condition, |
| 229 | + ReflectionHelper.getAttributeOrMethod(modelClass, k.replace(LIST, c.BLANK)).in_(v) |
| 230 | + ) |
| 231 | + if ObjectHelper.isNotNone(additionalCondition): |
| 232 | + condition = and_( |
| 233 | + additionalCondition, |
| 234 | + condition |
| 235 | + ) |
| 236 | + return condition |
| 237 | + |
213 | 238 |
|
214 | 239 | class SqlAlchemyProxy: |
215 | 240 |
|
@@ -420,6 +445,18 @@ def reloadContextFromBackup(self): |
420 | 445 | if instance not in self.session.dirty: |
421 | 446 | self.session.dirty.add(instance) |
422 | 447 |
|
| 448 | + @Method |
| 449 | + def getQueryFilter(self, query, modelClass, additionalCondition=None): |
| 450 | + return self.session.query(modelClass).filter( |
| 451 | + getCollectionCondition( |
| 452 | + query, |
| 453 | + modelClass, |
| 454 | + additionalCondition = additionalCondition |
| 455 | + ) |
| 456 | + ).filter_by( |
| 457 | + **getUnitCondition(query, modelClass) |
| 458 | + ) |
| 459 | + |
423 | 460 | @Method |
424 | 461 | def save(self, instance): |
425 | 462 | self.load(instance) |
@@ -533,15 +570,28 @@ def findAllByStatusInAndCommit(self, statusList, modelClass): |
533 | 570 | return self.load(instanceList) |
534 | 571 |
|
535 | 572 | @Method |
536 | | - def existsByQueryAndCommit(self, query, modelClass): |
537 | | - exists = self.session.query(literal(True)).filter(self.session.query(modelClass).filter_by(**query).exists()).scalar() |
| 573 | + def existsByQueryAndCommit(self, query, modelClass, additionalCondition=None): |
| 574 | + exists = self.session.query( |
| 575 | + literal(True) |
| 576 | + ).filter( |
| 577 | + self.getQueryFilter( |
| 578 | + query, |
| 579 | + modelClass, |
| 580 | + additionalCondition = additionalCondition |
| 581 | + ).exists() |
| 582 | + ).scalar() |
538 | 583 | self.session.commit() |
539 | 584 | return exists |
540 | 585 |
|
541 | 586 | @Method |
542 | | - def findAllByQueryAndCommit(self, query, modelClass): |
| 587 | + def findAllByQueryAndCommit(self, query, modelClass, additionalCondition=None): |
| 588 | + instanceList = [] |
543 | 589 | if ObjectHelper.isNotNone(query): |
544 | | - instanceList = self.session.query(modelClass).filter_by(**{k: v for k, v in query.items() if ObjectHelper.isNotNone(v)}).all() |
| 590 | + instanceList = self.getQueryFilter( |
| 591 | + query, |
| 592 | + modelClass, |
| 593 | + additionalCondition = additionalCondition |
| 594 | + ).all() |
545 | 595 | self.session.commit() |
546 | 596 | return self.load(instanceList) |
547 | 597 |
|
|
0 commit comments