prepareOdiResources( );
openDataSource( );  if ( dataSet != null  ) {  dataSet.beforeOpen(); }   odiQuery = createOdiQuery( ); populateOdiQuery( ); prepareOdiQuery( );
		public void execute( IQueryResults outerResults, Scriptable scope ) throws DataException		{			assert scope != null;			this.scope = scope;						// Create the data set runtime			// Since data set runtime contains the execution result, a new data set			// runtime is needed for each execute			dataSet = newDataSetRuntime();						    // Set up the Javascript "row" object; this is needed before executeOdiQuery			// since filtering may need the object		    rowObject = new JSRowObject( dataSet );		    scope.put( "row", scope,  rowObject );							// Create, populate and prepare Odi query			prepareOdiResources( );							// Execute the query			odiResult = executeOdiQuery( outerResults );			// Bind the row object to the odi result set			rowObject.setResultSet( odiResult, false );							// Set the Javascript "rows" object and bind it to our result			rowsObject = new JSRows( outerResults, rowObject );			scope.put( "rows", scope, rowsObject );			    		    // Add computed column data		    setComputedColumns();		    // Calculate aggregate values		    aggregates = new AggregateCalculator( aggrTable, odiResult );			    		    // Set up the internal JS _aggr_value object and bind it to the aggregate calc engine		    Scriptable aggrObj = aggregates.getJSAggrValueObject();		    scope.put( ExpressionCompiler.AGGR_VALUE, scope, aggrObj );			    			Context cx = Context.enter();			try			{			    // Calculate aggregate values			    aggregates.calculate(cx, scope);			    			}			finally			{				Context.exit();			}					}