/******************************************************************************
* Copyright (C) 2015 Fabio Zadrozny and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation
******************************************************************************/
package org.python.pydev.shared_core.index;
import java.io.Reader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.lucene.analysis.Analyzer.TokenStreamComponents;
import org.apache.lucene.store.RAMDirectory;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.ITokenScanner;
import org.python.pydev.shared_core.index.IndexApi.DocumentInfo;
import org.python.pydev.shared_core.index.IndexApi.IDocumentsVisitor;
import org.python.pydev.shared_core.partitioner.CustomRuleBasedPartitionScanner;
import org.python.pydev.shared_core.structure.OrderedMap;
import junit.framework.TestCase;
public class IndexingTest extends TestCase {
private IndexApi indexApi;
private IFields mapper = new IFields() {
@Override
public String getTokenFieldName(IToken nextToken) {
String data = (String) nextToken.getData();
if (IDocument.DEFAULT_CONTENT_TYPE.equals(data) || data == null) {
return IFields.PYTHON;
}
throw new AssertionError("Unexpected: " + data);
}
};
@Override
public void setUp() throws Exception {
super.setUp();
// Create it in-memory
indexApi = new IndexApi(new RAMDirectory(), true);
indexApi.registerTokenizer(IFields.PYTHON, CodeAnalyzer.createPythonStreamComponents());
TokenStreamComponents stringOrComment = CodeAnalyzer.createStringsOrCommentsStreamComponents();
indexApi.registerTokenizer(IFields.STRING, stringOrComment);
indexApi.registerTokenizer(IFields.COMMENT, stringOrComment);
}
@Override
public void tearDown() throws Exception {
indexApi.dispose();
}
public void testSimpleIndexing() throws Exception {
indexApi.index(new Path("a.py"), 0L, createScanner("aaaaaaaa"), mapper);
indexApi.index(new Path("b.py"), 0L, createScanner("bbbbbbb"), mapper);
indexApi.index(new Path("c.py"), 0L, createScanner("another"), mapper);
SearchResult result = indexApi.searchRegexp("a", IFields.PYTHON, true);
assertEquals(0, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("aaaaaaaa", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("a.*", IFields.PYTHON, true);
assertEquals(2, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("b.*", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
indexApi.setMaxMatches(1);
result = indexApi.searchRegexp("a.*", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
}
private ITokenScanner createScanner(String string) {
CustomRuleBasedPartitionScanner scanner = new CustomRuleBasedPartitionScanner();
scanner.setRange(new Document(string), 0, string.length());
return scanner;
}
public void testCaseIndexing() throws Exception {
indexApi.index(new Path("a.py"), 0L, createScanner("aAaAaAaA"), mapper);
indexApi.index(new Path("b.py"), 0L, createScanner("bBbBbBb"), mapper);
indexApi.index(new Path("c.py"), 0L, createScanner("nother other Another"), mapper);
SearchResult result = indexApi.searchRegexp("a", IFields.PYTHON, true);
assertEquals(0, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("aaaaaaaa", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("a.*", IFields.PYTHON, true);
assertEquals(2, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("b.*", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("a", IFields.PYTHON, true);
assertEquals(0, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("othe", IFields.PYTHON, true);
assertEquals(0, result.getNumberOfDocumentMatches());
result = indexApi.searchRegexp("other", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
indexApi.setMaxMatches(1);
result = indexApi.searchRegexp("a.*", IFields.PYTHON, true);
assertEquals(1, result.getNumberOfDocumentMatches());
}
public void testKeepingSynched() throws Exception {
indexApi.index(new Path("a.py"), 0L, "aAaAaAaA");
indexApi.index(new Path("b.py"), 1L, "bBbBbBb");
indexApi.index(new Path("c.py"), 2L, "nother other Another");
indexApi.commit();
final Map<Integer, String> found = new HashMap<>();
IDocumentsVisitor visitor = new IDocumentsVisitor() {
@Override
public void visit(DocumentInfo documentInfo) {
found.put(documentInfo.getDocId(), documentInfo.get(IFields.FILEPATH));
}
};
indexApi.visitAllDocs(visitor, IFields.FILEPATH);
assertEquals(3, found.size());
HashMap<String, Collection<String>> map = new HashMap<>();
map.put(IFields.MODIFIED_TIME, Arrays.asList("1", "0"));
indexApi.removeDocs(map);
found.clear();
indexApi.visitAllDocs(visitor, IFields.FILEPATH);
assertEquals(1, found.size());
}
public void testExactMatch() throws Exception {
indexApi.index(new Path("a.py"), 0L, "aAaAaAaA");
indexApi.index(new Path("b.py"), 1L, "bBbBbBb");
indexApi.index(new Path("c.py"), 2L, "nother other Another");
SearchResult result = indexApi.searchExact("aaaaaaaa", IFields.GENERAL_CONTENTS, true);
assertEquals(1, result.getNumberOfDocumentMatches());
result = indexApi.searchExact("aaaaaaaa", IFields.PYTHON, true);
assertEquals(0, result.getNumberOfDocumentMatches());
result = indexApi.searchExact("a.*", IFields.GENERAL_CONTENTS, true);
assertEquals(0, result.getNumberOfDocumentMatches());
}
public void testWildCards() throws Exception {
indexApi.index(new Path("a.py"), 0L, "aabbcc");
SearchResult result = indexApi.searchWildcard(new HashSet<>(Arrays.asList("a*bc*")), IFields.GENERAL_CONTENTS,
true, null, null);
assertEquals(1, result.getNumberOfDocumentMatches());
}
public void testWildCards2a() throws Exception {
indexApi.index(new Path("a.py"), 0L, "aabbcc");
// No match because it has no * in the end
SearchResult result = indexApi.searchWildcard(new HashSet<>(Arrays.asList("a*bc")), IFields.GENERAL_CONTENTS,
true, null, null);
assertEquals(0, result.getNumberOfDocumentMatches());
}
public void testWildCards2() throws Exception {
indexApi.index(new Path("a.py"), 0L, "ab");
SearchResult result = indexApi.searchWildcard(new HashSet<>(Arrays.asList("*ab*")), IFields.GENERAL_CONTENTS,
true, null, null);
assertEquals(1, result.getNumberOfDocumentMatches());
}
public void testSearchModuleKey() throws Exception {
Map<String, String> map = new HashMap<>();
map.put(IFields.FILENAME, "my.mod");
Reader reader = new StringReader("ab");
indexApi.index(map, reader, IFields.GENERAL_CONTENTS);
map = new HashMap<>();
map.put(IFields.FILENAME, "my.mod2");
reader = new StringReader("ab");
indexApi.index(map, reader, IFields.GENERAL_CONTENTS);
IDocumentsVisitor visitor = new IDocumentsVisitor() {
@Override
public void visit(DocumentInfo documentInfo) {
}
};
OrderedMap<String, Set<String>> fieldNameToValues = new OrderedMap<>();
fieldNameToValues.put(IFields.GENERAL_CONTENTS, new HashSet<>(Arrays.asList("*ab*")));
fieldNameToValues.put(IFields.FILENAME, new HashSet<>(Arrays.asList("my.mod")));
SearchResult result = indexApi.searchWildcard(fieldNameToValues, true, visitor, null, IFields.FILENAME);
assertEquals(1, result.getNumberOfDocumentMatches());
fieldNameToValues.put(IFields.FILENAME, new HashSet<>(Arrays.asList("my.mod*")));
result = indexApi.searchWildcard(fieldNameToValues, true, visitor, null, IFields.FILENAME);
assertEquals(2, result.getNumberOfDocumentMatches());
}
}