bookmyservice-mhs / app /models /optimized_projections.py
MukeshKapoor25's picture
refactor(merchant): move address formatting logic to pipeline stage
8d4e4f8
"""
Optimized projection fields for different use cases to reduce data transfer and improve performance.
"""
from datetime import datetime
CURRENT_DATE = datetime.now()
# Minimal fields for list views and search results
MINIMAL_FIELDS = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"average_rating": "$average_rating.value",
"city": 1,
"merchant_category": 1,
"profile_picture": {"$arrayElemAt": ["$display_picture", 0]},
}
# Essential fields for card views
CARD_FIELDS = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"business_url": 1,
"description": 1,
"profile_picture": {"$arrayElemAt": ["$display_picture", 0]},
"average_rating": "$average_rating.value",
"city": 1,
"merchant_category": 1,
"merchant_subcategory": 1,
# Include entire address object (formatted_address fallback handled in pipeline)
"address": 1,
"promotions": 1,
}
# Optimized years_in_business calculation using $dateDiff (MongoDB 5.0+)
YEARS_IN_BUSINESS_OPTIMIZED = {
"$let": {
"vars": {
"years": {"$dateDiff": {"startDate": "$available_from", "endDate": "$$NOW", "unit": "year"}},
"months": {"$dateDiff": {"startDate": "$available_from", "endDate": "$$NOW", "unit": "month"}},
"days": {"$dateDiff": {"startDate": "$available_from", "endDate": "$$NOW", "unit": "day"}}
},
"in": {
"$switch": {
"branches": [
{
"case": {"$gte": ["$$years", 1]},
"then": {"$concat": [{"$toString": "$$years"}, " years in business"]}
},
{
"case": {"$gte": ["$$months", 1]},
"then": {"$concat": [{"$toString": "$$months"}, " months in business"]}
}
],
"default": {"$concat": [{"$toString": "$$days"}, " days in business"]}
}
}
}
}
# Optimized common fields with improved years_in_business calculation
COMMON_FIELDS_OPTIMIZED = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"business_url": 1,
"description": 1,
"display_picture": 1,
"profile_picture": {"$arrayElemAt": ["$display_picture", 0]},
"average_rating": 1,
"city": 1,
"country": 1,
"merchant_category": 1,
"merchant_subcategory": 1,
"address": 1,
"business_hour": 1,
"promotions": 1,
"trending": 1,
"amenities": 1,
"cancellation_policy": 1,
"share_description": 1,
"years_in_business": YEARS_IN_BUSINESS_OPTIMIZED
}
# Fields for detailed merchant view
DETAILED_FIELDS = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"business_url": 1,
"description": 1,
"display_picture": 1,
"profile_picture": {"$arrayElemAt": ["$display_picture", 0]},
"average_rating": 1,
"city": 1,
"country": 1,
"merchant_category": 1,
"merchant_subcategory": 1,
"address": 1,
"business_hour": 1,
"promotions": 1,
"trending": 1,
"amenities": 1,
"cancellation_policy": 1,
"share_description": 1,
"payment_modes": 1,
"contact_info": 1,
"social_media": 1,
"years_in_business": YEARS_IN_BUSINESS_OPTIMIZED
}
# Fields for recommended merchants (lightweight)
RECOMMENDED_FIELDS_OPTIMIZED = {
"_id": 0,
"merchant_id": 1,
"address.formatted_address": 1,
"location_id": 1,
"business_name": 1,
"business_url": 1,
"description": 1,
"business_hour.weekdays": 1, # Only weekdays for quick availability check
"promotions": 1,
"cancellation_policy": 1,
"amenities": 1,
"profile_picture": {"$arrayElemAt": ["$display_picture", 0]},
"average_rating": "$average_rating.value",
"share_description": 1,
"city": 1,
"country": 1,
"merchant_subcategory": 1,
"merchant_category": 1,
"payment_modes": 1
}
# Fields for search results with geospatial data
SEARCH_FIELDS_WITH_GEO = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"business_url": 1,
"description": 1,
"profile_picture": {"$arrayElemAt": ["$display_picture", 0]},
"average_rating": 1,
"city": 1,
"merchant_category": 1,
"merchant_subcategory": 1,
"address": 1,
"promotions": 1,
"distance": {
"$round": [
{
"$multiply": [
{
"$acos": {
"$add": [
{
"$multiply": [
{"$sin": {"$degreesToRadians": {"$arrayElemAt": ["$address.location.coordinates", 1]}}},
{"$sin": {"$degreesToRadians": "$$userLat"}}
]
},
{
"$multiply": [
{"$cos": {"$degreesToRadians": {"$arrayElemAt": ["$address.location.coordinates", 1]}}},
{"$cos": {"$degreesToRadians": "$$userLat"}},
{"$cos": {"$degreesToRadians": {"$subtract": [{"$arrayElemAt": ["$address.location.coordinates", 0]}, "$$userLng"]}}}
]
}
]
}
},
6371000 # Earth's radius in meters
]
},
0
]
}
}
# Fields for catalogue and associate data (minimal for performance)
CATALOGUE_MINIMAL_FIELDS = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"location_id": 1,
"catalogue": {
"$map": {
"input": {"$objectToArray": "$catalogue"},
"as": "cat",
"in": {
"category": "$$cat.k",
"services": {
"$map": {
"input": "$$cat.v",
"as": "service",
"in": {
"service_id": "$$service.service_id",
"service_name": "$$service.service_name",
"price": {"$round": ["$$service.price", 2]},
"currency": "$$service.currency",
"duration": "$$service.duration",
}
}
}
}
}
}
}
ASSOCIATE_MINIMAL_FIELDS = {
"_id": 0,
"merchant_id": 1,
"business_name": 1,
"location_id": 1,
"associates": {
"$map": {
"input": "$associate",
"as": "s",
"in": {
"associate_id": "$$s.associate_id",
"name": "$$s.name",
"role": "$$s.role",
"rating": "$$s.rating",
}
}
}
}
# Performance monitoring fields
PERFORMANCE_FIELDS = {
"_id": 0,
"merchant_id": 1,
"stats.total_bookings": 1,
"stats.response_time": 1,
"average_rating.total_reviews": 1,
"go_live_from": 1,
"last_updated": 1
}