/**
* MIT License
*
* Copyright (c) 2017 zgqq
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package mah.common.search;
import org.junit.Assert;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Created by zgq on 2017-01-11 12:31
*/
public class SearcherImplTest {
private Searcher createSearcher() {
Searcher searcherImplV2 = new SearcherImplV5();
return searcherImplV2;
}
@Test
public void testPerformance() {
Searcher searcher = createSearcher();
List<DataRow> totalData = new ArrayList<>();
for (int i = 0; i < 50000; i++) {
List<String> data = new ArrayList<>();
data.add("fusssscssssck your methodussssssssbbbbbbbfckbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa ");
data.add("fuckyourfuck sssfussssssssbbbbbbbfckbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaa ");
DataRow dataRow = new DataRow(data);
totalData.add(dataRow);
}
long start = System.currentTimeMillis();
List<SearchResult> searchResults = searcher.smartFuzzyMatch(totalData, "fuck");
long end = System.currentTimeMillis();
System.out.println(end - start);
}
private DataRow produceData(String... texts) {
List<String> data = new ArrayList<>();
for (String text : texts) {
data.add(text);
}
return new DataRow(data);
}
@Test
public void testFuzzySearcherPosition() {
Searcher searcher = createSearcher();
List<String> data = new ArrayList<>();
data.add("fuck your method");
data.add("fuckyourfuck ");
List<DataRow> totalData = new ArrayList<>();
totalData.add(new DataRow(data));
List<SearchResult> searchResults = searcher.smartFuzzyMatch(totalData, "fuck");
SearchResult searchResult = searchResults.get(0);
Map<Integer, List<Integer>> matchedIndexs = searchResult.getMatchedResult().getMatchedIndexs();
Assert.assertNotNull(matchedIndexs);
List<Integer> conIndexs = matchedIndexs.get(0);
Assert.assertEquals(0, (int) conIndexs.get(0));
Assert.assertEquals(1, (int) conIndexs.get(1));
Assert.assertEquals(2, (int) conIndexs.get(2));
Assert.assertEquals(3, (int) conIndexs.get(3));
List<Integer> desIndexs = matchedIndexs.get(1);
Assert.assertEquals(0, (int) desIndexs.get(0));
Assert.assertEquals(1, (int) desIndexs.get(1));
Assert.assertEquals(2, (int) desIndexs.get(2));
Assert.assertEquals(3, (int) desIndexs.get(3));
Assert.assertEquals(8, (int) desIndexs.get(4));
Assert.assertEquals(9, (int) desIndexs.get(5));
Assert.assertEquals(10, (int) desIndexs.get(6));
Assert.assertEquals(11, (int) desIndexs.get(7));
DataRow dataRow = produceData("chaaaichnaina", "ch china");
List<SearchResult> searchResults2 = searcher.smartFuzzyMatch(Arrays.asList(dataRow), "china");
SearchResult searchResult2 = searchResults2.get(0);
MatchedResult matchedResult2 = searchResult2.getMatchedResult();
Map<Integer, List<Integer>> matchedIndexs2 = matchedResult2.getMatchedIndexs();
List<Integer> desIndexs2 = matchedIndexs2.get(1);
Assert.assertEquals(3, (int) desIndexs2.get(0));
Assert.assertEquals(4, (int) desIndexs2.get(1));
Assert.assertEquals(5, (int) desIndexs2.get(2));
Assert.assertEquals(6, (int) desIndexs2.get(3));
Assert.assertEquals(7, (int) desIndexs2.get(4));
List<Integer> conIndexs2 = matchedIndexs2.get(0);
Assert.assertEquals(6, (int) conIndexs2.get(0));
Assert.assertEquals(7, (int) conIndexs2.get(1));
Assert.assertEquals(10, (int) conIndexs2.get(2));
Assert.assertEquals(11, (int) conIndexs2.get(3));
Assert.assertEquals(12, (int) conIndexs2.get(4));
DataRow dataRow1 = produceData("chachina", "chchaaaina");
List<SearchResult> searchResults3 = searcher.smartFuzzyMatch(Arrays.asList(dataRow1), "china");
SearchResult searchResult3 = searchResults3.get(0);
Map<Integer, List<Integer>> matchedIndexs3 = searchResult3.getMatchedResult().getMatchedIndexs();
List<Integer> desIndexs3 = matchedIndexs3.get(1);
Assert.assertEquals(2, (int) desIndexs3.get(0));
Assert.assertEquals(3, (int) desIndexs3.get(1));
Assert.assertEquals(7, (int) desIndexs3.get(2));
Assert.assertEquals(8, (int) desIndexs3.get(3));
Assert.assertEquals(9, (int) desIndexs3.get(4));
List<Integer> conIndexs3 = matchedIndexs3.get(0);
Assert.assertEquals(3, (int) conIndexs3.get(0));
Assert.assertEquals(4, (int) conIndexs3.get(1));
Assert.assertEquals(5, (int) conIndexs3.get(2));
Assert.assertEquals(6, (int) conIndexs3.get(3));
Assert.assertEquals(7, (int) conIndexs3.get(4));
DataRow dataRow2 = produceData("Blankj/AndroidUtilCode");
List<SearchResult> searchResults4 = searcher.smartFuzzyMatch(Arrays.asList(dataRow2), "Baidu");
SearchResult searchResult4 = searchResults4.get(0);
Map<Integer, List<Integer>> matchedIndexs4 = searchResult4.getMatchedResult().getMatchedIndexs();
List<Integer> desIndexs4 = matchedIndexs4.get(0);
Assert.assertEquals(0, (int) desIndexs4.get(0));
Assert.assertEquals(7, (int) desIndexs4.get(1));
Assert.assertEquals(12, (int) desIndexs4.get(2));
Assert.assertEquals(13, (int) desIndexs4.get(3));
Assert.assertEquals(14, (int) desIndexs4.get(4));
DataRow dataRow3 = produceData("Mrs4s/BaiduPanDownload");
List<SearchResult> searchResults5 = searcher.smartFuzzyMatch(Arrays.asList(dataRow3), "Baidupan");
SearchResult searchResult5 = searchResults5.get(0);
Map<Integer, List<Integer>> matchedIndexs5 = searchResult5.getMatchedResult().getMatchedIndexs();
List<Integer> desIndexs5 = matchedIndexs5.get(0);
Assert.assertEquals(6, (int) desIndexs5.get(0));
Assert.assertEquals(7, (int) desIndexs5.get(1));
Assert.assertEquals(8, (int) desIndexs5.get(2));
Assert.assertEquals(9, (int) desIndexs5.get(3));
Assert.assertEquals(10, (int) desIndexs5.get(4));
Assert.assertEquals(11, (int) desIndexs5.get(5));
Assert.assertEquals(12, (int) desIndexs5.get(6));
Assert.assertEquals(13, (int) desIndexs5.get(7));
List<SearchResult> searchResults6 = searcher.smartFuzzyMatch(Arrays.asList(dataRow3), "Baipan");
SearchResult searchResult6 = searchResults6.get(0);
Map<Integer, List<Integer>> matchedIndexs6 = searchResult6.getMatchedResult().getMatchedIndexs();
List<Integer> desIndexs6 = matchedIndexs6.get(0);
Assert.assertEquals(6, (int) desIndexs6.get(0));
Assert.assertEquals(7, (int) desIndexs6.get(1));
Assert.assertEquals(8, (int) desIndexs6.get(2));
Assert.assertEquals(11, (int) desIndexs6.get(3));
Assert.assertEquals(12, (int) desIndexs6.get(4));
Assert.assertEquals(13, (int) desIndexs6.get(5));
// Mrs4s/BaiduPanDownload
DataRow dataRow4 = produceData("chchina");
List<SearchResult> searchResults7 = searcher.smartFuzzyMatch(Arrays.asList(dataRow4), "china");
SearchResult searchResult7 = searchResults7.get(0);
Map<Integer, List<Integer>> matchedIndexs7 = searchResult7.getMatchedResult().getMatchedIndexs();
List<Integer> desIndexs7 = matchedIndexs7.get(0);
Assert.assertEquals(2, (int) desIndexs7.get(0));
Assert.assertEquals(3, (int) desIndexs7.get(1));
Assert.assertEquals(4, (int) desIndexs7.get(2));
Assert.assertEquals(5, (int) desIndexs7.get(3));
Assert.assertEquals(6, (int) desIndexs7.get(4));
List<Integer> matchedPosition7 = getMatchedPosition("emacs-china","china");
Assert.assertEquals(6, (int) matchedPosition7.get(0));
Assert.assertEquals(7, (int) matchedPosition7.get(1));
Assert.assertEquals(8, (int) matchedPosition7.get(2));
Assert.assertEquals(9, (int) matchedPosition7.get(3));
Assert.assertEquals(10, (int) matchedPosition7.get(4));
}
private List<Integer> getMatchedPosition(String data,String keyword) {
Searcher searcher = createSearcher();
DataRow dataRow = produceData(data);
List<SearchResult> searchResults = searcher.smartFuzzyMatch(Arrays.asList(dataRow), keyword);
SearchResult searchResult = searchResults.get(0);
Map<Integer, List<Integer>> matchedIndexs = searchResult.getMatchedResult().getMatchedIndexs();
List<Integer> desIndexs = matchedIndexs.get(0);
return desIndexs;
}
}