ferret 0.11.3 → 0.11.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +7 -1
- data/bin/ferret-browser +79 -0
- data/ext/analysis.c +5 -2
- data/ext/config.h +2 -1
- data/ext/ferret.c +32 -7
- data/ext/ferret.h +1 -0
- data/ext/index.c +69 -48
- data/ext/q_boolean.c +21 -7
- data/ext/q_parser.c +203 -113
- data/ext/q_span.c +2 -1
- data/ext/r_analysis.c +14 -1
- data/ext/r_index.c +179 -0
- data/ext/r_search.c +12 -30
- data/ext/search.c +1 -0
- data/ext/search.h +4 -0
- data/ext/store.c +24 -0
- data/ext/store.h +14 -0
- data/lib/ferret/browser.rb +246 -0
- data/lib/ferret/browser/s/global.js +192 -0
- data/lib/ferret/browser/s/style.css +148 -0
- data/lib/ferret/browser/views/document/list.rhtml +49 -0
- data/lib/ferret/browser/views/document/show.rhtml +27 -0
- data/lib/ferret/browser/views/error/index.rhtml +7 -0
- data/lib/ferret/browser/views/help/index.rhtml +8 -0
- data/lib/ferret/browser/views/home/index.rhtml +29 -0
- data/lib/ferret/browser/views/layout.rhtml +22 -0
- data/lib/ferret/browser/views/term-vector/index.rhtml +4 -0
- data/lib/ferret/browser/views/term/index.rhtml +199 -0
- data/lib/ferret/browser/views/term/termdocs.rhtml +1 -0
- data/lib/ferret/browser/webrick.rb +14 -0
- data/lib/ferret/index.rb +67 -36
- data/lib/ferret_version.rb +1 -1
- data/test/unit/analysis/tc_analyzer.rb +5 -5
- data/test/unit/analysis/tc_token_stream.rb +4 -4
- data/test/unit/index/tc_index.rb +1 -1
- data/test/unit/index/tc_index_reader.rb +37 -0
- data/test/unit/search/tc_spans.rb +18 -1
- metadata +18 -5
data/ext/q_parser.c
CHANGED
@@ -95,6 +95,7 @@
|
|
95
95
|
#include <string.h>
|
96
96
|
#include <ctype.h>
|
97
97
|
#include <wctype.h>
|
98
|
+
#include "except.h"
|
98
99
|
#include "search.h"
|
99
100
|
#include "array.h"
|
100
101
|
|
@@ -137,7 +138,7 @@ int qp_default_fuzzy_pre_len = 0;
|
|
137
138
|
|
138
139
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
139
140
|
typedef union YYSTYPE
|
140
|
-
#line
|
141
|
+
#line 27 "src/q_parser.y"
|
141
142
|
{
|
142
143
|
Query *query;
|
143
144
|
BooleanClause *bcls;
|
@@ -147,7 +148,7 @@ typedef union YYSTYPE
|
|
147
148
|
char *str;
|
148
149
|
}
|
149
150
|
/* Line 193 of yacc.c. */
|
150
|
-
#line
|
151
|
+
#line 152 "y.tab.c"
|
151
152
|
YYSTYPE;
|
152
153
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
153
154
|
# define YYSTYPE_IS_DECLARED 1
|
@@ -157,7 +158,7 @@ typedef union YYSTYPE
|
|
157
158
|
|
158
159
|
|
159
160
|
/* Copy the second part of user declarations. */
|
160
|
-
#line
|
161
|
+
#line 35 "src/q_parser.y"
|
161
162
|
|
162
163
|
static int yylex(YYSTYPE *lvalp, QParser *qp);
|
163
164
|
static int yyerror(QParser *qp, char const *msg);
|
@@ -169,6 +170,7 @@ static BCArray *first_cls(BooleanClause *boolean_clause);
|
|
169
170
|
static BCArray *add_and_cls(BCArray *bca, BooleanClause *clause);
|
170
171
|
static BCArray *add_or_cls(BCArray *bca, BooleanClause *clause);
|
171
172
|
static BCArray *add_default_cls(QParser *qp, BCArray *bca, BooleanClause *clause);
|
173
|
+
static void bca_destroy(BCArray *bca);
|
172
174
|
|
173
175
|
static BooleanClause *get_bool_cls(Query *q, unsigned int occur);
|
174
176
|
|
@@ -184,35 +186,55 @@ static Query *get_phrase_q(QParser *qp, Phrase *phrase, char *slop);
|
|
184
186
|
static Phrase *ph_first_word(char *word);
|
185
187
|
static Phrase *ph_add_word(Phrase *self, char *word);
|
186
188
|
static Phrase *ph_add_multi_word(Phrase *self, char *word);
|
189
|
+
static void ph_destroy(Phrase *self);
|
187
190
|
|
188
191
|
static Query *get_r_q(QParser *qp, char *field, char *from, char *to,
|
189
192
|
bool inc_lower, bool inc_upper);
|
190
193
|
|
191
194
|
#define FLDS(q, func) do {\
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
} else if (qp->fields->size == 1) {\
|
196
|
-
field = (char *)qp->fields->elems[0];\
|
197
|
-
q = func;\
|
198
|
-
} else {\
|
199
|
-
int i;Query *sq;\
|
200
|
-
q = bq_new(false);\
|
201
|
-
for (i = 0; i < qp->fields->size; i++) {\
|
202
|
-
field = (char *)qp->fields->elems[i];\
|
203
|
-
sq = func;\
|
204
|
-
if (sq) bq_add_query_nr(q, sq, BC_SHOULD);\
|
205
|
-
}\
|
206
|
-
if (((BooleanQuery *)q)->clause_cnt == 0) {\
|
207
|
-
q_deref(q);\
|
195
|
+
TRY {\
|
196
|
+
char *field;\
|
197
|
+
if (qp->fields->size == 0) {\
|
208
198
|
q = NULL;\
|
199
|
+
} else if (qp->fields->size == 1) {\
|
200
|
+
field = (char *)qp->fields->elems[0];\
|
201
|
+
q = func;\
|
202
|
+
} else {\
|
203
|
+
int i;Query *sq;\
|
204
|
+
q = bq_new_max(false, qp->max_clauses);\
|
205
|
+
for (i = 0; i < qp->fields->size; i++) {\
|
206
|
+
field = (char *)qp->fields->elems[i];\
|
207
|
+
sq = func;\
|
208
|
+
TRY\
|
209
|
+
if (sq) bq_add_query_nr(q, sq, BC_SHOULD);\
|
210
|
+
XCATCHALL\
|
211
|
+
if (sq) q_deref(sq);\
|
212
|
+
XENDTRY\
|
213
|
+
}\
|
214
|
+
if (((BooleanQuery *)q)->clause_cnt == 0) {\
|
215
|
+
q_deref(q);\
|
216
|
+
q = NULL;\
|
217
|
+
}\
|
209
218
|
}\
|
210
|
-
}\
|
219
|
+
} XCATCHALL\
|
220
|
+
qp->destruct = true;\
|
221
|
+
HANDLED();\
|
222
|
+
XENDTRY\
|
223
|
+
if (qp->destruct && !qp->recovering && q) {q_deref(q); q = NULL;}\
|
211
224
|
} while (0)
|
212
225
|
|
226
|
+
#define Y if (qp->destruct) goto yyerrorlab;
|
227
|
+
#define T TRY
|
228
|
+
#define E\
|
229
|
+
XCATCHALL\
|
230
|
+
qp->destruct = true;\
|
231
|
+
HANDLED();\
|
232
|
+
XENDTRY\
|
233
|
+
if (qp->destruct) Y;
|
234
|
+
|
213
235
|
|
214
236
|
/* Line 216 of yacc.c. */
|
215
|
-
#line
|
237
|
+
#line 238 "y.tab.c"
|
216
238
|
|
217
239
|
#ifdef short
|
218
240
|
# undef short
|
@@ -515,12 +537,12 @@ static const yytype_int8 yyrhs[] =
|
|
515
537
|
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
516
538
|
static const yytype_uint8 yyrline[] =
|
517
539
|
{
|
518
|
-
0,
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
540
|
+
0, 128, 128, 129, 131, 132, 133, 134, 136, 137,
|
541
|
+
138, 140, 141, 143, 144, 145, 146, 147, 148, 149,
|
542
|
+
151, 152, 153, 155, 157, 157, 159, 159, 159, 162,
|
543
|
+
163, 165, 166, 167, 168, 170, 171, 172, 173, 174,
|
544
|
+
176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
|
545
|
+
186, 187
|
524
546
|
};
|
525
547
|
#endif
|
526
548
|
|
@@ -1178,6 +1200,61 @@ yydestruct (yymsg, yytype, yyvaluep, qp)
|
|
1178
1200
|
|
1179
1201
|
switch (yytype)
|
1180
1202
|
{
|
1203
|
+
case 27: /* "bool_q" */
|
1204
|
+
#line 123 "src/q_parser.y"
|
1205
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1206
|
+
#line 1207 "y.tab.c"
|
1207
|
+
break;
|
1208
|
+
case 28: /* "bool_clss" */
|
1209
|
+
#line 125 "src/q_parser.y"
|
1210
|
+
{ if ((yyvaluep->bclss) && qp->destruct) bca_destroy((yyvaluep->bclss)); };
|
1211
|
+
#line 1212 "y.tab.c"
|
1212
|
+
break;
|
1213
|
+
case 29: /* "bool_cls" */
|
1214
|
+
#line 124 "src/q_parser.y"
|
1215
|
+
{ if ((yyvaluep->bcls) && qp->destruct) bc_deref((yyvaluep->bcls)); };
|
1216
|
+
#line 1217 "y.tab.c"
|
1217
|
+
break;
|
1218
|
+
case 30: /* "boosted_q" */
|
1219
|
+
#line 123 "src/q_parser.y"
|
1220
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1221
|
+
#line 1222 "y.tab.c"
|
1222
|
+
break;
|
1223
|
+
case 31: /* "q" */
|
1224
|
+
#line 123 "src/q_parser.y"
|
1225
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1226
|
+
#line 1227 "y.tab.c"
|
1227
|
+
break;
|
1228
|
+
case 32: /* "term_q" */
|
1229
|
+
#line 123 "src/q_parser.y"
|
1230
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1231
|
+
#line 1232 "y.tab.c"
|
1232
|
+
break;
|
1233
|
+
case 33: /* "wild_q" */
|
1234
|
+
#line 123 "src/q_parser.y"
|
1235
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1236
|
+
#line 1237 "y.tab.c"
|
1237
|
+
break;
|
1238
|
+
case 34: /* "field_q" */
|
1239
|
+
#line 123 "src/q_parser.y"
|
1240
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1241
|
+
#line 1242 "y.tab.c"
|
1242
|
+
break;
|
1243
|
+
case 39: /* "phrase_q" */
|
1244
|
+
#line 123 "src/q_parser.y"
|
1245
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1246
|
+
#line 1247 "y.tab.c"
|
1247
|
+
break;
|
1248
|
+
case 40: /* "ph_words" */
|
1249
|
+
#line 126 "src/q_parser.y"
|
1250
|
+
{ if ((yyvaluep->phrase) && qp->destruct) ph_destroy((yyvaluep->phrase)); };
|
1251
|
+
#line 1252 "y.tab.c"
|
1252
|
+
break;
|
1253
|
+
case 41: /* "range_q" */
|
1254
|
+
#line 123 "src/q_parser.y"
|
1255
|
+
{ if ((yyvaluep->query) && qp->destruct) q_deref((yyvaluep->query)); };
|
1256
|
+
#line 1257 "y.tab.c"
|
1257
|
+
break;
|
1181
1258
|
|
1182
1259
|
default:
|
1183
1260
|
break;
|
@@ -1485,228 +1562,228 @@ yyreduce:
|
|
1485
1562
|
switch (yyn)
|
1486
1563
|
{
|
1487
1564
|
case 2:
|
1488
|
-
#line
|
1489
|
-
{
|
1565
|
+
#line 128 "src/q_parser.y"
|
1566
|
+
{ qp->result = (yyval.query) = NULL; }
|
1490
1567
|
break;
|
1491
1568
|
|
1492
1569
|
case 3:
|
1493
|
-
#line
|
1494
|
-
{ qp->result = (yyval.query) = get_bool_q((yyvsp[(1) - (1)].bclss)); }
|
1570
|
+
#line 129 "src/q_parser.y"
|
1571
|
+
{ T qp->result = (yyval.query) = get_bool_q((yyvsp[(1) - (1)].bclss)); E }
|
1495
1572
|
break;
|
1496
1573
|
|
1497
1574
|
case 4:
|
1498
|
-
#line
|
1499
|
-
{ (yyval.bclss) = first_cls((yyvsp[(1) - (1)].bcls)); }
|
1575
|
+
#line 131 "src/q_parser.y"
|
1576
|
+
{ T (yyval.bclss) = first_cls((yyvsp[(1) - (1)].bcls)); E }
|
1500
1577
|
break;
|
1501
1578
|
|
1502
1579
|
case 5:
|
1503
|
-
#line
|
1504
|
-
{ (yyval.bclss) = add_and_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); }
|
1580
|
+
#line 132 "src/q_parser.y"
|
1581
|
+
{ T (yyval.bclss) = add_and_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E }
|
1505
1582
|
break;
|
1506
1583
|
|
1507
1584
|
case 6:
|
1508
|
-
#line
|
1509
|
-
{ (yyval.bclss) = add_or_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); }
|
1585
|
+
#line 133 "src/q_parser.y"
|
1586
|
+
{ T (yyval.bclss) = add_or_cls((yyvsp[(1) - (3)].bclss), (yyvsp[(3) - (3)].bcls)); E }
|
1510
1587
|
break;
|
1511
1588
|
|
1512
1589
|
case 7:
|
1513
|
-
#line
|
1514
|
-
{ (yyval.bclss) = add_default_cls(qp, (yyvsp[(1) - (2)].bclss), (yyvsp[(2) - (2)].bcls)); }
|
1590
|
+
#line 134 "src/q_parser.y"
|
1591
|
+
{ T (yyval.bclss) = add_default_cls(qp, (yyvsp[(1) - (2)].bclss), (yyvsp[(2) - (2)].bcls)); E }
|
1515
1592
|
break;
|
1516
1593
|
|
1517
1594
|
case 8:
|
1518
|
-
#line
|
1519
|
-
{ (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST); }
|
1595
|
+
#line 136 "src/q_parser.y"
|
1596
|
+
{ T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST); E }
|
1520
1597
|
break;
|
1521
1598
|
|
1522
1599
|
case 9:
|
1523
|
-
#line
|
1524
|
-
{ (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST_NOT); }
|
1600
|
+
#line 137 "src/q_parser.y"
|
1601
|
+
{ T (yyval.bcls) = get_bool_cls((yyvsp[(2) - (2)].query), BC_MUST_NOT); E }
|
1525
1602
|
break;
|
1526
1603
|
|
1527
1604
|
case 10:
|
1528
|
-
#line
|
1529
|
-
{ (yyval.bcls) = get_bool_cls((yyvsp[(1) - (1)].query), BC_SHOULD); }
|
1605
|
+
#line 138 "src/q_parser.y"
|
1606
|
+
{ T (yyval.bcls) = get_bool_cls((yyvsp[(1) - (1)].query), BC_SHOULD); E }
|
1530
1607
|
break;
|
1531
1608
|
|
1532
1609
|
case 12:
|
1533
|
-
#line
|
1534
|
-
{ if ((yyvsp[(1) - (3)].query)) sscanf((yyvsp[(3) - (3)].str),"%f",&((yyvsp[(1) - (3)].query)->boost));
|
1610
|
+
#line 141 "src/q_parser.y"
|
1611
|
+
{ T if ((yyvsp[(1) - (3)].query)) sscanf((yyvsp[(3) - (3)].str),"%f",&((yyvsp[(1) - (3)].query)->boost)); (yyval.query)=(yyvsp[(1) - (3)].query); E }
|
1535
1612
|
break;
|
1536
1613
|
|
1537
1614
|
case 14:
|
1538
|
-
#line
|
1539
|
-
{ (yyval.query) =
|
1615
|
+
#line 144 "src/q_parser.y"
|
1616
|
+
{ T (yyval.query) = bq_new_max(true, qp->max_clauses); E }
|
1540
1617
|
break;
|
1541
1618
|
|
1542
1619
|
case 15:
|
1543
|
-
#line
|
1544
|
-
{ (yyval.query) = get_bool_q((yyvsp[(2) - (3)].bclss)); }
|
1620
|
+
#line 145 "src/q_parser.y"
|
1621
|
+
{ T (yyval.query) = get_bool_q((yyvsp[(2) - (3)].bclss)); E }
|
1545
1622
|
break;
|
1546
1623
|
|
1547
1624
|
case 20:
|
1548
|
-
#line
|
1549
|
-
{ FLDS((yyval.query), get_term_q(qp, field, (yyvsp[(1) - (1)].str))); }
|
1625
|
+
#line 151 "src/q_parser.y"
|
1626
|
+
{ FLDS((yyval.query), get_term_q(qp, field, (yyvsp[(1) - (1)].str))); Y}
|
1550
1627
|
break;
|
1551
1628
|
|
1552
1629
|
case 21:
|
1553
|
-
#line
|
1554
|
-
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); }
|
1630
|
+
#line 152 "src/q_parser.y"
|
1631
|
+
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str))); Y}
|
1555
1632
|
break;
|
1556
1633
|
|
1557
1634
|
case 22:
|
1558
|
-
#line
|
1559
|
-
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (2)].str), NULL)); }
|
1635
|
+
#line 153 "src/q_parser.y"
|
1636
|
+
{ FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[(1) - (2)].str), NULL)); Y}
|
1560
1637
|
break;
|
1561
1638
|
|
1562
1639
|
case 23:
|
1563
|
-
#line
|
1564
|
-
{ FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[(1) - (1)].str))); }
|
1640
|
+
#line 155 "src/q_parser.y"
|
1641
|
+
{ FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[(1) - (1)].str))); Y}
|
1565
1642
|
break;
|
1566
1643
|
|
1567
1644
|
case 24:
|
1568
|
-
#line
|
1645
|
+
#line 157 "src/q_parser.y"
|
1569
1646
|
{ qp->fields = qp->def_fields; }
|
1570
1647
|
break;
|
1571
1648
|
|
1572
1649
|
case 25:
|
1573
|
-
#line
|
1650
|
+
#line 158 "src/q_parser.y"
|
1574
1651
|
{ (yyval.query) = (yyvsp[(3) - (4)].query); }
|
1575
1652
|
break;
|
1576
1653
|
|
1577
1654
|
case 26:
|
1578
|
-
#line
|
1655
|
+
#line 159 "src/q_parser.y"
|
1579
1656
|
{ qp->fields = qp->all_fields; }
|
1580
1657
|
break;
|
1581
1658
|
|
1582
1659
|
case 27:
|
1583
|
-
#line
|
1660
|
+
#line 159 "src/q_parser.y"
|
1584
1661
|
{qp->fields = qp->def_fields;}
|
1585
1662
|
break;
|
1586
1663
|
|
1587
1664
|
case 28:
|
1588
|
-
#line
|
1665
|
+
#line 160 "src/q_parser.y"
|
1589
1666
|
{ (yyval.query) = (yyvsp[(4) - (5)].query); }
|
1590
1667
|
break;
|
1591
1668
|
|
1592
1669
|
case 29:
|
1593
|
-
#line
|
1670
|
+
#line 162 "src/q_parser.y"
|
1594
1671
|
{ (yyval.hashset) = first_field(qp, (yyvsp[(1) - (1)].str)); }
|
1595
1672
|
break;
|
1596
1673
|
|
1597
1674
|
case 30:
|
1598
|
-
#line
|
1675
|
+
#line 163 "src/q_parser.y"
|
1599
1676
|
{ (yyval.hashset) = add_field(qp, (yyvsp[(3) - (3)].str));}
|
1600
1677
|
break;
|
1601
1678
|
|
1602
1679
|
case 31:
|
1603
|
-
#line
|
1680
|
+
#line 165 "src/q_parser.y"
|
1604
1681
|
{ (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (3)].phrase), NULL); }
|
1605
1682
|
break;
|
1606
1683
|
|
1607
1684
|
case 32:
|
1608
|
-
#line
|
1685
|
+
#line 166 "src/q_parser.y"
|
1609
1686
|
{ (yyval.query) = get_phrase_q(qp, (yyvsp[(2) - (5)].phrase), (yyvsp[(5) - (5)].str)); }
|
1610
1687
|
break;
|
1611
1688
|
|
1612
1689
|
case 33:
|
1613
|
-
#line
|
1690
|
+
#line 167 "src/q_parser.y"
|
1614
1691
|
{ (yyval.query) = NULL; }
|
1615
1692
|
break;
|
1616
1693
|
|
1617
1694
|
case 34:
|
1618
|
-
#line
|
1619
|
-
{ (yyval.query) = NULL; }
|
1695
|
+
#line 168 "src/q_parser.y"
|
1696
|
+
{ (yyval.query) = NULL; (void)(yyvsp[(4) - (4)].str);}
|
1620
1697
|
break;
|
1621
1698
|
|
1622
1699
|
case 35:
|
1623
|
-
#line
|
1700
|
+
#line 170 "src/q_parser.y"
|
1624
1701
|
{ (yyval.phrase) = ph_first_word((yyvsp[(1) - (1)].str)); }
|
1625
1702
|
break;
|
1626
1703
|
|
1627
1704
|
case 36:
|
1628
|
-
#line
|
1705
|
+
#line 171 "src/q_parser.y"
|
1629
1706
|
{ (yyval.phrase) = ph_first_word(NULL); }
|
1630
1707
|
break;
|
1631
1708
|
|
1632
1709
|
case 37:
|
1633
|
-
#line
|
1710
|
+
#line 172 "src/q_parser.y"
|
1634
1711
|
{ (yyval.phrase) = ph_add_word((yyvsp[(1) - (2)].phrase), (yyvsp[(2) - (2)].str)); }
|
1635
1712
|
break;
|
1636
1713
|
|
1637
1714
|
case 38:
|
1638
|
-
#line
|
1715
|
+
#line 173 "src/q_parser.y"
|
1639
1716
|
{ (yyval.phrase) = ph_add_word((yyvsp[(1) - (3)].phrase), NULL); }
|
1640
1717
|
break;
|
1641
1718
|
|
1642
1719
|
case 39:
|
1643
|
-
#line
|
1720
|
+
#line 174 "src/q_parser.y"
|
1644
1721
|
{ (yyval.phrase) = ph_add_multi_word((yyvsp[(1) - (3)].phrase), (yyvsp[(3) - (3)].str)); }
|
1645
1722
|
break;
|
1646
1723
|
|
1647
1724
|
case 40:
|
1648
|
-
#line
|
1649
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, true)); }
|
1725
|
+
#line 176 "src/q_parser.y"
|
1726
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, true)); Y}
|
1650
1727
|
break;
|
1651
1728
|
|
1652
1729
|
case 41:
|
1653
|
-
#line
|
1654
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, false)); }
|
1730
|
+
#line 177 "src/q_parser.y"
|
1731
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), true, false)); Y}
|
1655
1732
|
break;
|
1656
1733
|
|
1657
1734
|
case 42:
|
1658
|
-
#line
|
1659
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, true)); }
|
1735
|
+
#line 178 "src/q_parser.y"
|
1736
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, true)); Y}
|
1660
1737
|
break;
|
1661
1738
|
|
1662
1739
|
case 43:
|
1663
|
-
#line
|
1664
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, false)); }
|
1740
|
+
#line 179 "src/q_parser.y"
|
1741
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].str), false, false)); Y}
|
1665
1742
|
break;
|
1666
1743
|
|
1667
1744
|
case 44:
|
1668
|
-
#line
|
1669
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, false)); }
|
1745
|
+
#line 180 "src/q_parser.y"
|
1746
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, false)); Y}
|
1670
1747
|
break;
|
1671
1748
|
|
1672
1749
|
case 45:
|
1673
|
-
#line
|
1674
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, true)); }
|
1750
|
+
#line 181 "src/q_parser.y"
|
1751
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (3)].str), false, true)); Y}
|
1675
1752
|
break;
|
1676
1753
|
|
1677
1754
|
case 46:
|
1678
|
-
#line
|
1679
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,true, false)); }
|
1755
|
+
#line 182 "src/q_parser.y"
|
1756
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,true, false)); Y}
|
1680
1757
|
break;
|
1681
1758
|
|
1682
1759
|
case 47:
|
1683
|
-
#line
|
1684
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,false, false)); }
|
1760
|
+
#line 183 "src/q_parser.y"
|
1761
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (3)].str), NULL,false, false)); Y}
|
1685
1762
|
break;
|
1686
1763
|
|
1687
1764
|
case 48:
|
1688
|
-
#line
|
1689
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (2)].str), false, false)); }
|
1765
|
+
#line 184 "src/q_parser.y"
|
1766
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(2) - (2)].str), false, false)); Y}
|
1690
1767
|
break;
|
1691
1768
|
|
1692
1769
|
case 49:
|
1693
|
-
#line
|
1694
|
-
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(3) - (3)].str), false, true)); }
|
1770
|
+
#line 185 "src/q_parser.y"
|
1771
|
+
{ FLDS((yyval.query), get_r_q(qp, field, NULL,(yyvsp[(3) - (3)].str), false, true)); Y}
|
1695
1772
|
break;
|
1696
1773
|
|
1697
1774
|
case 50:
|
1698
|
-
#line
|
1699
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(3) - (3)].str), NULL,true, false)); }
|
1775
|
+
#line 186 "src/q_parser.y"
|
1776
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(3) - (3)].str), NULL,true, false)); Y}
|
1700
1777
|
break;
|
1701
1778
|
|
1702
1779
|
case 51:
|
1703
|
-
#line
|
1704
|
-
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (2)].str), NULL,false, false)); }
|
1780
|
+
#line 187 "src/q_parser.y"
|
1781
|
+
{ FLDS((yyval.query), get_r_q(qp, field, (yyvsp[(2) - (2)].str), NULL,false, false)); Y}
|
1705
1782
|
break;
|
1706
1783
|
|
1707
1784
|
|
1708
1785
|
/* Line 1267 of yacc.c. */
|
1709
|
-
#line
|
1786
|
+
#line 1787 "y.tab.c"
|
1710
1787
|
default: break;
|
1711
1788
|
}
|
1712
1789
|
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
|
@@ -1920,7 +1997,7 @@ yyreturn:
|
|
1920
1997
|
}
|
1921
1998
|
|
1922
1999
|
|
1923
|
-
#line
|
2000
|
+
#line 189 "src/q_parser.y"
|
1924
2001
|
|
1925
2002
|
|
1926
2003
|
const char *special_char = "&:()[]{}!\"~^|<>=*?+-";
|
@@ -2039,6 +2116,7 @@ static int yylex(YYSTYPE *lvalp, QParser *qp)
|
|
2039
2116
|
|
2040
2117
|
static int yyerror(QParser *qp, char const *msg)
|
2041
2118
|
{
|
2119
|
+
qp->destruct = true;
|
2042
2120
|
if (!qp->handle_parse_errors) {
|
2043
2121
|
char buf[1024];
|
2044
2122
|
buf[1023] = '\0';
|
@@ -2047,8 +2125,9 @@ static int yyerror(QParser *qp, char const *msg)
|
|
2047
2125
|
free(qp->qstr);
|
2048
2126
|
}
|
2049
2127
|
mutex_unlock(&qp->mutex);
|
2050
|
-
|
2051
|
-
|
2128
|
+
snprintf(xmsg_buffer, XMSG_BUFFER_SIZE,
|
2129
|
+
"couldn't parse query ``%s''. Error message "
|
2130
|
+
" was %s", buf, (char *)msg);
|
2052
2131
|
}
|
2053
2132
|
return 0;
|
2054
2133
|
}
|
@@ -2177,6 +2256,16 @@ static BCArray *add_default_cls(QParser *qp, BCArray *bca,
|
|
2177
2256
|
return bca;
|
2178
2257
|
}
|
2179
2258
|
|
2259
|
+
static void bca_destroy(BCArray *bca)
|
2260
|
+
{
|
2261
|
+
int i;
|
2262
|
+
for (i = 0; i < bca->size; i++) {
|
2263
|
+
bc_deref(bca->clauses[i]);
|
2264
|
+
}
|
2265
|
+
free(bca->clauses);
|
2266
|
+
free(bca);
|
2267
|
+
}
|
2268
|
+
|
2180
2269
|
static BooleanClause *get_bool_cls(Query *q, unsigned int occur)
|
2181
2270
|
{
|
2182
2271
|
if (q) {
|
@@ -2400,7 +2489,7 @@ static Query *get_phrase_query(QParser *qp, char *field,
|
|
2400
2489
|
}
|
2401
2490
|
else {
|
2402
2491
|
int i;
|
2403
|
-
q =
|
2492
|
+
q = bq_new_max(false, qp->max_clauses);
|
2404
2493
|
for (i = 0; i < word_count; i++) {
|
2405
2494
|
bq_add_query_nr(q, get_term_q(qp, field, words[i]), BC_SHOULD);
|
2406
2495
|
}
|
@@ -2465,7 +2554,7 @@ static Query *get_phrase_query(QParser *qp, char *field,
|
|
2465
2554
|
|
2466
2555
|
static Query *get_phrase_q(QParser *qp, Phrase *phrase, char *slop_str)
|
2467
2556
|
{
|
2468
|
-
Query *q;
|
2557
|
+
Query *q = NULL;
|
2469
2558
|
FLDS(q, get_phrase_query(qp, field, phrase, slop_str));
|
2470
2559
|
ph_destroy(phrase);
|
2471
2560
|
return q;
|
@@ -2664,7 +2753,8 @@ char *qp_clean_str(char *str)
|
|
2664
2753
|
|
2665
2754
|
Query *qp_get_bad_query(QParser *qp, char *str)
|
2666
2755
|
{
|
2667
|
-
Query *q;
|
2756
|
+
Query *volatile q = NULL;
|
2757
|
+
qp->recovering = true;
|
2668
2758
|
FLDS(q, get_term_q(qp, field, str));
|
2669
2759
|
return q;
|
2670
2760
|
}
|
@@ -2673,6 +2763,7 @@ Query *qp_parse(QParser *self, char *qstr)
|
|
2673
2763
|
{
|
2674
2764
|
Query *result = NULL;
|
2675
2765
|
mutex_lock(&self->mutex);
|
2766
|
+
self->recovering = self->destruct = false;
|
2676
2767
|
if (self->clean_str) {
|
2677
2768
|
self->qstrp = self->qstr = qp_clean_str(qstr);
|
2678
2769
|
}
|
@@ -2682,15 +2773,14 @@ Query *qp_parse(QParser *self, char *qstr)
|
|
2682
2773
|
self->fields = self->def_fields;
|
2683
2774
|
self->result = NULL;
|
2684
2775
|
|
2685
|
-
|
2686
|
-
yyparse(self);
|
2687
|
-
result = self->result;
|
2688
|
-
XCATCHALL
|
2689
|
-
if (self->handle_parse_errors) HANDLED();
|
2690
|
-
XENDTRY
|
2776
|
+
if (0 == yyparse(self)) result = self->result;
|
2691
2777
|
if (!result && self->handle_parse_errors) {
|
2778
|
+
self->destruct = false;
|
2692
2779
|
result = qp_get_bad_query(self, self->qstr);
|
2693
2780
|
}
|
2781
|
+
if (self->destruct && !self->handle_parse_errors) {
|
2782
|
+
xraise(PARSE_ERROR, xmsg_buffer);
|
2783
|
+
}
|
2694
2784
|
if (!result) {
|
2695
2785
|
result = bq_new(false);
|
2696
2786
|
}
|