(search, targets, options)
| 21 | } |
| 22 | |
| 23 | var go = (search, targets, options) => { |
| 24 | if(!search) return options?.all ? all(targets, options) : noResults |
| 25 | |
| 26 | var preparedSearch = getPreparedSearch(search) |
| 27 | var searchBitflags = preparedSearch.bitflags |
| 28 | var containsSpace = preparedSearch.containsSpace |
| 29 | |
| 30 | var threshold = denormalizeScore( options?.threshold || 0 ) |
| 31 | var limit = options?.limit || INFINITY |
| 32 | |
| 33 | var resultsLen = 0; var limitedCount = 0 |
| 34 | var targetsLen = targets.length |
| 35 | |
| 36 | function push_result(result) { |
| 37 | if(resultsLen < limit) { q.add(result); ++resultsLen } |
| 38 | else { |
| 39 | ++limitedCount |
| 40 | if(result._score > q.peek()._score) q.replaceTop(result) |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | // This code is copy/pasted 3 times for performance reasons [options.key, options.keys, no keys] |
| 45 | |
| 46 | // options.key |
| 47 | if(options?.key) { |
| 48 | var key = options.key |
| 49 | for(var i = 0; i < targetsLen; ++i) { var obj = targets[i] |
| 50 | var target = getValue(obj, key) |
| 51 | if(!target) continue |
| 52 | if(!isPrepared(target)) target = getPrepared(target) |
| 53 | |
| 54 | if((searchBitflags & target._bitflags) !== searchBitflags) continue |
| 55 | var result = algorithm(preparedSearch, target) |
| 56 | if(result === NULL) continue |
| 57 | if(result._score < threshold) continue |
| 58 | |
| 59 | result.obj = obj |
| 60 | push_result(result) |
| 61 | } |
| 62 | |
| 63 | // options.keys |
| 64 | } else if(options?.keys) { |
| 65 | var keys = options.keys |
| 66 | var keysLen = keys.length |
| 67 | |
| 68 | outer: for(var i = 0; i < targetsLen; ++i) { var obj = targets[i] |
| 69 | |
| 70 | { // early out based on bitflags |
| 71 | var keysBitflags = 0 |
| 72 | for (var keyI = 0; keyI < keysLen; ++keyI) { |
| 73 | var key = keys[keyI] |
| 74 | var target = getValue(obj, key) |
| 75 | if(!target) { tmpTargets[keyI] = noTarget; continue } |
| 76 | if(!isPrepared(target)) target = getPrepared(target) |
| 77 | tmpTargets[keyI] = target |
| 78 | |
| 79 | keysBitflags |= target._bitflags |
| 80 | } |
nothing calls this directly
no test coverage detected