Skip to content

Commit

Permalink
Refactor search API. Make up a SearchResults class to collect both se…
Browse files Browse the repository at this point in the history
…arch result and promotion. TO prepare for #6
  • Loading branch information
guojiex committed Jan 18, 2019
1 parent d49f5c1 commit b777431
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 21 deletions.
38 changes: 27 additions & 11 deletions lib/search_data_source.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,26 @@ class SearchResult {
: result.image.contextLink.hashCode;
}

class Promotion {
final customsearch.Promotion promotion;

Promotion(this.promotion);
}

/// A wrapper class to aggregate all the search result fields that we need.
class SearchResults {
List<SearchResult> searchResults;
List<Promotion> promotions;

SearchResults({this.searchResults, this.promotions}) {
this.searchResults ??= List<SearchResult>();
this.promotions ??= List<Promotion>();
}
}

/// Abstract class for Search Data Source.
abstract class SearchDataSource {
Future<List<SearchResult>> search(String query, {String searchType});
Future<SearchResults> search(String query, {String searchType});
}

class _StaticSearchResponse {
Expand All @@ -63,9 +80,7 @@ class _StaticSearchResponse {
{this.assetPath, this.searchType, this.searchResponseJsonString});
}


class FakeSearchDataSource implements SearchDataSource {

final Map<String, _StaticSearchResponse> searchResponses = {
'web': _StaticSearchResponse(
assetPath: 'res/sampledata/nytimes_sample_data.json'),
Expand All @@ -76,7 +91,6 @@ class FakeSearchDataSource implements SearchDataSource {
assetPath: 'res/sampledata/nytimes_with_promotion.json'),
};


FakeSearchDataSource() {
searchResponses.keys.forEach((key) {
loadAssetToSearchResponse(key, searchResponses[key].assetPath);
Expand All @@ -89,19 +103,20 @@ class FakeSearchDataSource implements SearchDataSource {
}

@override
Future<List<SearchResult>> search(String query, {String searchType}) async {
var results = List<SearchResult>();
Future<SearchResults> search(String query, {String searchType}) async {
if (!searchResponses.containsKey(query)) {
return results;
return SearchResults();
}
if (searchResponses[query].searchType != searchType) {
return results;
return SearchResults();
}
var results = List<SearchResult>();
Map searchMap = jsonDecode(searchResponses[query].searchResponseJsonString);
customsearch.Search search = customsearch.Search.fromJson(searchMap);
search.items.forEach(
(item) => results.add(SearchResult.escapeLineBreakInSnippet(item)));
return Set<SearchResult>.from(results).toList();
return SearchResults(
searchResults: Set<SearchResult>.from(results).toList());
}
}

Expand All @@ -117,14 +132,15 @@ class CustomSearchDataSource implements SearchDataSource {
}

@override
Future<List<SearchResult>> search(String query, {String searchType}) async {
Future<SearchResults> search(String query, {String searchType}) async {
var results = List<SearchResult>();
customsearch.Search search =
await this.api.cse.list(query, cx: this.cx, searchType: searchType);
if (search.items != null) {
search.items.forEach((item) => results.add(SearchResult(item)));
}
return Set<SearchResult>.from(results).toList();
return SearchResults(
searchResults: Set<SearchResult>.from(results).toList());
}
}

Expand Down
15 changes: 7 additions & 8 deletions lib/search_result_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -253,12 +253,11 @@ class CustomSearchSearchDelegate extends SearchDelegate<SearchResult> {

@override
Widget buildResults(BuildContext context) {
return FutureBuilder<List<SearchResult>>(
return FutureBuilder<SearchResults>(
future: dataSource.search(query,
searchType: this.searchType == SearchType.web ? null : 'image'),
// a previously-obtained Future<List<SearchResult>> or null
builder:
(BuildContext context, AsyncSnapshot<List<SearchResult>> snapshot) {
builder: (BuildContext context, AsyncSnapshot<SearchResults> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Text('Press button to start.');
Expand All @@ -274,18 +273,18 @@ class CustomSearchSearchDelegate extends SearchDelegate<SearchResult> {
mainAxisSpacing: 4.0,
crossAxisSpacing: 4.0,
padding: const EdgeInsets.all(4.0),
children: List.generate(snapshot.data.length, (index) {
children: List.generate(snapshot.data.searchResults.length,
(index) {
return new ImageSearchResultCard(
searchResult: snapshot.data[index],
searchResult: snapshot.data.searchResults[index],
searchDelegate: this);
}));
case SearchType.web:
print(snapshot.data.length);
return ListView.builder(
itemCount: snapshot.data.length,
itemCount: snapshot.data.searchResults.length,
itemBuilder: (BuildContext context, int index) {
return new WebSearchResultCard(
searchResult: snapshot.data[index],
searchResult: snapshot.data.searchResults[index],
searchDelegate: this);
});
default:
Expand Down
4 changes: 2 additions & 2 deletions test/search_data_source_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ void main() {
.readAsString()
.then((String contents) {
var dataSource = FakeSearchDataSource();
dataSource.search('whatever').then((searchResult) {
searchResult.forEach((result) => print(result));
dataSource.search('whatever').then((searchResults) {
searchResults.searchResults.forEach((result) => print(result));
});
});
});
Expand Down

0 comments on commit b777431

Please sign in to comment.