ferret 0.9.5 → 0.9.6

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/ext/ind.c CHANGED
@@ -283,6 +283,7 @@ TopDocs *index_search_str(Index *self, char *qstr, int first_doc,
283
283
  Query *query;
284
284
  TopDocs *td;
285
285
  query = index_get_query(self, qstr); /* will ensure_searcher is open */
286
+ //printf(">> %s <<\n", query->to_s(query, ""));
286
287
  td = sea_search(self->sea, query, first_doc, num_docs, filter, sort);
287
288
  q_deref(query);
288
289
  return td;
data/ext/q_fuzzy.c CHANGED
@@ -65,7 +65,6 @@ float fuzq_score(FuzzyQuery *fuzq, char *target)
65
65
  if (((m+1) * (n+1)) >= fuzq->da_capa) {
66
66
  fuzq->da_capa = ((m+1) * (n+1)) * 2;
67
67
  REALLOC_N(fuzq->da, int, fuzq->da_capa);
68
- printf("making capa %d -> %d\n", fuzq->da_capa, (int)fuzq->da);
69
68
  d = fuzq->da;
70
69
  }
71
70
 
@@ -253,9 +252,7 @@ void fuzq_destroy(Query *self)
253
252
  {
254
253
  FuzzyQuery *fuzq = (FuzzyQuery *)self->data;
255
254
  if (self->destroy_all) term_destroy((Term *)fuzq->term);
256
- printf("freeing %d -> %d\n", fuzq->da_capa, (int)fuzq->da);
257
255
  free(fuzq->da);
258
- printf("success\n");
259
256
  free(fuzq);
260
257
  q_destroy_i(self);
261
258
  }
data/ext/q_parser.c CHANGED
@@ -179,12 +179,16 @@ Query *get_range_q(char *field, char *from, char *to,
179
179
  sq = func;\
180
180
  if (sq) bq_add_query(q, sq, BC_SHOULD);\
181
181
  }\
182
+ if (((BooleanQuery *)q->data)->clause_cnt == 0) {\
183
+ q_deref(q);\
184
+ q = NULL;\
185
+ }\
182
186
  }\
183
187
  } while (0)
184
188
 
185
189
 
186
190
  /* Line 219 of yacc.c. */
187
- #line 188 "y.tab.c"
191
+ #line 192 "y.tab.c"
188
192
 
189
193
  #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
190
194
  # define YYSIZE_T __SIZE_TYPE__
@@ -423,12 +427,12 @@ static const yysigned_char yyrhs[] =
423
427
  /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
424
428
  static const unsigned char yyrline[] =
425
429
  {
426
- 0, 86, 86, 87, 89, 90, 91, 92, 94, 95,
427
- 96, 98, 99, 101, 102, 103, 104, 105, 106, 108,
428
- 109, 110, 112, 114, 114, 116, 116, 116, 119, 120,
429
- 122, 123, 124, 125, 127, 128, 129, 130, 131, 133,
430
- 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
431
- 144
430
+ 0, 90, 90, 91, 93, 94, 95, 96, 98, 99,
431
+ 100, 102, 103, 105, 106, 107, 108, 109, 110, 112,
432
+ 113, 114, 116, 118, 118, 120, 120, 120, 123, 124,
433
+ 126, 127, 128, 129, 131, 132, 133, 134, 135, 137,
434
+ 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
435
+ 148
432
436
  };
433
437
  #endif
434
438
 
@@ -1236,217 +1240,217 @@ yyreduce:
1236
1240
  switch (yyn)
1237
1241
  {
1238
1242
  case 2:
1239
- #line 86 "src/query_parser/q_parser.y"
1243
+ #line 90 "src/query_parser/q_parser.y"
1240
1244
  { qp->result = (yyval.query) = NULL; }
1241
1245
  break;
1242
1246
 
1243
1247
  case 3:
1244
- #line 87 "src/query_parser/q_parser.y"
1248
+ #line 91 "src/query_parser/q_parser.y"
1245
1249
  { qp->result = (yyval.query) = get_bool_q((yyvsp[0].array)); }
1246
1250
  break;
1247
1251
 
1248
1252
  case 4:
1249
- #line 89 "src/query_parser/q_parser.y"
1253
+ #line 93 "src/query_parser/q_parser.y"
1250
1254
  { (yyval.array) = first_cls((yyvsp[0].bcls)); }
1251
1255
  break;
1252
1256
 
1253
1257
  case 5:
1254
- #line 90 "src/query_parser/q_parser.y"
1258
+ #line 94 "src/query_parser/q_parser.y"
1255
1259
  { (yyval.array) = add_and_cls((yyvsp[-2].array), (yyvsp[0].bcls)); }
1256
1260
  break;
1257
1261
 
1258
1262
  case 6:
1259
- #line 91 "src/query_parser/q_parser.y"
1263
+ #line 95 "src/query_parser/q_parser.y"
1260
1264
  { (yyval.array) = add_or_cls((yyvsp[-2].array), (yyvsp[0].bcls)); }
1261
1265
  break;
1262
1266
 
1263
1267
  case 7:
1264
- #line 92 "src/query_parser/q_parser.y"
1268
+ #line 96 "src/query_parser/q_parser.y"
1265
1269
  { (yyval.array) = add_default_cls(qp, (yyvsp[-1].array), (yyvsp[0].bcls)); }
1266
1270
  break;
1267
1271
 
1268
1272
  case 8:
1269
- #line 94 "src/query_parser/q_parser.y"
1273
+ #line 98 "src/query_parser/q_parser.y"
1270
1274
  { (yyval.bcls) = get_bool_cls((yyvsp[0].query), BC_MUST); }
1271
1275
  break;
1272
1276
 
1273
1277
  case 9:
1274
- #line 95 "src/query_parser/q_parser.y"
1278
+ #line 99 "src/query_parser/q_parser.y"
1275
1279
  { (yyval.bcls) = get_bool_cls((yyvsp[0].query), BC_MUST_NOT); }
1276
1280
  break;
1277
1281
 
1278
1282
  case 10:
1279
- #line 96 "src/query_parser/q_parser.y"
1283
+ #line 100 "src/query_parser/q_parser.y"
1280
1284
  { (yyval.bcls) = get_bool_cls((yyvsp[0].query), BC_SHOULD); }
1281
1285
  break;
1282
1286
 
1283
1287
  case 12:
1284
- #line 99 "src/query_parser/q_parser.y"
1288
+ #line 103 "src/query_parser/q_parser.y"
1285
1289
  { if ((yyvsp[-2].query)) sscanf((yyvsp[0].str),"%f",&((yyvsp[-2].query)->boost)); (yyval.query)=(yyvsp[-2].query); }
1286
1290
  break;
1287
1291
 
1288
1292
  case 14:
1289
- #line 102 "src/query_parser/q_parser.y"
1293
+ #line 106 "src/query_parser/q_parser.y"
1290
1294
  { (yyval.query) = get_bool_q((yyvsp[-1].array)); }
1291
1295
  break;
1292
1296
 
1293
1297
  case 19:
1294
- #line 108 "src/query_parser/q_parser.y"
1298
+ #line 112 "src/query_parser/q_parser.y"
1295
1299
  { FLDS((yyval.query), get_term_q(qp, field, (yyvsp[0].str))); }
1296
1300
  break;
1297
1301
 
1298
1302
  case 20:
1299
- #line 109 "src/query_parser/q_parser.y"
1303
+ #line 113 "src/query_parser/q_parser.y"
1300
1304
  { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[-2].str), (yyvsp[0].str))); }
1301
1305
  break;
1302
1306
 
1303
1307
  case 21:
1304
- #line 110 "src/query_parser/q_parser.y"
1308
+ #line 114 "src/query_parser/q_parser.y"
1305
1309
  { FLDS((yyval.query), get_fuzzy_q(qp, field, (yyvsp[-1].str), NULL)); }
1306
1310
  break;
1307
1311
 
1308
1312
  case 22:
1309
- #line 112 "src/query_parser/q_parser.y"
1313
+ #line 116 "src/query_parser/q_parser.y"
1310
1314
  { FLDS((yyval.query), get_wild_q(qp, field, (yyvsp[0].str))); }
1311
1315
  break;
1312
1316
 
1313
1317
  case 23:
1314
- #line 114 "src/query_parser/q_parser.y"
1318
+ #line 118 "src/query_parser/q_parser.y"
1315
1319
  { qp->fields = qp->def_fields; }
1316
1320
  break;
1317
1321
 
1318
1322
  case 24:
1319
- #line 115 "src/query_parser/q_parser.y"
1323
+ #line 119 "src/query_parser/q_parser.y"
1320
1324
  { (yyval.query) = (yyvsp[-1].query); }
1321
1325
  break;
1322
1326
 
1323
1327
  case 25:
1324
- #line 116 "src/query_parser/q_parser.y"
1328
+ #line 120 "src/query_parser/q_parser.y"
1325
1329
  { qp->fields = qp->all_fields; }
1326
1330
  break;
1327
1331
 
1328
1332
  case 26:
1329
- #line 116 "src/query_parser/q_parser.y"
1333
+ #line 120 "src/query_parser/q_parser.y"
1330
1334
  {qp->fields = qp->def_fields;}
1331
1335
  break;
1332
1336
 
1333
1337
  case 27:
1334
- #line 117 "src/query_parser/q_parser.y"
1338
+ #line 121 "src/query_parser/q_parser.y"
1335
1339
  { (yyval.query) = (yyvsp[-1].query); }
1336
1340
  break;
1337
1341
 
1338
1342
  case 28:
1339
- #line 119 "src/query_parser/q_parser.y"
1343
+ #line 123 "src/query_parser/q_parser.y"
1340
1344
  { (yyval.hashset) = first_field(qp, (yyvsp[0].str)); }
1341
1345
  break;
1342
1346
 
1343
1347
  case 29:
1344
- #line 120 "src/query_parser/q_parser.y"
1348
+ #line 124 "src/query_parser/q_parser.y"
1345
1349
  { (yyval.hashset) = add_field(qp, (yyvsp[0].str));}
1346
1350
  break;
1347
1351
 
1348
1352
  case 30:
1349
- #line 122 "src/query_parser/q_parser.y"
1353
+ #line 126 "src/query_parser/q_parser.y"
1350
1354
  { (yyval.query) = get_phrase_q(qp, (yyvsp[-1].phrase), NULL); }
1351
1355
  break;
1352
1356
 
1353
1357
  case 31:
1354
- #line 123 "src/query_parser/q_parser.y"
1358
+ #line 127 "src/query_parser/q_parser.y"
1355
1359
  { (yyval.query) = get_phrase_q(qp, (yyvsp[-3].phrase), (yyvsp[0].str)); }
1356
1360
  break;
1357
1361
 
1358
1362
  case 32:
1359
- #line 124 "src/query_parser/q_parser.y"
1363
+ #line 128 "src/query_parser/q_parser.y"
1360
1364
  { (yyval.query) = NULL; }
1361
1365
  break;
1362
1366
 
1363
1367
  case 33:
1364
- #line 125 "src/query_parser/q_parser.y"
1368
+ #line 129 "src/query_parser/q_parser.y"
1365
1369
  { (yyval.query) = NULL; }
1366
1370
  break;
1367
1371
 
1368
1372
  case 34:
1369
- #line 127 "src/query_parser/q_parser.y"
1373
+ #line 131 "src/query_parser/q_parser.y"
1370
1374
  { (yyval.phrase) = ph_first_word((yyvsp[0].str)); }
1371
1375
  break;
1372
1376
 
1373
1377
  case 35:
1374
- #line 128 "src/query_parser/q_parser.y"
1378
+ #line 132 "src/query_parser/q_parser.y"
1375
1379
  { (yyval.phrase) = ph_first_word(NULL); }
1376
1380
  break;
1377
1381
 
1378
1382
  case 36:
1379
- #line 129 "src/query_parser/q_parser.y"
1383
+ #line 133 "src/query_parser/q_parser.y"
1380
1384
  { (yyval.phrase) = ph_add_word((yyvsp[-1].phrase), (yyvsp[0].str)); }
1381
1385
  break;
1382
1386
 
1383
1387
  case 37:
1384
- #line 130 "src/query_parser/q_parser.y"
1388
+ #line 134 "src/query_parser/q_parser.y"
1385
1389
  { (yyval.phrase) = ph_add_word((yyvsp[-2].phrase), NULL); }
1386
1390
  break;
1387
1391
 
1388
1392
  case 38:
1389
- #line 131 "src/query_parser/q_parser.y"
1393
+ #line 135 "src/query_parser/q_parser.y"
1390
1394
  { (yyval.phrase) = ph_add_multi_word((yyvsp[-2].phrase), (yyvsp[0].str)); }
1391
1395
  break;
1392
1396
 
1393
1397
  case 39:
1394
- #line 133 "src/query_parser/q_parser.y"
1398
+ #line 137 "src/query_parser/q_parser.y"
1395
1399
  { FLDS((yyval.query), get_range_q(field, (yyvsp[-2].str), (yyvsp[-1].str), true, true)); }
1396
1400
  break;
1397
1401
 
1398
1402
  case 40:
1399
- #line 134 "src/query_parser/q_parser.y"
1403
+ #line 138 "src/query_parser/q_parser.y"
1400
1404
  { FLDS((yyval.query), get_range_q(field, (yyvsp[-2].str), (yyvsp[-1].str), true, false)); }
1401
1405
  break;
1402
1406
 
1403
1407
  case 41:
1404
- #line 135 "src/query_parser/q_parser.y"
1408
+ #line 139 "src/query_parser/q_parser.y"
1405
1409
  { FLDS((yyval.query), get_range_q(field, (yyvsp[-2].str), (yyvsp[-1].str), false, true)); }
1406
1410
  break;
1407
1411
 
1408
1412
  case 42:
1409
- #line 136 "src/query_parser/q_parser.y"
1413
+ #line 140 "src/query_parser/q_parser.y"
1410
1414
  { FLDS((yyval.query), get_range_q(field, (yyvsp[-2].str), (yyvsp[-1].str), false, false)); }
1411
1415
  break;
1412
1416
 
1413
1417
  case 43:
1414
- #line 137 "src/query_parser/q_parser.y"
1418
+ #line 141 "src/query_parser/q_parser.y"
1415
1419
  { FLDS((yyval.query), get_range_q(field, NULL,(yyvsp[-1].str), false, false)); }
1416
1420
  break;
1417
1421
 
1418
1422
  case 44:
1419
- #line 138 "src/query_parser/q_parser.y"
1423
+ #line 142 "src/query_parser/q_parser.y"
1420
1424
  { FLDS((yyval.query), get_range_q(field, NULL,(yyvsp[-1].str), false, true)); }
1421
1425
  break;
1422
1426
 
1423
1427
  case 45:
1424
- #line 139 "src/query_parser/q_parser.y"
1428
+ #line 143 "src/query_parser/q_parser.y"
1425
1429
  { FLDS((yyval.query), get_range_q(field, (yyvsp[-1].str), NULL,true, false)); }
1426
1430
  break;
1427
1431
 
1428
1432
  case 46:
1429
- #line 140 "src/query_parser/q_parser.y"
1433
+ #line 144 "src/query_parser/q_parser.y"
1430
1434
  { FLDS((yyval.query), get_range_q(field, (yyvsp[-1].str), NULL,false, false)); }
1431
1435
  break;
1432
1436
 
1433
1437
  case 47:
1434
- #line 141 "src/query_parser/q_parser.y"
1438
+ #line 145 "src/query_parser/q_parser.y"
1435
1439
  { FLDS((yyval.query), get_range_q(field, NULL,(yyvsp[0].str), false, false)); }
1436
1440
  break;
1437
1441
 
1438
1442
  case 48:
1439
- #line 142 "src/query_parser/q_parser.y"
1443
+ #line 146 "src/query_parser/q_parser.y"
1440
1444
  { FLDS((yyval.query), get_range_q(field, NULL,(yyvsp[0].str), false, true)); }
1441
1445
  break;
1442
1446
 
1443
1447
  case 49:
1444
- #line 143 "src/query_parser/q_parser.y"
1448
+ #line 147 "src/query_parser/q_parser.y"
1445
1449
  { FLDS((yyval.query), get_range_q(field, (yyvsp[0].str), NULL,true, false)); }
1446
1450
  break;
1447
1451
 
1448
1452
  case 50:
1449
- #line 144 "src/query_parser/q_parser.y"
1453
+ #line 148 "src/query_parser/q_parser.y"
1450
1454
  { FLDS((yyval.query), get_range_q(field, (yyvsp[0].str), NULL,false, false)); }
1451
1455
  break;
1452
1456
 
@@ -1455,7 +1459,7 @@ yyreduce:
1455
1459
  }
1456
1460
 
1457
1461
  /* Line 1126 of yacc.c. */
1458
- #line 1459 "y.tab.c"
1462
+ #line 1463 "y.tab.c"
1459
1463
 
1460
1464
  yyvsp -= yylen;
1461
1465
  yyssp -= yylen;
@@ -1723,7 +1727,7 @@ yyreturn:
1723
1727
  }
1724
1728
 
1725
1729
 
1726
- #line 146 "src/query_parser/q_parser.y"
1730
+ #line 150 "src/query_parser/q_parser.y"
1727
1731
 
1728
1732
 
1729
1733
  const char *special_char = "&:()[]{}!+\"~^-|<>=*?";
data/lib/ferret.rb CHANGED
@@ -22,7 +22,7 @@
22
22
  #++
23
23
  # :include: ../TUTORIAL
24
24
  module Ferret
25
- VERSION = '0.9.5'
25
+ VERSION = '0.9.6'
26
26
  end
27
27
 
28
28
  # try and load the C extension but it isn't necessary.
@@ -11,7 +11,7 @@ module Ferret
11
11
 
12
12
  class QueryParser < Racc::Parser
13
13
 
14
- module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id155b60f3fb', 'lib/ferret/query_parser/query_parser.y', 126
14
+ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id07e7308361', 'lib/ferret/query_parser/query_parser.y', 126
15
15
  attr_accessor :default_field, :fields, :handle_parse_errors
16
16
 
17
17
  def initialize(default_field = "*", options = {})
@@ -323,7 +323,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id155b60f3f
323
323
  end
324
324
 
325
325
  def add_and_clause(clauses, clause)
326
- clauses.compact!
326
+ (clauses||=[]).compact!
327
327
  if (clauses.length == 1)
328
328
  last_cl = clauses[0]
329
329
  last_cl.occur = BooleanClause::Occur::MUST if not last_cl.prohibited?
@@ -379,7 +379,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id155b60f3f
379
379
  q = yield(field)
380
380
  bq << BooleanClause.new(q) if q
381
381
  end
382
- return bq
382
+ return (bq.clauses.size == 0) ? nil : bq
383
383
  end
384
384
  end
385
385
 
@@ -398,7 +398,7 @@ module_eval <<'..end lib/ferret/query_parser/query_parser.y modeval..id155b60f3f
398
398
  return qp.parse(query)
399
399
  end
400
400
 
401
- ..end lib/ferret/query_parser/query_parser.y modeval..id155b60f3fb
401
+ ..end lib/ferret/query_parser/query_parser.y modeval..id07e7308361
402
402
 
403
403
  ##### racc 1.4.4 generates ###
404
404
 
data/lib/rferret.rb CHANGED
@@ -23,7 +23,7 @@ $: << File.dirname(__FILE__)
23
23
  #++
24
24
  # :include: ../TUTORIAL
25
25
  module Ferret
26
- VERSION = '0.9.5'
26
+ VERSION = '0.9.6'
27
27
  end
28
28
 
29
29
  $ferret_pure_ruby = true
@@ -624,4 +624,30 @@ class IndexTest < Test::Unit::TestCase
624
624
  index.flush
625
625
  index.close
626
626
  end
627
+
628
+ def test_stopwords
629
+ i = Ferret::Index::Index.new(
630
+ :occur_default => Ferret::Search::BooleanClause::Occur::MUST,
631
+ :default_search_field => '*')
632
+ d = Ferret::Document::Document.new
633
+
634
+ # adding this additional field to the document leads to failure below
635
+ # comment out this statement and all tests pass:
636
+ d << Ferret::Document::Field.new('id', '1',
637
+ Ferret::Document::Field::Store::YES,
638
+ Ferret::Document::Field::Index::UNTOKENIZED)
639
+
640
+ d << Ferret::Document::Field.new('content', 'Move or shake',
641
+ Ferret::Document::Field::Store::NO,
642
+ Ferret::Document::Field::Index::TOKENIZED,
643
+ Ferret::Document::Field::TermVector::NO,
644
+ false, 1.0)
645
+ i << d
646
+ hits = i.search 'move nothere shake'
647
+ assert_equal 0, hits.size
648
+ hits = i.search 'move shake'
649
+ assert_equal 1, hits.size
650
+ hits = i.search 'move or shake'
651
+ assert_equal 1, hits.size # fails when id field is present
652
+ end
627
653
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: ferret
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.9.5
7
- date: 2006-08-07 00:00:00 +09:00
6
+ version: 0.9.6
7
+ date: 2006-08-23 00:00:00 +09:00
8
8
  summary: Ruby indexing library.
9
9
  require_paths:
10
10
  - lib