2019-05-29 18:02:55 +02:00
|
|
|
from sqlalchemy.sql import desc, func
|
2016-09-10 16:52:46 +02:00
|
|
|
|
2019-05-29 18:02:55 +02:00
|
|
|
from models import Location, Order, OrderItem, Product, User
|
2016-09-10 16:52:46 +02:00
|
|
|
|
2016-09-10 23:01:13 +02:00
|
|
|
|
2019-05-29 18:02:55 +02:00
|
|
|
class FatModel:
|
2016-09-10 23:01:13 +02:00
|
|
|
@classmethod
|
|
|
|
def all(cls):
|
|
|
|
return cls.query.all()
|
2016-09-10 16:52:46 +02:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def amount(cls):
|
|
|
|
return cls.query.count()
|
|
|
|
|
|
|
|
|
2019-05-29 18:02:55 +02:00
|
|
|
class FatLocation(Location, FatModel):
|
|
|
|
pass
|
2016-09-10 23:01:13 +02:00
|
|
|
|
|
|
|
|
|
|
|
class FatOrder(Order, FatModel):
|
|
|
|
|
|
|
|
# It's hard to add the unique user constraint,
|
|
|
|
# as DISTINCT seems to apply after a GROUP BY and aggregate
|
|
|
|
# So DISTINCT ... count(user_id) ... will count all users,
|
|
|
|
# even if they get reduced by the disctinct afterwards.
|
|
|
|
@classmethod
|
|
|
|
def items_per_order(cls):
|
|
|
|
return Order.query.\
|
|
|
|
join(OrderItem).\
|
|
|
|
group_by(Order.id).\
|
|
|
|
with_entities(Order.id, func.count(OrderItem.user_id).label('total'))
|
2016-09-10 16:52:46 +02:00
|
|
|
|
|
|
|
|
2019-05-29 18:02:55 +02:00
|
|
|
class FatUser(User, FatModel):
|
|
|
|
pass
|
2016-09-10 16:52:46 +02:00
|
|
|
|
|
|
|
|
2019-05-29 18:02:55 +02:00
|
|
|
class FatOrderItem(OrderItem, FatModel):
|
|
|
|
pass
|
2016-09-10 16:52:46 +02:00
|
|
|
|
|
|
|
|
2016-09-10 23:01:13 +02:00
|
|
|
class FatProduct(Product, FatModel):
|
|
|
|
@classmethod
|
|
|
|
def top4(cls):
|
|
|
|
top4 = OrderItem.query\
|
|
|
|
.join(Product)\
|
|
|
|
.join(Location)\
|
|
|
|
.group_by(Product.id)\
|
|
|
|
.with_entities(Product.name,
|
|
|
|
Location.name,
|
|
|
|
func.count(Product.id).label('count')
|
|
|
|
)\
|
|
|
|
.order_by(desc('count'))\
|
|
|
|
.limit(4)
|
|
|
|
for top in top4:
|
2019-05-29 18:02:55 +02:00
|
|
|
print(top)
|