Esempio n. 1
0
        /// <summary>
        /// Execute search & get hit list
        /// </summary>
        /// <param name="saveHitlist"></param>
        /// <returns></returns>

        public bool ExecuteSearch(bool saveHitlist)
        {
            int          voi, ti, fi;
            ResultsTable rt;
            ResultsField rfld;
            MetaTable    mt;
            MetaColumn   mc, mc2;

            if (saveHitlist)             // clear current list
            {
                SessionManager.CurrentResultKeys = new List <string>();
                if (QueryManager.StatusBarManager != null)
                {
                    QueryManager.StatusBarManager.DisplayCurrentCount();
                }
            }

            // Start thread running the query

            QueryResultsAvailable = false;
            QueryEngineException  = null;
            ThreadStart ts = new ThreadStart(ExecuteQueryThreadMethod);
            Thread      executeQueryThread = new Thread(ts);

            executeQueryThread.Name         = "ExecuteSearch";
            executeQueryThread.IsBackground = true;
            executeQueryThread.SetApartmentState(ApartmentState.STA);
            executeQueryThread.Start();

            // Put up message for user

            if (((Query.ResultKeys != null && Query.UseResultKeys) ||             // already have list
                 ResultsFormat.SessionOutputFormContext) && !QueryEngineStatsForm.ShowStats)
            {
                Progress.Show("Retrieving data...", UmlautMobius.String, true, "Cancelling retrieval...");
            }

            else             // normal type search
            {
                Progress.Show("Searching database - 0:00", UmlautMobius.String, true, "Cancelling search...");
                if (QueryEngineStatsForm.ShowStats)
                {
                    QueryEngineStatsForm.StartNewQueryExecution(Query);
                    QueryEngineStatsForm.StartingSearch();
                }
            }

            // Wait until results available or the query is cancelled by the user

            while (true)
            {
                Thread.Sleep(100);
                Application.DoEvents();

                if (QueryResultsAvailable)                 // completed normally
                {
                    ResultsKeys = QueryEngine.GetKeys();
                    if (saveHitlist)                     // store for session manager also (may differ but probably shouldn't)
                    {
                        SessionManager.CurrentResultKeys = ResultsKeys;
                    }
                    //Progress.Hide();
                    break;
                }

                else if (QueryEngineException != null)
                {
                    Progress.Hide();
                    if (QueryEngineException is QueryException ||
                        QueryEngineException is UserQueryException)
                    {
                        throw QueryEngineException;
                    }
                    else
                    {
                        throw new Exception(QueryEngineException.Message, QueryEngineException);
                    }
                }

                else if (Progress.CancelRequested)
                {
                    if (QueryEngine != null)
                    {
                        QueryEngine.Cancel(false);                                          // start the cancel
                    }
                    Thread.Sleep(250);
                    Application.DoEvents();
                    if (executeQueryThread != null)
                    {
                        executeQueryThread.Abort();                                                 // kill the local thread executing the query
                    }
                    Progress.Hide();
                    return(false);
                }
            }

            // If the query contains tables marked for remapping then build new expanded query & use going forward

            // modifiedQuery = QueryEngine.DoPresearchChecksAndTransforms(Query); // do any presearch transforms

            OriginalQuery = Query;
            if (TransformedQuery != null)
            {
                //ResultsPages qrp = query.ResultsPages;
                //ResultsPages mqrp = modifiedQuery.ResultsPages; // use same set of results pages so view changes propagate back to original query
                Query.PresearchDerivedQuery = TransformedQuery; // link original query to the transformed query
                Query = TransformedQuery;                       // replace original query with this query
            }

            else
            {
                Query.PresearchDerivedQuery = null;
            }

            InitializeQueryManager(QueryManager, Query, QueryManager.ResultsFormat, QueryEngine, ResultsKeys);

            // Save the hit list as needed

            if (saveHitlist)
            {
                CidList currentList = new CidList(ResultsKeys);
                CidListCommand.WriteCurrentList(currentList);
                SessionManager.DisplayCurrentCount();
            }

            return(true);
        }