Changeset 8f9e905705f715e2dc4745a098e9a1819271873a
- Timestamp:
- 04/23/08 12:42:51 (9 months ago)
- Parents:
- 7799d1d6f07fd24cc0cf0b784340f994374fc5b1
- Children:
- 294d6fdf2503283b97bc859af2e7b875a85a6eea, daefc89abb93c1d38fc967afa50714e5b878122b
- git-committer:
- David Balmain <dbalmain@gmail.com> / 2008-04-23T12:42:51Z+1000
- Location:
- c
- Files:
-
- 7 modified
-
include/internal.h (modified) (1 diff)
-
include/search.h (modified) (1 diff)
-
src/ind.c (modified) (2 diffs)
-
src/q_parser.c (modified) (20 diffs)
-
src/q_parser.y (modified) (14 diffs)
-
test/test_q_parser.c (modified) (12 diffs)
-
test/test_threading.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
c/include/internal.h
r7799d1 r8f9e90 767 767 #define qfilt_new frt_qfilt_new 768 768 #define qfilt_new_nr frt_qfilt_new_nr 769 #define qp_add_field frt_qp_add_field 769 770 #define qp_clean_str frt_qp_clean_str 770 771 #define qp_default_fuzzy_min_sim frt_qp_default_fuzzy_min_sim -
c/include/search.h
r4ba05f r8f9e90 932 932 typedef FrtQueryParser FrtQParser; /* QParser is an alias for QueryParser */ 933 933 934 extern FrtQParser *frt_qp_new(FrtHashSet *all_fields, FrtHashSet *def_fields, 935 FrtHashSet *tokenized_fields, FrtAnalyzer *analyzer); 934 extern FrtQParser *frt_qp_new(FrtAnalyzer *analyzer); 935 extern void frt_qp_add_field(FrtQParser *self, const char *field, 936 bool is_default, bool is_tokenized); 936 937 extern void frt_qp_destroy(FrtQParser *self); 937 938 extern FrtQuery *frt_qp_parse(FrtQParser *self, char *qstr); -
c/src/ind.c
r553474 r8f9e90 44 44 } 45 45 46 46 47 Index *index_new(Store *store, Analyzer *analyzer, HashSet *def_fields, 47 48 bool create) 48 49 { 49 HashSet *all_fields = hs_new_str(NULL);50 50 Index *self = ALLOC_AND_ZERO(Index); 51 HashSetEntry *hse; 52 /* FIXME: need to add these to the query parser */ 51 53 self->config = default_config; 52 54 mutex_init(&self->mutex, NULL); … … 81 83 82 84 REF(self->analyzer); 83 self->qp = qp_new(all_fields, def_fields, NULL, self->analyzer); 85 self->qp = qp_new(self->analyzer); 86 for (hse = def_fields->first; hse; hse = hse->next) { 87 qp_add_field(self->qp, (const char *)hse->elem, true, true); 88 } 84 89 /* Index is a convenience class so set qp convenience options */ 85 90 self->qp->allow_any_fields = true; -
c/src/q_parser.c
rb39568 r8f9e90 187 187 static BooleanClause *get_bool_cls(Query *q, BCType occur); 188 188 189 static Query *get_term_q(QParser *qp, char *field, char *word); 190 static Query *get_fuzzy_q(QParser *qp, char *field, char *word, char *slop); 191 static Query *get_wild_q(QParser *qp, char *field, char *pattern); 192 193 static HashSet *first_field(QParser *qp, char *field); 194 static HashSet *add_field(QParser *qp, char *field); 189 static Query *get_term_q(QParser *qp, const char *field, char *word); 190 static Query *get_fuzzy_q(QParser *qp, const char *field, char *word, 191 char *slop); 192 static Query *get_wild_q(QParser *qp, const char *field, char *pattern); 193 194 static HashSet *first_field(QParser *qp, const char *field); 195 static HashSet *add_field(QParser *qp, const char *field); 195 196 196 197 static Query *get_phrase_q(QParser *qp, Phrase *phrase, char *slop); … … 201 202 static void ph_destroy(Phrase *self); 202 203 203 static Query *get_r_q(QParser *qp, c har *field, char *from, char *to,204 static Query *get_r_q(QParser *qp, const char *field, char *from, char *to, 204 205 bool inc_lower, bool inc_upper); 205 206 … … 257 258 258 259 /* Line 216 of yacc.c. */ 259 #line 26 0"src/q_parser.c"260 #line 261 "src/q_parser.c" 260 261 261 262 #ifdef short … … 560 561 static const yytype_uint16 yyrline[] = 561 562 { 562 0, 22 5, 225, 226, 228, 229, 230, 231, 233, 234,563 23 5, 237, 238, 240, 241, 242, 243, 244, 245, 246,564 24 8, 249, 250, 252, 254, 254, 256, 256, 256, 259,565 26 0, 262, 263, 264, 265, 267, 268, 269, 270, 271,566 27 3, 274, 275, 276, 277, 278, 279, 280, 281, 282,567 28 3, 284563 0, 226, 226, 227, 229, 230, 231, 232, 234, 235, 564 236, 238, 239, 241, 242, 243, 244, 245, 246, 247, 565 249, 250, 251, 253, 255, 255, 257, 257, 257, 260, 566 261, 263, 264, 265, 266, 268, 269, 270, 271, 272, 567 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 568 284, 285 568 569 }; 569 570 #endif … … 1224 1225 { 1225 1226 case 27: /* "bool_q" */ 1226 #line 22 0"src/q_parser.y"1227 #line 221 "src/q_parser.y" 1227 1228 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1228 #line 12 29"src/q_parser.c"1229 #line 1230 "src/q_parser.c" 1229 1230 break; 1230 1231 case 28: /* "bool_clss" */ 1231 #line 22 2"src/q_parser.y"1232 #line 223 "src/q_parser.y" 1232 1233 { if ((yyvaluep->bclss) && qp->destruct) bca_destroy((yyvaluep->bclss)); }; 1233 #line 123 4"src/q_parser.c"1234 #line 1235 "src/q_parser.c" 1234 1235 break; 1235 1236 case 29: /* "bool_cls" */ 1236 #line 22 1"src/q_parser.y"1237 #line 222 "src/q_parser.y" 1237 1238 { if ((yyvaluep->bcls) && qp->destruct) bc_deref((yyvaluep->bcls)); }; 1238 #line 12 39"src/q_parser.c"1239 #line 1240 "src/q_parser.c" 1239 1240 break; 1240 1241 case 30: /* "boosted_q" */ 1241 #line 22 0"src/q_parser.y"1242 #line 221 "src/q_parser.y" 1242 1243 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1243 #line 124 4"src/q_parser.c"1244 #line 1245 "src/q_parser.c" 1244 1245 break; 1245 1246 case 31: /* "q" */ 1246 #line 22 0"src/q_parser.y"1247 #line 221 "src/q_parser.y" 1247 1248 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1248 #line 12 49"src/q_parser.c"1249 #line 1250 "src/q_parser.c" 1249 1250 break; 1250 1251 case 32: /* "term_q" */ 1251 #line 22 0"src/q_parser.y"1252 #line 221 "src/q_parser.y" 1252 1253 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1253 #line 125 4"src/q_parser.c"1254 #line 1255 "src/q_parser.c" 1254 1255 break; 1255 1256 case 33: /* "wild_q" */ 1256 #line 22 0"src/q_parser.y"1257 #line 221 "src/q_parser.y" 1257 1258 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1258 #line 12 59"src/q_parser.c"1259 #line 1260 "src/q_parser.c" 1259 1260 break; 1260 1261 case 34: /* "field_q" */ 1261 #line 22 0"src/q_parser.y"1262 #line 221 "src/q_parser.y" 1262 1263 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1263 #line 126 4"src/q_parser.c"1264 #line 1265 "src/q_parser.c" 1264 1265 break; 1265 1266 case 39: /* "phrase_q" */ 1266 #line 22 0"src/q_parser.y"1267 #line 221 "src/q_parser.y" 1267 1268 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1268 #line 12 69"src/q_parser.c"1269 #line 1270 "src/q_parser.c" 1269 1270 break; 1270 1271 case 40: /* "ph_words" */ 1271 #line 22 3"src/q_parser.y"1272 #line 224 "src/q_parser.y" 1272 1273 { if ((yyvaluep->phrase) && qp->destruct) ph_destroy((yyvaluep->phrase)); }; 1273 #line 127 4"src/q_parser.c"1274 #line 1275 "src/q_parser.c" 1274 1275 break; 1275 1276 case 41: /* "range_q" */ 1276 #line 22 0"src/q_parser.y"1277 #line 221 "src/q_parser.y" 1277 1278 { if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); }; 1278 #line 12 79"src/q_parser.c"1279 #line 1280 "src/q_parser.c" 1279 1280 break; 1280 1281 … … 1585 1586 { 1586 1587 case 2: 1587 #line 22 5"src/q_parser.y"1588 #line 226 "src/q_parser.y" 1588 1589 { qp->result = (yyval.query) = NULL; } 1589 1590 break; 1590 1591 1591 1592 case 3: 1592 #line 22 6"src/q_parser.y"1593 #line 227 "src/q_parser.y" 1593 1594 { T qp->result = (yyval.query) = get_bool_q((yyvsp[(1) - (1)].bclss)); E } 1594 1595 break; 1595 1596 1596 1597 case 4: 1597 #line 22 8"src/q_parser.y"1598 #line 229 "src/q_parser.y" 1598 1599 { T (yyval.bclss) = first_cls((yyvsp[(1) - (1)].bcls)); E } 1599 1600 break; 1600 1601 1601 1602 case 5: 1602 #line 2 29"src/q_parser.y"1603 #line 230 "src/q_parser.y" 1603 1604 { T (yyval.bclss) = add_and_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E } 1604 1605 break; 1605 1606 1606 1607 case 6: 1607 #line 23 0"src/q_parser.y"1608 #line 231 "src/q_parser.y" 1608 1609 { T (yyval.bclss) = add_or_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E } 1609 1610 break; 1610 1611 1611 1612 case 7: 1612 #line 23 1"src/q_parser.y"1613 #line 232 "src/q_parser.y" 1613 1614 { T (yyval.bclss) = add_default_cls(qp, (yyvsp[(1) - (2)].bclss), (yyvsp[(2) - (2)].bcls)); E } 1614 1615 break; 1615 1616 1616 1617 case 8: 1617 #line 23 3"src/q_parser.y"1618 #line 234 "src/q_parser.y" 1618 1619 { T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST); E } 1619 1620 break; 1620 1621 1621 1622 case 9: 1622 #line 23 4"src/q_parser.y"1623 #line 235 "src/q_parser.y" 1623 1624 { T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST_NOT); E } 1624 1625 break; 1625 1626 1626 1627 case 10: 1627 #line 23 5"src/q_parser.y"1628 #line 236 "src/q_parser.y" 1628 1629 { T (yyval.bcls) = get_bool_cls((yyvsp[(1) - (1)].query), BC_SHOULD); E } 1629 1630 break; 1630 1631 1631 1632 case 12: 1632 #line 23 8"src/q_parser.y"1633 #line 239 "src/q_parser.y" 1633 1634 { T if ((yyvsp[(1) - (3)].query)) sscanf((yyvsp[(3) - (3)].str),"%f",&((yyvsp[(1) - (3)].query)->boost)); (yyval.query)=(yyvsp[(1) - (3)].query); E } 1634 1635 break; 1635 1636 1636 1637 case 14: 1637 #line 24 1"src/q_parser.y"1638 #line 242 "src/q_parser.y" 1638 1639 { T (yyval.query) = bq_new_max(true, qp->max_clauses); E } 1639 1640 break; 1640 1641 1641 1642 case 15: 1642 #line 24 2"src/q_parser.y"1643 #line 243 "src/q_parser.y" 1643 1644 { T (yyval.query) = get_bool_q((yyvsp[(2) - (3)].bclss)); E } 1644 1645 break; 1645 1646 1646 1647 case 20: 1647 #line 24 8"src/q_parser.y"1648 #line 249 "src/q_parser.y" 1648 1649 { FLDS((yyval.query), get_term_q(qp, field, (yyvsp[(1) - (1)].str))); Y} 1649 1650 break; 1650 1651 1651 1652 case 21: 1652 #line 2 49"src/q_parser.y"1653 #line 250 "src/q_parser.y" 1653 1654 { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); Y} 1654 1655 break; 1655 1656 1656 1657 case 22: 1657 #line 25 0"src/q_parser.y"1658 #line 251 "src/q_parser.y" 1658 1659 { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (2)].str), NULL)); Y} 1659 1660 break; 1660 1661 1661 1662 case 23: 1662 #line 25 2"src/q_parser.y"1663 #line 253 "src/q_parser.y" 1663 1664 { FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[(1) - (1)].str))); Y} 1664 1665 break; 1665 1666 1666 1667 case 24: 1667 #line 25 4"src/q_parser.y"1668 #line 255 "src/q_parser.y" 1668 1669 { qp_pop_fields(qp); } 1669 1670 break; 1670 1671 1671 1672 case 25: 1672 #line 25 5"src/q_parser.y"1673 #line 256 "src/q_parser.y" 1673 1674 { (yyval.query) = (yyvsp[(3) - (4)].query); } 1674 1675 break; 1675 1676 1676 1677 case 26: 1677 #line 25 6"src/q_parser.y"1678 #line 257 "src/q_parser.y" 1678 1679 { qp_push_fields(qp, qp->all_fields, false); } 1679 1680 break; 1680 1681 1681 1682 case 27: 1682 #line 25 6"src/q_parser.y"1683 #line 257 "src/q_parser.y" 1683 1684 { qp_pop_fields(qp); } 1684 1685 break; 1685 1686 1686 1687 case 28: 1687 #line 25 7"src/q_parser.y"1688 #line 258 "src/q_parser.y" 1688 1689 { (yyval.query) = (yyvsp[(4) - (5)].query); } 1689 1690 break; 1690 1691 1691 1692 case 29: 1692 #line 2 59"src/q_parser.y"1693 #line 260 "src/q_parser.y" 1693 1694 { (yyval.hashset) = first_field(qp, (yyvsp[(1) - (1)].str)); } 1694 1695 break; 1695 1696 1696 1697 case 30: 1697 #line 26 0"src/q_parser.y"1698 #line 261 "src/q_parser.y" 1698 1699 { (yyval.hashset) = add_field(qp, (yyvsp[(3) - (3)].str));} 1699 1700 break; 1700 1701 1701 1702 case 31: 1702 #line 26 2"src/q_parser.y"1703 #line 263 "src/q_parser.y" 1703 1704 { (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (3)].phrase), NULL); } 1704 1705 break; 1705 1706 1706 1707 case 32: 1707 #line 26 3"src/q_parser.y"1708 #line 264 "src/q_parser.y" 1708 1709 { (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (5)].phrase), (yyvsp[(5) - (5)].str)); } 1709 1710 break; 1710 1711 1711 1712 case 33: 1712 #line 26 4"src/q_parser.y"1713 #line 265 "src/q_parser.y" 1713 1714 { (yyval.query) = NULL; } 1714 1715 break; 1715 1716 1716 1717 case 34: 1717 #line 26 5"src/q_parser.y"1718 #line 266 "src/q_parser.y" 1718 1719 { (yyval.query) = NULL; (void)(yyvsp[(4) - (4)].str);} 1719 1720 break; 1720 1721 1721 1722 case 35: 1722 #line 26 7"src/q_parser.y"1723 #line 268 "src/q_parser.y" 1723 1724 { (yyval.phrase) = ph_first_word((yyvsp[(1) - (1)].str)); } 1724 1725 break; 1725 1726 1726 1727 case 36: 1727 #line 26 8"src/q_parser.y"1728 #line 269 "src/q_parser.y" 1728 1729 { (yyval.phrase) = ph_first_word(NULL); } 1729 1730 break; 1730 1731 1731 1732 case 37: 1732 #line 2 69"src/q_parser.y"1733 #line 270 "src/q_parser.y" 1733 1734 { (yyval.phrase) = ph_add_word((yyvsp[(1) - (2)].phrase), (yyvsp[(2) - (2)].str)); } 1734 1735 break; 1735 1736 1736 1737 case 38: 1737 #line 27 0"src/q_parser.y"1738 #line 271 "src/q_parser.y" 1738 1739 { (yyval.phrase) = ph_add_word((yyvsp[(1) - (3)].phrase), NULL); } 1739 1740 break; 1740 1741 1741 1742 case 39: 1742 #line 27 1"src/q_parser.y"1743 #line 272 "src/q_parser.y" 1743 1744 { (yyval.phrase) = ph_add_multi_word((yyvsp[(1) - (3)].phrase), (yyvsp[(3) - (3)].str)); } 1744 1745 break; 1745 1746 1746 1747 case 40: 1747 #line 27 3"src/q_parser.y"1748 #line 274 "src/q_parser.y" 1748 1749 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, true)); Y} 1749 1750 break; 1750 1751 1751 1752 case 41: 1752 #line 27 4"src/q_parser.y"1753 #line 275 "src/q_parser.y" 1753 1754 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, false)); Y} 1754 1755 break; 1755 1756 1756 1757 case 42: 1757 #line 27 5"src/q_parser.y"1758 #line 276 "src/q_parser.y" 1758 1759 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, true)); Y} 1759 1760 break; 1760 1761 1761 1762 case 43: 1762 #line 27 6"src/q_parser.y"1763 #line 277 "src/q_parser.y" 1763 1764 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, false)); Y} 1764 1765 break; 1765 1766 1766 1767 case 44: 1767 #line 27 7"src/q_parser.y"1768 #line 278 "src/q_parser.y" 1768 1769 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, false)); Y} 1769 1770 break; 1770 1771 1771 1772 case 45: 1772 #line 27 8"src/q_parser.y"1773 #line 279 "src/q_parser.y" 1773 1774 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, true)); Y} 1774 1775 break; 1775 1776 1776 1777 case 46: 1777 #line 2 79"src/q_parser.y"1778 #line 280 "src/q_parser.y" 1778 1779 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,true, false)); Y} 1779 1780 break; 1780 1781 1781 1782 case 47: 1782 #line 28 0"src/q_parser.y"1783 #line 281 "src/q_parser.y" 1783 1784 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,false, false)); Y} 1784 1785 break; 1785 1786 1786 1787 case 48: 1787 #line 28 1"src/q_parser.y"1788 #line 282 "src/q_parser.y" 1788 1789 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (2)].str), false, false)); Y} 1789 1790 break; 1790 1791 1791 1792 case 49: 1792 #line 28 2"src/q_parser.y"1793 #line 283 "src/q_parser.y" 1793 1794 { FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(3) - (3)].str), false, true)); Y} 1794 1795 break; 1795 1796 1796 1797 case 50: 1797 #line 28 3"src/q_parser.y"1798 #line 284 "src/q_parser.y" 1798 1799 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(3) - (3)].str), NULL,true, false)); Y} 1799 1800 break; 1800 1801 1801 1802 case 51: 1802 #line 28 4"src/q_parser.y"1803 #line 285 "src/q_parser.y" 1803 1804 { FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (2)].str), NULL,false, false)); Y} 1804 1805 break; … … 1806 1807 1807 1808 /* Line 1267 of yacc.c. */ 1808 #line 18 09"src/q_parser.c"1809 #line 1810 "src/q_parser.c" 1809 1810 default: break; 1810 1811 } … … 2020 2021 2021 2022 2022 #line 28 6"src/q_parser.y"2023 #line 287 "src/q_parser.y" 2023 2024 2024 2025 … … 2211 2212 * with the text to be tokenized. 2212 2213 */ 2213 static TokenStream *get_cached_ts(QParser *qp, c har *field, char *text)2214 static TokenStream *get_cached_ts(QParser *qp, const char *field, char *text) 2214 2215 { 2215 2216 TokenStream *ts; 2216 if ( !qp->tokenized_fields ||hs_exists(qp->tokenized_fields, field)) {2217 if (hs_exists(qp->tokenized_fields, field)) { 2217 2218 ts = (TokenStream *)h_get(qp->ts_cache, field); 2218 2219 if (!ts) { … … 2383 2384 * address and tokenized with the same tokenizer. 2384 2385 */ 2385 static Query *get_term_q(QParser *qp, c har *field, char *word)2386 static Query *get_term_q(QParser *qp, const char *field, char *word) 2386 2387 { 2387 2388 Query *q; … … 2421 2422 * ignored. 2422 2423 */ 2423 static Query *get_fuzzy_q(QParser *qp, char *field, char *word, char *slop_str) 2424 static Query *get_fuzzy_q(QParser *qp, const char *field, char *word, 2425 char *slop_str) 2424 2426 { 2425 2427 Query *q; … … 2480 2482 * only wild char (*, ?) in the pattern is a '*' at the end of the pattern. 2481 2483 */ 2482 static Query *get_wild_q(QParser *qp, c har *field, char *pattern)2484 static Query *get_wild_q(QParser *qp, const char *field, char *pattern) 2483 2485 { 2484 2486 Query *q; … … 2524 2526 * Adds another field to the top of the FieldStack. 2525 2527 */ 2526 static HashSet *add_field(QParser *qp, char *field) 2527 { 2528 static HashSet *add_field(QParser *qp, const char *field) 2529 { 2530 field = intern(field); 2528 2531 if (qp->allow_any_fields || hs_exists(qp->all_fields, field)) { 2529 hs_add(qp->fields, (char *) intern(field));2532 hs_add(qp->fields, (char *)field); 2530 2533 } 2531 2534 return qp->fields; … … 2537 2540 * fields set. 2538 2541 */ 2539 static HashSet *first_field(QParser *qp, c har *field)2540 { 2541 qp_push_fields(qp, hs_new_ str(NULL), true);2542 static HashSet *first_field(QParser *qp, const char *field) 2543 { 2544 qp_push_fields(qp, hs_new_ptr(NULL), true); 2542 2545 return add_field(qp, field); 2543 2546 } … … 2651 2654 * custom tokenizer which will leave dbalmain@gmail.com as a single token. 2652 2655 */ 2653 static Query *get_phrase_query(QParser *qp, c har *field,2656 static Query *get_phrase_query(QParser *qp, const char *field, 2654 2657 Phrase *phrase, char *slop_str) 2655 2658 { … … 2777 2780 * tokenizer also downcased its terms. 2778 2781 */ 2779 static Query *get_r_q(QParser *qp, c har *field, char *from, char *to,2782 static Query *get_r_q(QParser *qp, const char *field, char *from, char *to, 2780 2783 bool inc_lower, bool inc_upper) 2781 2784 { … … 2856 2859 void qp_destroy(QParser *self) 2857 2860 { 2858 if (self->def_fields != self->all_fields) { 2859 hs_destroy(self->def_fields); 2860 } 2861 if (self->tokenized_fields) { 2862 hs_destroy(self->tokenized_fields); 2863 } 2864 if (self->dynbuf) { 2865 free(self->dynbuf); 2866 } 2861 hs_destroy(self->tokenized_fields); 2862 hs_destroy(self->def_fields); 2867 2863 hs_destroy(self->all_fields); 2868 2864 … … 2882 2878 * +def_fields+ must also exist in +all_fields+. This should make sense. 2883 2879 */ 2884 QParser *qp_new(HashSet *all_fields, HashSet *def_fields, 2885 HashSet *tokenized_fields, Analyzer *analyzer) 2880 QParser *qp_new(Analyzer *analyzer) 2886 2881 { 2887 2882 QParser *self = ALLOC(QParser); … … 2895 2890 self->use_typed_range_query = false; 2896 2891 self->def_slop = 0; 2897 self->all_fields = all_fields; 2898 self->tokenized_fields = tokenized_fields; 2899 if (def_fields) { 2900 HashSetEntry *hse; 2901 self->def_fields = def_fields; 2902 for (hse = def_fields->first; hse; hse = hse->next) { 2903 if (!hs_exists(self->all_fields, hse->elem)) { 2904 hs_add(self->all_fields, hse->elem); 2905 } 2906 } 2907 } 2908 else { 2909 self->def_fields = all_fields; 2910 } 2892 2893 self->tokenized_fields = hs_new_ptr(NULL); 2894 self->all_fields = hs_new_ptr(NULL); 2895 self->def_fields = hs_new_ptr(NULL); 2896 2911 2897 self->fields_top = NULL; 2912 2898 qp_push_fields(self, self->def_fields, false); … … 2920 2906 mutex_init(&self->mutex, NULL); 2921 2907 return self; 2908 } 2909 2910 void qp_add_field(QParser *self, 2911 const char *field, 2912 bool is_default, 2913 bool is_tokenized) 2914 { 2915 field = intern(field); 2916 hs_add(self->all_fields, (char *)field); 2917 if (is_default) { 2918 hs_add(self->def_fields, (char *)field); 2919 } 2920 if (is_tokenized) { 2921 hs_add(self->tokenized_fields, (char *)field); 2922 } 2922 2923 } 2923 2924 -
c/src/q_parser.y
r4ba05f r8f9e90
