def build(specification: Specification = None) -> Optional[Collection]: if specification is None: return None elif isinstance(specification, AndSpecification): return { "$and": [ MongoSpecificationBuilder.build(spec) for spec in specification.to_collection() ] } elif isinstance(specification, OrSpecification): return { "$or": [ MongoSpecificationBuilder.build(spec) for spec in specification.to_collection() ] } elif isinstance(specification, InSpecification): return {specification.field: {"$in": specification.value}} elif isinstance(specification, EqualsSpecification): return {specification.field: {"$eq": specification.value}} elif isinstance(specification, LessThanSpecification): return {specification.field: {"$lt": specification.value}} elif isinstance(specification, LessThanEqualSpecification): return {specification.field: {"$lte": specification.value}} elif isinstance(specification, GreaterThanSpecification): return {specification.field: {"$gt": specification.value}} elif isinstance(specification, GreaterThanEqualSpecification): return {specification.field: {"$gte": specification.value}} elif isinstance(specification, RegexStringMatchSpecification): return { specification.field: { "$regex": f".*{re.escape(specification.value)}.*" } } elif isinstance(specification.to_collection(), dict): return { "$and": [{ key: { "$eq": value } } for key, value in dict(specification.to_collection()).items()] } raise SpecificationNotMappedToMongo( f"Specification '{specification}' not mapped to Mongo query.")
def build(specification: Specification = None) -> Optional[Union[Collection, Q]]: if specification is None: return None elif isinstance(specification, AndSpecification): return reduce( lambda x, y: x & y, [ DjangoOrmSpecificationBuilder.create_q( DjangoOrmSpecificationBuilder.build(spec) ) for spec in specification.to_collection() ], ) elif isinstance(specification, OrSpecification): return reduce( lambda x, y: x | y, [ DjangoOrmSpecificationBuilder.create_q( DjangoOrmSpecificationBuilder.build(spec) ) for spec in specification.to_collection() ], ) elif isinstance(specification, InSpecification): return {f"{specification.field}__in": specification.value} elif isinstance(specification, EqualsSpecification): return {specification.field: specification.value} elif isinstance(specification, LessThanSpecification): return {f"{specification.field}__lt": specification.value} elif isinstance(specification, LessThanEqualSpecification): return {f"{specification.field}__lte": specification.value} elif isinstance(specification, GreaterThanSpecification): return {f"{specification.field}__gt": specification.value} elif isinstance(specification, GreaterThanEqualSpecification): return {f"{specification.field}__gte": specification.value} elif isinstance(specification, RegexStringMatchSpecification): return { f"{specification.field}__regex": rf".*{re.escape(specification.value)}.*" } elif isinstance(specification.to_collection(), dict): return specification.to_collection() raise SpecificationNotMappedToDjangoOrm( f"Specification '{specification}' not mapped to Django Orm query." )
def build(specification: Specification = None) -> Optional[Collection]: if specification is None: return None elif isinstance(specification, OrSpecification): return [ SqlAlchemyOrmSpecificationBuilder.build(spec) for spec in specification.to_collection() ] elif isinstance(specification, AndSpecification): return { k: v for spec in specification.to_collection() if (i := SqlAlchemyOrmSpecificationBuilder.build(spec)) for k, v in dict(i).items() if isinstance(i, dict) } elif isinstance(specification, EqualsSpecification): return {specification.field: specification.value} elif isinstance(specification.to_collection(), dict): return specification.to_collection() raise SpecificationNotMappedToSqlAlchemyOrm( f"Specification '{specification}' not mapped to SqlAlchemy Orm query." )