Skip to content

Commit 41905a5

Browse files
committed
Experimental API search exposed through query.
1 parent dbbefb5 commit 41905a5

File tree

4 files changed

+49
-22
lines changed

4 files changed

+49
-22
lines changed

app/lib/search/index_simple.dart

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'dart:async';
6-
import 'dart:io';
76
import 'dart:math' as math;
87

98
import 'package:gcloud/service_scope.dart' as ss;
@@ -24,20 +23,19 @@ void registerPackageIndex(PackageIndex index) =>
2423
ss.register(#packageIndexService, index);
2524

2625
class SimplePackageIndex implements PackageIndex {
27-
final bool enableApiIndex;
2826
final Map<String, PackageDocument> _packages = <String, PackageDocument>{};
2927
final Map<String, String> _normalizedPackageText = <String, String>{};
3028
final TokenIndex _nameIndex = new TokenIndex(minLength: 2);
3129
final TokenIndex _descrIndex = new TokenIndex(minLength: 3);
3230
final TokenIndex _readmeIndex = new TokenIndex(minLength: 3);
3331
final TokenIndex _apiDocIndex = new TokenIndex(minLength: 3);
3432
final StringInternPool _internPool = new StringInternPool();
33+
final bool _apiSearchEnabled;
3534
DateTime _lastUpdated;
3635
bool _isReady = false;
3736

38-
SimplePackageIndex({bool enableApiIndex})
39-
: this.enableApiIndex =
40-
enableApiIndex ?? Platform.environment['SEARCH_API_INDEX'] == '1';
37+
SimplePackageIndex({bool apiSearchEnabled: false})
38+
: _apiSearchEnabled = apiSearchEnabled;
4139

4240
@override
4341
bool get isReady => _isReady;
@@ -80,11 +78,9 @@ class SimplePackageIndex implements PackageIndex {
8078
_nameIndex.add(doc.package, doc.package);
8179
_descrIndex.add(doc.package, doc.description);
8280
_readmeIndex.add(doc.package, doc.readme);
83-
if (enableApiIndex) {
84-
for (ApiDocPage page in doc.apiDocPages ?? const []) {
85-
_apiDocIndex.add(
86-
_apiDocPageId(doc.package, page), page.symbols?.join(' '));
87-
}
81+
for (ApiDocPage page in doc.apiDocPages ?? const []) {
82+
_apiDocIndex.add(
83+
_apiDocPageId(doc.package, page), page.symbols?.join(' '));
8884
}
8985
final String allText = [doc.package, doc.description, doc.readme]
9086
.where((s) => s != null)
@@ -179,7 +175,8 @@ class SimplePackageIndex implements PackageIndex {
179175
}
180176

181177
// do text matching
182-
final Score textScore = _searchText(packages, query.parsedQuery.text);
178+
final Score textScore = _searchText(packages, query.parsedQuery.text,
179+
_apiSearchEnabled || query.parsedQuery.isApiEnabled);
183180

184181
// filter packages that doesn't match text query
185182
if (textScore != null) {
@@ -299,15 +296,16 @@ class SimplePackageIndex implements PackageIndex {
299296
return new Score(values);
300297
}
301298

302-
Score _searchText(Set<String> packages, String text) {
299+
Score _searchText(Set<String> packages, String text, bool isExperimental) {
303300
if (text != null && text.isNotEmpty) {
304301
final List<String> words = splitForIndexing(text).toList();
305302
final int wordCount = words.length;
306303
final List<Score> wordScores = words.map((String word) {
307304
final nameTokens = _nameIndex.lookupTokens(word);
308305
final descrTokens = _descrIndex.lookupTokens(word);
309306
final readmeTokens = _readmeIndex.lookupTokens(word);
310-
final apiDocTokens = _apiDocIndex.lookupTokens(word);
307+
final apiDocTokens =
308+
isExperimental ? _apiDocIndex.lookupTokens(word) : new TokenMatch();
311309
final maxTokenLength = [
312310
nameTokens.maxLength,
313311
descrTokens.maxLength,
@@ -326,15 +324,20 @@ class SimplePackageIndex implements PackageIndex {
326324
final readme = new Score(_readmeIndex.scoreDocs(readmeTokens,
327325
weight: 0.90, wordCount: wordCount));
328326

329-
final apiPages = new Score(_apiDocIndex.scoreDocs(apiDocTokens,
330-
weight: 0.80, wordCount: wordCount));
331-
final apiPackages = <String, double>{};
332-
for (String key in apiPages.getKeys()) {
333-
final pkg = _apiDocPkg(key);
334-
final value = apiPages[key];
335-
apiPackages[pkg] = math.max(value, apiPackages[pkg] ?? 0.0);
327+
Score apiScore;
328+
if (isExperimental) {
329+
final apiPages = new Score(_apiDocIndex.scoreDocs(apiDocTokens,
330+
weight: 0.80, wordCount: wordCount));
331+
final apiPackages = <String, double>{};
332+
for (String key in apiPages.getKeys()) {
333+
final pkg = _apiDocPkg(key);
334+
final value = apiPages[key];
335+
apiPackages[pkg] = math.max(value, apiPackages[pkg] ?? 0.0);
336+
}
337+
apiScore = new Score(apiPackages);
338+
} else {
339+
apiScore = new Score({});
336340
}
337-
final apiScore = new Score(apiPackages);
338341

339342
return Score.max([name, descr, readme, apiScore]).removeLowValues(
340343
fraction: 0.01, minValue: 0.001);

app/lib/shared/search_service.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,16 +351,21 @@ class ParsedQuery {
351351
/// Match authors and uploaders.
352352
final List<String> emails;
353353

354+
/// Enable experimental API search.
355+
final bool isApiEnabled;
356+
354357
ParsedQuery._(
355358
this.text,
356359
this.packagePrefix,
357360
this.refDependencies,
358361
this.allDependencies,
359362
this.emails,
363+
this.isApiEnabled,
360364
);
361365

362366
factory ParsedQuery._parse(String q) {
363367
String queryText = q ?? '';
368+
queryText = ' $queryText ';
364369
String packagePrefix;
365370
final Match pkgMatch = _packageRegexp.firstMatch(queryText);
366371
if (pkgMatch != null) {
@@ -381,6 +386,11 @@ class ParsedQuery {
381386
final List<String> allDependencies = extractRegExp(_allDependencyRegExp);
382387
final List<String> emails = extractRegExp(_emailRegexp);
383388

389+
final bool isApiEnabled = queryText.contains(' !!api ');
390+
if (isApiEnabled) {
391+
queryText = queryText.replaceFirst(' !!api ', ' ');
392+
}
393+
384394
queryText = queryText.replaceAll(_whitespacesRegExp, ' ').trim();
385395
if (queryText.isEmpty) {
386396
queryText = null;
@@ -392,6 +402,7 @@ class ParsedQuery {
392402
dependencies,
393403
allDependencies,
394404
emails,
405+
isApiEnabled,
395406
);
396407
}
397408

app/test/search/api_doc_page_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ void main() {
1515
SimplePackageIndex index;
1616

1717
setUpAll(() async {
18-
index = new SimplePackageIndex(enableApiIndex: true);
18+
index = new SimplePackageIndex(apiSearchEnabled: true);
1919
await index.addPackage(new PackageDocument(
2020
package: 'foo',
2121
version: '1.0.0',

app/test/shared/search_service_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@ void main() {
2929
expect(new SearchQuery.parse(query: 'text').parsedQuery.text, 'text');
3030
expect(new SearchQuery.parse(query: ' text ').query, 'text');
3131
expect(new SearchQuery.parse(query: ' text ').parsedQuery.text, 'text');
32+
expect(new SearchQuery.parse(query: ' text ').parsedQuery.isApiEnabled,
33+
isFalse);
34+
});
35+
36+
test('experimental API search', () {
37+
expect(new SearchQuery.parse(query: '!!api').parsedQuery.isApiEnabled,
38+
isTrue);
39+
expect(
40+
new SearchQuery.parse(query: 'text !!api').parsedQuery.isApiEnabled,
41+
isTrue);
42+
expect(
43+
new SearchQuery.parse(query: '!!api text').parsedQuery.isApiEnabled,
44+
isTrue);
3245
});
3346

3447
test('no dependency', () {

0 commit comments

Comments
 (0)