/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.kie.workbench.common.screens.datamodeller.backend.server.indexing.query;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.enterprise.inject.Instance;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.junit.Test;
import org.kie.workbench.common.screens.datamodeller.backend.server.indexing.TestJavaFileIndexer;
import org.kie.workbench.common.screens.javaeditor.type.JavaResourceTypeDefinition;
import org.kie.workbench.common.services.refactoring.backend.server.BaseIndexingTest;
import org.kie.workbench.common.services.refactoring.backend.server.TestIndexer;
import org.kie.workbench.common.services.refactoring.backend.server.query.NamedQuery;
import org.kie.workbench.common.services.refactoring.backend.server.query.builder.SingleTermQueryBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.query.response.DefaultResponseBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.query.response.ResponseBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.query.standard.FindResourcePartsQuery;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueIndexTerm.TermSearchType;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValuePartIndexTerm;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueReferenceIndexTerm;
import org.kie.workbench.common.services.refactoring.model.index.terms.valueterms.ValueResourceIndexTerm;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRequest;
import org.kie.workbench.common.services.refactoring.model.query.RefactoringPageRow;
import org.kie.workbench.common.services.refactoring.service.PartType;
import org.kie.workbench.common.services.refactoring.service.ResourceType;
import org.uberfire.commons.data.Pair;
import org.uberfire.ext.metadata.backend.lucene.index.LuceneIndex;
import org.uberfire.ext.metadata.engine.Index;
import org.uberfire.ext.metadata.io.KObjectUtil;
import org.uberfire.java.nio.file.Path;
import org.uberfire.paging.PageResponse;
public class FindResourcePartsQueryValidIndexTermsTest extends BaseIndexingTest<JavaResourceTypeDefinition> {
protected Set<NamedQuery> getQueries() {
return new HashSet<NamedQuery>() {{
add( new FindResourcePartsQuery() {
@Override
public ResponseBuilder getResponseBuilder() {
return new DefaultResponseBuilder( ioService() );
}
} );
}};
}
@Test
public void testIndexJavaFilesAndFindResourcePartsQuery() throws Exception {
// setup
ioService();
//Add test files
String pojo1FileName = "Pojo1.java";
Path path = basePath.resolve( pojo1FileName );
String javaSourceText = loadText( "../" + pojo1FileName );
ioService().write( path, javaSourceText );
// wait for events to be consumed from jgit -> (notify changes -> watcher -> index) -> lucene index
Thread.sleep(5000);
final Index index = getConfig().getIndexManager().get( KObjectUtil.toKCluster( basePath.getFileSystem() ) );
{
final IndexSearcher searcher = ( (LuceneIndex) index ).nrtSearcher();
final TopScoreDocCollector collector = TopScoreDocCollector.create( 10 );
final Query query = new SingleTermQueryBuilder( new ValueResourceIndexTerm( "*", ResourceType.JAVA, TermSearchType.WILDCARD ) ).build();
searcher.search( query,
collector );
final ScoreDoc[] hits = collector.topDocs().scoreDocs;
assertEquals( 1, hits.length );
List<Pair<String, String>> expectedValues = initExpectedValues();
Document doc = null;
for( ScoreDoc scoreDoc : hits ) {
doc = searcher.doc(scoreDoc.doc);
for( IndexableField indField : doc.getFields() ) {
String fieldVal = indField.stringValue();
if( fieldVal.startsWith("git://" ) ) {
if( fieldVal.contains(pojo1FileName) ) {
break;
}
} else {
continue;
}
}
}
assertContains( expectedValues, doc );
( (LuceneIndex) index ).nrtRelease( searcher );
}
{
HashSet<ValueIndexTerm> queryTerms = new HashSet<ValueIndexTerm>();
queryTerms.add( new ValuePartIndexTerm(
"o_BigDecimal",
PartType.FIELD ) );
final RefactoringPageRequest request = new RefactoringPageRequest( FindResourcePartsQuery.NAME,
queryTerms,
0,
10 );
try {
final PageResponse<RefactoringPageRow> response = service.query( request );
assertNotNull( "No documents found!", response );
assertEquals( 1,
response.getPageRowList().size() );
} catch ( IllegalArgumentException e ) {
e.printStackTrace();
fail( "Could not execute query: " + e.getMessage());
}
};
}
private void assertContains( List<Pair<String, String>> expectedValues,
Document doc ) {
List<Pair<String, String>> returnedValues = new ArrayList<Pair<String, String>>();
for ( IndexableField field : doc.getFields() ) {
returnedValues.add( new Pair<String, String>( field.name(), field.stringValue() ) );
}
//assertEquals( expectedValues.size(), returnedValues.size() );
for ( Pair<String, String> expectedValue : expectedValues ) {
int index = returnedValues.indexOf( expectedValue );
if ( index < 0 ) {
fail( "Expected value is not in Document fields: [" + expectedValue.getK1() + " => " + expectedValue.getK2() + "]" );
} else {
returnedValues.remove( index );
}
}
}
private List<Pair<String, String>> initExpectedValues() {
List<Pair<String, String>> expectedValues = new ArrayList<Pair<String, String>>();
expectedValues.add( new Pair<String, String>( ResourceType.JAVA.toString(), "org.kie.workbench.common.screens.datamodeller.backend.server.indexing.Pojo1" ) );
// identifying info
String [] fieldNames = new String [] {
"o_BigDecimal",
"o_BigInteger",
"o_Boolean",
"o_Byte",
"o_Character",
"o_Date",
"o_Double",
"o_Float",
"o_Integer",
"o_Long",
"o_Short",
"o_String",
"p_boolean",
"p_byte",
"p_char",
"p_double",
"p_float",
"p_int",
"p_long",
"p_short"
};
for( String className : fieldNames ) {
ValuePartIndexTerm partTerm = new ValuePartIndexTerm(className, PartType.FIELD);
expectedValues.add( new Pair<String, String>( partTerm.getTerm(), partTerm.getValue() ) );
}
// references
String [] referencedClasses = new String [] {
"java.util.Date",
"java.io.Serializable",
"java.math.BigDecimal",
"java.lang.Boolean",
"java.lang.Byte",
"java.lang.Character",
"java.lang.Double",
"java.lang.Float",
"java.lang.Integer",
"java.lang.Long",
"boolean",
"byte",
"char",
"double",
"float",
"long",
"short"
};
for( String className : referencedClasses ) {
ValueReferenceIndexTerm refTerm = new ValueReferenceIndexTerm(className, ResourceType.JAVA);
expectedValues.add( new Pair<String, String>( refTerm.getTerm(), refTerm.getValue() ) );
}
return expectedValues;
}
@Override
protected TestIndexer getIndexer() {
return new TestJavaFileIndexer();
}
@Override
public Map<String, Analyzer> getAnalyzers() {
return Collections.emptyMap();
}
@Override
protected JavaResourceTypeDefinition getResourceTypeDefinition() {
return new JavaResourceTypeDefinition();
}
@Override
protected String getRepositoryName() {
return this.getClass().getSimpleName();
}
}