File size: 4,751 Bytes
34b2632
 
 
ea06065
 
34b2632
 
 
 
 
 
 
 
 
ea06065
34b2632
 
 
ea06065
34b2632
 
 
 
 
 
 
ea06065
34b2632
 
 
 
 
 
ea06065
34b2632
 
 
 
ea06065
 
34b2632
ea06065
 
 
 
 
 
34b2632
ea06065
34b2632
ea06065
 
 
 
 
 
 
 
 
34b2632
ea06065
 
 
 
 
 
 
 
 
 
 
 
 
34b2632
ea06065
34b2632
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea06065
 
 
 
 
 
 
34b2632
 
 
 
 
 
 
ea06065
 
34b2632
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
"""

MongoDB Index Creation Script

Author: AI Generated

Created: 2025-11-24 (Fixed for actual schema)

Purpose: Create performance indexes matching actual MongoDB structure

"""

from database import db
from config import settings


def create_all_indexes():
    """

    Create all necessary indexes for optimal performance.

    Based on ACTUAL MongoDB structure from models.txt

    """
    
    print("=" * 60)
    print("🔧 Creating MongoDB Indexes (Corrected Schema)")
    print("=" * 60)
    
    # Payment Collection Indexes
    print("\n📊 Payment Collection:")
    
    # Index for event-specific ticket purchases
    db.payments.create_index(
        [("eventCode", 1), ("status", 1), ("userId", 1)],
        name="idx_payment_event_status_user"
    )
    print("  ✓ Created: idx_payment_event_status_user")
    
    # Index for user RFM calculation
    db.payments.create_index(
        [("userId", 1), ("transactionDate", -1)],
        name="idx_payment_user_date"
    )
    print("  ✓ Created: idx_payment_user_date")
    
    # User Collection Indexes (UserFollows is EMBEDDED)
    print("\n👥 User Collection:")
    
    # Index for finding users who follow a specific event
    # UserFollows is an embedded array, so we use dot notation
    db.users.create_index(
        [("UserFollows.eventCode", 1)],
        name="idx_user_follows_event",
        sparse=True  # Skip documents without UserFollows
    )
    print("  ✓ Created: idx_user_follows_event (embedded array)")
    
    # Index for user status (to filter Active users)
    db.users.create_index(
        [("status", 1)],
        name="idx_user_status"
    )
    print("  ✓ Created: idx_user_status")
    
    # PostSocialMedia Collection Indexes
    print("\n💬 PostSocialMedia Collection:")
    
    # Index for event-specific posts
    db.post_social_media.create_index(
        [("eventCode", 1), ("createdAt", -1)],
        name="idx_post_event_date"
    )
    print("  ✓ Created: idx_post_event_date")
    
    # Index for searching comments (nested in Images.UserCommentPosts)
    # Using wildcard for nested arrays
    db.post_social_media.create_index(
        [("eventCode", 1), ("images.userCommentPosts.commentedAt", -1)],
        name="idx_post_comments",
        sparse=True
    )
    print("  ✓ Created: idx_post_comments (nested array)")
    
    # EventAudienceSegment Collection Indexes
    print("\n🎯 EventAudienceSegment Collection:")
    
    # Index for event owner dashboard
    db.event_audience_segments.create_index(
        [("event_code", 1)],
        name="idx_segment_event"
    )
    print("  ✓ Created: idx_segment_event")
    
    # Index for status filtering
    db.event_audience_segments.create_index(
        [("event_code", 1), ("marketing_content.status", 1)],
        name="idx_segment_event_status"
    )
    print("  ✓ Created: idx_segment_event_status")
    
    # EventSentimentSummary Collection Indexes
    print("\n📊 EventSentimentSummary Collection:")
    
    # Index for event sentiment lookup
    db.event_sentiment_summary.create_index(
        [("event_code", 1), ("last_updated", -1)],
        name="idx_sentiment_event_date"
    )
    print("  ✓ Created: idx_sentiment_event_date")
    
    # SentimentAnalysisResult Collection Indexes
    print("\n💭 SentimentAnalysisResult Collection:")
    
    # Index for event-specific sentiment results
    db.sentiment_results.create_index(
        [("event_code", 1), ("analyzed_at", -1)],
        name="idx_sentiment_result_event_date"
    )
    print("  ✓ Created: idx_sentiment_result_event_date")
    
    # Index for sentiment label filtering
    db.sentiment_results.create_index(
        [("event_code", 1), ("sentiment_label", 1)],
        name="idx_sentiment_event_label"
    )
    print("  ✓ Created: idx_sentiment_event_label")
    
    print("\n" + "=" * 60)
    print("✅ All Indexes Created Successfully!")
    print("=" * 60)
    
    # List all indexes for verification
    print("\n📋 Index Summary:")
    print(f"  Payment: {len(list(db.payments.list_indexes()))} indexes")
    print(f"  User: {len(list(db.users.list_indexes()))} indexes")
    print(f"  PostSocialMedia: {len(list(db.post_social_media.list_indexes()))} indexes")
    print(f"  EventAudienceSegment: {len(list(db.event_audience_segments.list_indexes()))} indexes")
    print(f"  EventSentimentSummary: {len(list(db.event_sentiment_summary.list_indexes()))} indexes")
    print(f"  SentimentAnalysisResult: {len(list(db.sentiment_results.list_indexes()))} indexes")


if __name__ == "__main__":
    create_all_indexes()