@@ -1202,28 +1202,42 @@ function initSearch(rawSearchIndex) {
1202
1202
* @param {Row } row
1203
1203
* @param {QueryElement } elem - The element from the parsed query.
1204
1204
* @param {integer } typeFilter
1205
+ * @param {Array<integer> } skipPositions - Do not return one of these positions.
1205
1206
*
1206
- * @return {integer } - Returns an edit distance to the best match. If there is no
1207
- * match, returns `maxEditDistance + 1`.
1207
+ * @return {dist: integer, position: integer } - Returns an edit distance to the best match.
1208
+ * If there is no match, returns
1209
+ * `maxEditDistance + 1` and position: -1.
1208
1210
*/
1209
- function findArg ( row , elem , typeFilter , maxEditDistance ) {
1211
+ function findArg ( row , elem , typeFilter , maxEditDistance , skipPositions ) {
1210
1212
let dist = maxEditDistance + 1 ;
1213
+ let position = - 1 ;
1211
1214
1212
1215
if ( row && row . type && row . type . inputs && row . type . inputs . length > 0 ) {
1216
+ let i = 0 ;
1213
1217
for ( const input of row . type . inputs ) {
1214
- if ( ! typePassesFilter ( typeFilter , input . ty ) ) {
1218
+ if ( ! typePassesFilter ( typeFilter , input . ty ) ||
1219
+ skipPositions . indexOf ( i ) !== - 1 ) {
1220
+ i += 1 ;
1215
1221
continue ;
1216
1222
}
1217
- dist = Math . min (
1218
- dist ,
1219
- checkType ( input , elem , parsedQuery . literalSearch , maxEditDistance )
1223
+ const typeDist = checkType (
1224
+ input ,
1225
+ elem ,
1226
+ parsedQuery . literalSearch ,
1227
+ maxEditDistance
1220
1228
) ;
1221
- if ( dist === 0 ) {
1222
- return 0 ;
1229
+ if ( typeDist === 0 ) {
1230
+ return { dist : 0 , position : i } ;
1231
+ }
1232
+ if ( typeDist < dist ) {
1233
+ dist = typeDist ;
1234
+ position = i ;
1223
1235
}
1236
+ i += 1 ;
1224
1237
}
1225
1238
}
1226
- return parsedQuery . literalSearch ? maxEditDistance + 1 : dist ;
1239
+ dist = parsedQuery . literalSearch ? maxEditDistance + 1 : dist ;
1240
+ return { dist, position} ;
1227
1241
}
1228
1242
1229
1243
/**
@@ -1232,29 +1246,43 @@ function initSearch(rawSearchIndex) {
1232
1246
* @param {Row } row
1233
1247
* @param {QueryElement } elem - The element from the parsed query.
1234
1248
* @param {integer } typeFilter
1249
+ * @param {Array<integer> } skipPositions - Do not return one of these positions.
1235
1250
*
1236
- * @return {integer } - Returns an edit distance to the best match. If there is no
1237
- * match, returns `maxEditDistance + 1`.
1251
+ * @return {dist: integer, position: integer } - Returns an edit distance to the best match.
1252
+ * If there is no match, returns
1253
+ * `maxEditDistance + 1` and position: -1.
1238
1254
*/
1239
- function checkReturned ( row , elem , typeFilter , maxEditDistance ) {
1255
+ function checkReturned ( row , elem , typeFilter , maxEditDistance , skipPositions ) {
1240
1256
let dist = maxEditDistance + 1 ;
1257
+ let position = - 1 ;
1241
1258
1242
1259
if ( row && row . type && row . type . output . length > 0 ) {
1243
1260
const ret = row . type . output ;
1261
+ let i = 0 ;
1244
1262
for ( const ret_ty of ret ) {
1245
- if ( ! typePassesFilter ( typeFilter , ret_ty . ty ) ) {
1263
+ if ( ! typePassesFilter ( typeFilter , ret_ty . ty ) ||
1264
+ skipPositions . indexOf ( i ) !== - 1 ) {
1265
+ i += 1 ;
1246
1266
continue ;
1247
1267
}
1248
- dist = Math . min (
1249
- dist ,
1250
- checkType ( ret_ty , elem , parsedQuery . literalSearch , maxEditDistance )
1268
+ const typeDist = checkType (
1269
+ ret_ty ,
1270
+ elem ,
1271
+ parsedQuery . literalSearch ,
1272
+ maxEditDistance
1251
1273
) ;
1252
- if ( dist === 0 ) {
1253
- return 0 ;
1274
+ if ( typeDist === 0 ) {
1275
+ return { dist : 0 , position : i } ;
1254
1276
}
1277
+ if ( typeDist < dist ) {
1278
+ dist = typeDist ;
1279
+ position = i ;
1280
+ }
1281
+ i += 1 ;
1255
1282
}
1256
1283
}
1257
- return parsedQuery . literalSearch ? maxEditDistance + 1 : dist ;
1284
+ dist = parsedQuery . literalSearch ? maxEditDistance + 1 : dist ;
1285
+ return { dist, position} ;
1258
1286
}
1259
1287
1260
1288
function checkPath ( contains , ty , maxEditDistance ) {
@@ -1455,13 +1483,13 @@ function initSearch(rawSearchIndex) {
1455
1483
const fullId = row . id ;
1456
1484
const searchWord = searchWords [ pos ] ;
1457
1485
1458
- const in_args = findArg ( row , elem , parsedQuery . typeFilter , maxEditDistance ) ;
1459
- const returned = checkReturned ( row , elem , parsedQuery . typeFilter , maxEditDistance ) ;
1486
+ const in_args = findArg ( row , elem , parsedQuery . typeFilter , maxEditDistance , [ ] ) ;
1487
+ const returned = checkReturned ( row , elem , parsedQuery . typeFilter , maxEditDistance , [ ] ) ;
1460
1488
1461
1489
// path_dist is 0 because no parent path information is currently stored
1462
1490
// in the search index
1463
- addIntoResults ( results_in_args , fullId , pos , - 1 , in_args , 0 , maxEditDistance ) ;
1464
- addIntoResults ( results_returned , fullId , pos , - 1 , returned , 0 , maxEditDistance ) ;
1491
+ addIntoResults ( results_in_args , fullId , pos , - 1 , in_args . dist , 0 , maxEditDistance ) ;
1492
+ addIntoResults ( results_returned , fullId , pos , - 1 , returned . dist , 0 , maxEditDistance ) ;
1465
1493
1466
1494
if ( ! typePassesFilter ( parsedQuery . typeFilter , row . ty ) ) {
1467
1495
return ;
@@ -1534,12 +1562,20 @@ function initSearch(rawSearchIndex) {
1534
1562
1535
1563
// If the result is too "bad", we return false and it ends this search.
1536
1564
function checkArgs ( elems , callback ) {
1565
+ const skipPositions = [ ] ;
1537
1566
for ( const elem of elems ) {
1538
1567
// There is more than one parameter to the query so all checks should be "exact"
1539
- const dist = callback ( row , elem , NO_TYPE_FILTER , maxEditDistance ) ;
1568
+ const { dist, position } = callback (
1569
+ row ,
1570
+ elem ,
1571
+ NO_TYPE_FILTER ,
1572
+ maxEditDistance ,
1573
+ skipPositions
1574
+ ) ;
1540
1575
if ( dist <= 1 ) {
1541
1576
nbDist += 1 ;
1542
1577
totalDist += dist ;
1578
+ skipPositions . push ( position ) ;
1543
1579
} else {
1544
1580
return false ;
1545
1581
}
@@ -1597,9 +1633,17 @@ function initSearch(rawSearchIndex) {
1597
1633
row ,
1598
1634
elem ,
1599
1635
parsedQuery . typeFilter ,
1636
+ maxEditDistance ,
1637
+ [ ]
1638
+ ) ;
1639
+ addIntoResults (
1640
+ results_others ,
1641
+ row . id ,
1642
+ i ,
1643
+ - 1 ,
1644
+ in_returned . dist ,
1600
1645
maxEditDistance
1601
1646
) ;
1602
- addIntoResults ( results_others , row . id , i , - 1 , in_returned , maxEditDistance ) ;
1603
1647
}
1604
1648
}
1605
1649
} else if ( parsedQuery . foundElems > 0 ) {
0 commit comments