88from .common import BaseCursor , CursorIterator
99from .error import DatabaseError , OperationalError , ProgrammingError , SqlSyntaxError
1010from .result_set import ResultSet
11- from .sql .builder import QueryPlan
11+ from .sql .builder import ExecutionPlan
1212from .sql .parser import SQLParser
1313
1414if TYPE_CHECKING :
@@ -31,7 +31,7 @@ def __init__(self, connection: "Connection", **kwargs) -> None:
3131 self ._kwargs = kwargs
3232 self ._result_set : Optional [ResultSet ] = None
3333 self ._result_set_class = ResultSet
34- self ._current_query_plan : Optional [QueryPlan ] = None
34+ self ._current_execution_plan : Optional [ExecutionPlan ] = None
3535 self ._mongo_cursor : Optional [MongoCursor ] = None
3636 self ._is_closed = False
3737
@@ -78,65 +78,66 @@ def _check_closed(self) -> None:
7878 if self ._is_closed :
7979 raise ProgrammingError ("Cursor is closed" )
8080
81- def _parse_sql (self , sql : str ) -> QueryPlan :
82- """Parse SQL statement and return QueryPlan """
81+ def _parse_sql (self , sql : str ) -> ExecutionPlan :
82+ """Parse SQL statement and return ExecutionPlan """
8383 try :
8484 parser = SQLParser (sql )
85- query_plan = parser .get_query_plan ()
85+ execution_plan = parser .get_execution_plan ()
8686
87- if not query_plan .validate ():
87+ if not execution_plan .validate ():
8888 raise SqlSyntaxError ("Generated query plan is invalid" )
8989
90- return query_plan
90+ return execution_plan
9191
9292 except SqlSyntaxError :
9393 raise
9494 except Exception as e :
9595 _logger .error (f"SQL parsing failed: { e } " )
9696 raise SqlSyntaxError (f"Failed to parse SQL: { e } " )
9797
98- def _execute_query_plan (self , query_plan : QueryPlan ) -> None :
99- """Execute a QueryPlan against MongoDB using db.command"""
98+ def _execute_execution_plan (self , execution_plan : ExecutionPlan ) -> None :
99+ """Execute an ExecutionPlan against MongoDB using db.command"""
100100 try :
101101 # Get database
102- if not query_plan .collection :
102+ if not execution_plan .collection :
103103 raise ProgrammingError ("No collection specified in query" )
104104
105105 db = self .connection .database
106106
107107 # Build MongoDB find command
108- find_command = {"find" : query_plan .collection , "filter" : query_plan .filter_stage or {}}
108+ find_command = {"find" : execution_plan .collection , "filter" : execution_plan .filter_stage or {}}
109109
110- # Convert projection stage from alias mapping to MongoDB format
111- if query_plan .projection_stage :
112- # Convert {"field": "alias"} to {"field": 1} for MongoDB
113- find_command ["projection" ] = {field : 1 for field in query_plan .projection_stage .keys ()}
110+ # Apply projection if specified (already in MongoDB format)
111+ if execution_plan .projection_stage :
112+ find_command ["projection" ] = execution_plan .projection_stage
114113
115114 # Apply sort if specified
116- if query_plan .sort_stage :
115+ if execution_plan .sort_stage :
117116 sort_spec = {}
118- for sort_dict in query_plan .sort_stage :
117+ for sort_dict in execution_plan .sort_stage :
119118 for field , direction in sort_dict .items ():
120119 sort_spec [field ] = direction
121120 find_command ["sort" ] = sort_spec
122121
123122 # Apply skip if specified
124- if query_plan .skip_stage :
125- find_command ["skip" ] = query_plan .skip_stage
123+ if execution_plan .skip_stage :
124+ find_command ["skip" ] = execution_plan .skip_stage
126125
127126 # Apply limit if specified
128- if query_plan .limit_stage :
129- find_command ["limit" ] = query_plan .limit_stage
127+ if execution_plan .limit_stage :
128+ find_command ["limit" ] = execution_plan .limit_stage
130129
131130 _logger .debug (f"Executing MongoDB command: { find_command } " )
132131
133132 # Execute find command directly
134133 result = db .command (find_command )
135134
136135 # Create result set from command result
137- self ._result_set = self ._result_set_class (command_result = result , query_plan = query_plan , ** self ._kwargs )
136+ self ._result_set = self ._result_set_class (
137+ command_result = result , execution_plan = execution_plan , ** self ._kwargs
138+ )
138139
139- _logger .info (f"Query executed successfully on collection '{ query_plan .collection } '" )
140+ _logger .info (f"Query executed successfully on collection '{ execution_plan .collection } '" )
140141
141142 except PyMongoError as e :
142143 _logger .error (f"MongoDB command execution failed: { e } " )
@@ -161,11 +162,11 @@ def execute(self: _T, operation: str, parameters: Optional[Dict[str, Any]] = Non
161162 _logger .warning ("Parameter substitution not yet implemented, ignoring parameters" )
162163
163164 try :
164- # Parse SQL to QueryPlan
165- self ._current_query_plan = self ._parse_sql (operation )
165+ # Parse SQL to ExecutionPlan
166+ self ._current_execution_plan = self ._parse_sql (operation )
166167
167- # Execute the query plan
168- self ._execute_query_plan (self ._current_query_plan )
168+ # Execute the execution plan
169+ self ._execute_execution_plan (self ._current_execution_plan )
169170
170171 return self
171172
0 commit comments