public static Hashtable Search(bool api)
        {
            BillType type;
            int      number;
            int      session = -1;

            if (HttpContext.Current.Request["session"] != null && HttpContext.Current.Request["session"] != "")
            {
                session = int.Parse(HttpContext.Current.Request["session"]);
            }

            string q = HttpContext.Current.Request["q"];

            int start = 0, count = (!api ? 30 : 1000);

            if (HttpContext.Current.Request["start"] != null)
            {
                start = int.Parse(HttpContext.Current.Request["start"]);
            }
            if (HttpContext.Current.Request["count"] != null)
            {
                count = int.Parse(HttpContext.Current.Request["count"]);
            }

            BooleanQuery query = new BooleanQuery();

            Hashtable no_results = new Hashtable();

            no_results["count"] = 0;

            if (q != null && q.IndexOf("*") > -1)
            {
                return(no_results);
            }

            if (!api && session == -1 && q != null)
            {
                int slash = q.IndexOf('/');
                if (slash >= q.Length - 4 && slash > 2)
                {
                    try {
                        session = int.Parse(q.Substring(slash + 1));                       // and if that worked...
                        q       = q.Substring(0, slash);
                        HttpContext.Current.Response.Redirect("billsearch.xpd?session=" + session + "&q=" + HttpUtility.UrlEncode(q));
                        return(null);
                    } catch { }
                }
            }

            if (session == -1)
            {
                session = Util.CurrentSession;
            }

            //Console.Error.WriteLine("Find: " + q);

            string    search_method = "search";
            ArrayList specs         = new ArrayList();
            Hashtable scores        = new Hashtable();

            // Match a bill number exactly
            if (q != null && Bills.ParseID(q, out type, out number))
            {
                if (!api)
                {
                    // Redirect the user right to the bill page.
                    // Don't even check if bill exists.
                    HttpContext.Current.Response.Redirect(
                        Bills.BillLink2(session, type, number));
                    return(null);
                }
                else
                {
                    search_method = "search by bill number";
                    scores[session + EnumsConv.BillTypeToString(type) + number] = 1.0F;
                    specs.Add(new Database.AndSpec(
                                  new Database.SpecEQ("session", session),
                                  new Database.SpecEQ("type", EnumsConv.BillTypeToString(type)),
                                  new Database.SpecEQ("number", number)));
                }
            }

            // Match public law number exactly
            if (!api && q != null && (q.StartsWith("P.L.") || q.StartsWith("PL")))
            {
                try {
                    string num = null;
                    if (q.StartsWith("P.L."))
                    {
                        num = q.Substring(4);
                    }
                    if (q.StartsWith("PL"))
                    {
                        num = q.Substring(2);
                    }
                    num = num.Replace(" ", "");

                    int dash = num.IndexOf('-');
                    int s    = int.Parse(num.Substring(0, dash));

                    TableRow bill = Util.Database.DBSelectFirst("billindex", "session, type, number",
                                                                new Database.SpecEQ("idx", "publiclawnumber"),
                                                                new Database.SpecEQ("session", s),
                                                                new Database.SpecEQ("value", num));

                    if (bill != null)
                    {
                        if (!api)
                        {
                            HttpContext.Current.Response.Redirect(Bills.BillLink3((int)bill["session"], (string)bill["type"], (int)bill["number"]));
                            return(null);
                        }
                        else
                        {
                            search_method = "search by public law number";
                            scores[(int)bill["session"] + (string)bill["type"] + (int)bill["number"]] = 1.0F;
                            specs.Add(new Database.AndSpec(
                                          new Database.SpecEQ("session", (int)bill["session"]),
                                          new Database.SpecEQ("type", (string)bill["type"]),
                                          new Database.SpecEQ("number", (int)bill["number"])));
                        }
                    }
                } catch {
                }
            }

            if (session == -1)
            {
                session = Util.CurrentSession;
            }

            // Match USC reference
            Regex uscexp = new Regex(@"(\d[0-9A-Za-z\-]*)\s+U\.?S\.?C\.?\s+(\d[0-9A-Za-z\-]*)((\s*\([^\) ]+\))*)",
                                     RegexOptions.IgnoreCase);
            Match uscmc = (q == null ? null : uscexp.Match(q));

            if (uscmc != null && uscmc.Success)
            {
                string title     = uscmc.Groups[1].Value;
                string section   = uscmc.Groups[2].Value;
                string paragraph = uscmc.Groups[3].Value;

                string[] ps  = paragraph.Split('[', '(', ')', ' ');
                int      psi = 0; while (psi < ps.Length - 1 && ps[psi] == "")
                {
                    psi++;
                }
                int pse = ps.Length - 1; while (pse > 0 && ps[pse] == "")
                {
                    pse--;
                }
                if (ps.Length != 0)
                {
                    paragraph = "_" + String.Join("_", ps, psi, pse - psi + 1);
                }

                Table table = Util.Database.DBSelect("billusc", "session, type, number",
                                                     new Database.SpecEQ("session", session),
                                                     new Database.OrSpec(
                                                         new Database.SpecEQ("ref", title + "_" + section + paragraph),
                                                         new Database.SpecStartsWith("ref", title + "_" + section + paragraph + "_")));
                foreach (TableRow bill in table)
                {
                    search_method = "search by U.S.C. section";
                    scores[(int)bill["session"] + (string)bill["type"] + (int)bill["number"]] = 1.0F;
                    specs.Add(new Database.AndSpec(
                                  new Database.SpecEQ("session", (int)bill["session"]),
                                  new Database.SpecEQ("type", (string)bill["type"]),
                                  new Database.SpecEQ("number", (int)bill["number"])));
                }
            }

            int total_count = -1;

            if (specs.Count == 0)
            {
                if (q != null && q.Trim() != "")
                {
                    BooleanQuery query1 = new BooleanQuery();
                    query.Add(query1, BooleanClause.Occur.MUST);
                    try {
                        /*if (!q.StartsWith("-")) {
                         *      PhraseQuery pq = new PhraseQuery();
                         *      pq.Add( new Term("shorttitles", q) );
                         *      pq.SetBoost((float)4);
                         *      query1.Add(pq, false, false);
                         * }*/

                        Query query_titles2 = new QueryParser("shorttitles", new StandardAnalyzer()).Parse(q);
                        query_titles2.SetBoost((float)3);
                        query1.Add(query_titles2, BooleanClause.Occur.SHOULD);

                        Query query_titles1 = new QueryParser("officialtitles", new StandardAnalyzer()).Parse(q);
                        query_titles1.SetBoost((float)2);
                        query1.Add(query_titles1, BooleanClause.Occur.SHOULD);

                        Query query_summary = new QueryParser("summary", new StandardAnalyzer()).Parse(q);
                        query1.Add(query_summary, BooleanClause.Occur.SHOULD);

                        Query query_text = new QueryParser("fulltext", new StandardAnalyzer()).Parse(q);
                        query1.Add(query_text, BooleanClause.Occur.SHOULD);
                    } catch (Exception e) {
                        return(no_results);
                    }
                }

                string   chamber   = HttpContext.Current.Request["chamber"];
                string[] status    = HttpContext.Current.Request["status"] == null ? null : HttpContext.Current.Request["status"].Split(',');
                string   sponsor   = HttpContext.Current.Request["sponsor"];
                string   cosponsor = HttpContext.Current.Request["cosponsor"];

                if (chamber != null && (chamber == "s" || chamber == "h"))
                {
                    query.Add(new WildcardQuery(new Term("type", chamber + "*")), BooleanClause.Occur.MUST);
                }
                if (status != null && status[0] != "")
                {
                    List <Term> terms = new List <Term>();
                    foreach (string s in status)
                    {
                        terms.Add(new Term("state", s));
                    }
                    MultiPhraseQuery mpq = new MultiPhraseQuery();
                    mpq.Add(terms.ToArray());
                    query.Add(mpq, BooleanClause.Occur.MUST);
                }
                if (sponsor != null && sponsor != "")
                {
                    query.Add(new TermQuery(new Term("sponsor", sponsor)), BooleanClause.Occur.MUST);
                }
                if (cosponsor != null && cosponsor != "")
                {
                    query.Add(new TermQuery(new Term("cosponsor", cosponsor)), BooleanClause.Occur.MUST);
                }

                IndexSearcher searcher = new IndexSearcher(Util.DataPath + Path.DirectorySeparatorChar + session + Path.DirectorySeparatorChar + "index.bills.lucene");

                Sort sort = null;
                if (HttpContext.Current.Request["sort"] != null && HttpContext.Current.Request["sort"] == "introduced")
                {
                    sort = new Sort(new SortField("introduced", SortField.STRING, true));
                }
                if (HttpContext.Current.Request["sort"] != null && HttpContext.Current.Request["sort"] == "lastaction")
                {
                    sort = new Sort(new SortField("lastaction", SortField.STRING, true));
                }

                Hits hits = searcher.Search(query, sort == null ? new Sort() : sort);

                int end = hits.Length();
                if (start + count < end)
                {
                    end = start + count;
                }
                total_count = hits.Length();

                for (int i = start; i < end; i++)
                {
                    Document doc         = hits.Doc(i);
                    string   billsession = doc.Get("session");
                    string   billtype    = doc.Get("type");
                    string   billnumber  = doc.Get("number");

                    int istatus = (int)EnumsConv.BillStatusFromString(doc.Get("status"));

                    float score;
                    if (sort == null)             // readjust the score based on status
                    {
                        score = hits.Score(i) + istatus / (float)8 * (float).2;
                    }
                    else             // keep order from Lucene
                    {
                        score = -i;
                    }

                    scores[billsession + billtype + billnumber] = score;
                    specs.Add(new Database.AndSpec(
                                  new Database.SpecEQ("session", billsession),
                                  new Database.SpecEQ("type", billtype),
                                  new Database.SpecEQ("number", billnumber)));
                }

                if (HttpContext.Current.Request["sort"] != null && HttpContext.Current.Request["sort"] == "hits" && specs.Count > 0)
                {
                    Table hitsinfo = Util.Database.DBSelect("billhits", "*",
                                                            Database.OrSpec.New((Database.Spec[])specs.ToArray(typeof(Database.Spec))));
                    foreach (TableRow billhits in hitsinfo)
                    {
                        scores["" + billhits["session"] + billhits["type"] + billhits["number"]] = (float)(int)billhits["hits1"];
                    }
                }
            }

            if (specs.Count == 0)
            {
                return(no_results);
            }

            Table billinfo = Util.Database.DBSelect("billstatus", "*",
                                                    Database.OrSpec.New((Database.Spec[])specs.ToArray(typeof(Database.Spec))));

            if (total_count == -1)
            {
                total_count = billinfo.Rows;
            }

            ArrayList ret = new ArrayList();

            foreach (TableRow r in billinfo)
            {
                ret.Add(r);
            }

            BillHitComparer bhc = new BillHitComparer();

            bhc.scores = scores;
            ret.Sort(bhc);

            Hashtable ret2 = new Hashtable();

            ret2["count"]   = total_count;
            ret2["method"]  = search_method;
            ret2["results"] = ret;

            return(ret2);
        }
Example #2
0
        private static string GetStatusText(XPathNavigator root, XPathNavigator status, out object details)
        {
            try {
                bool isCurrentSession = true;         // default
                // this doesn't work on index nodes
                if (root.GetAttribute("session", "") != "")
                {
                    int session = int.Parse(root.GetAttribute("session", ""));
                    isCurrentSession = (session == Util.CurrentSession);
                }

                BillStatus s = EnumsConv.BillStatusFromString(status.Name);
                switch (s)
                {
                case BillStatus.Introduced:
                    /*if ((string)status.Evaluate("name(parent::*)") == "status")
                     *      details = new IntroducedDetails(int.Parse((string)root.Evaluate("string(/bill/sponsor/@id)")));
                     * else if ((string)status.Evaluate("name(parent::*)") == "statusxml")
                     *      details = null;
                     * else
                     *      details = new IntroducedDetails(int.Parse((string)status.Evaluate("string(@sponsor)")));*/
                    details = null;
                    if (isCurrentSession)
                    {
                        return("Introduced");
                    }
                    else
                    {
                        return("Dead");
                    }

                case BillStatus.Calendar:
                    details = null;
                    if (isCurrentSession)
                    {
                        return("Reported by Committee");
                    }
                    else
                    {
                        return("Dead");
                    }

                case BillStatus.Vote:
                case BillStatus.Vote2:
                    if (status.GetAttribute("how", "") == "roll")
                    {
                        string info = "";
                        try {
                            DateTime date = Util.DTToDateTime(status.GetAttribute("date", ""));
                            string   file = GetRollFileName(status.GetAttribute("where", ""), date, int.Parse(status.GetAttribute("roll", ""))) + ".txt";
                            info = Util.LoadFileString(Util.SessionFromDateTime(date), "gen.rolls-pca" + Path.DirectorySeparatorChar + file);
                        } catch (Exception e) { }
                        details = new VoteDetails(
                            status.GetAttribute("where", "") == "h" ? Chamber.House : Chamber.Senate,
                            Util.DTToDateTime(status.GetAttribute("datetime", "")),
                            int.Parse(status.GetAttribute("roll", "")),
                            status.GetAttribute("result", "") == "pass",
                            info
                            );
                    }
                    else
                    {
                        details = null;
                    }
                    string result = status.GetAttribute("result", "");
                    if (result == "pass")
                    {
                        result = "Passed";
                    }
                    else if (result == "fail")
                    {
                        result = "Failed";
                    }
                    else
                    {
                        throw new InvalidOperationException("Invalid vote result: " + result);
                    }
                    Chamber chamber = EnumsUtil.BillTypeChamber(EnumsConv.BillTypeFromString(status.GetAttribute("where", "")));
                    if (s == BillStatus.Vote)
                    {
                        return(result + " " + EnumsConv.ChamberNameShort(chamber));
                    }
                    else
                    {
                        return("Passed " + EnumsConv.ChamberNameShort(EnumsUtil.Other(chamber))
                               + ", " + result + " " + EnumsConv.ChamberNameShort(chamber));
                    }

                case BillStatus.Conference:
                    details = "";
                    return("Resolving Differences");

                case BillStatus.ToPresident:
                    details = null;
                    return("Sent to President");

                case BillStatus.Signed:
                    details = null;
                    return("Signed by President");

                case BillStatus.Veto:
                    details = null;
                    return("Vetoed by President");

                case BillStatus.Override:
                    details = null;
                    string result1 = status.GetAttribute("result", "");
                    if (result1 == "pass")
                    {
                        result1 = "Succeeded";
                    }
                    else if (result1 == "fail")
                    {
                        result1 = "Failed";
                    }
                    return("Veto Override " + result1);

                case BillStatus.Enacted:
                    details = null;
                    return("Enacted");
                }
                throw new InvalidOperationException();
            } catch (Exception e) {
                details = null;
                return("Unknown");
            }
        }