Modified: incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrQueryFactory.java URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrQueryFactory.java?rev=1151837&r1=1151836&r2=1151837&view=diff ============================================================================== --- incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrQueryFactory.java (original) +++ incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrQueryFactory.java Thu Jul 28 13:33:41 2011 @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -37,10 +38,12 @@ import org.apache.stanbol.entityhub.core import org.apache.stanbol.entityhub.core.query.DefaultQueryFactory; import org.apache.stanbol.entityhub.servicesapi.model.Representation; import org.apache.stanbol.entityhub.servicesapi.model.ValueFactory; +import org.apache.stanbol.entityhub.servicesapi.model.rdf.RdfResourceEnum; import org.apache.stanbol.entityhub.servicesapi.query.Constraint; import org.apache.stanbol.entityhub.servicesapi.query.FieldQuery; import org.apache.stanbol.entityhub.servicesapi.query.Query; import org.apache.stanbol.entityhub.servicesapi.query.RangeConstraint; +import org.apache.stanbol.entityhub.servicesapi.query.ReferenceConstraint; import org.apache.stanbol.entityhub.servicesapi.query.SimilarityConstraint; import org.apache.stanbol.entityhub.servicesapi.query.TextConstraint; import org.apache.stanbol.entityhub.servicesapi.query.ValueConstraint; @@ -147,11 +150,20 @@ public class SolrQueryFactory { QUERY, ALL } - + /** + * Converts the field query to a SolrQuery. In addition changes the parsed + * FieldQuery (e.g. removing unsupported features, setting defaults for + * missing parameters) + * @param fieldQuery the field query (will be modified to reflect the query + * as executed) + * @param select the SELECT mode + * @return the SolrQuery + */ public SolrQuery parseFieldQuery(FieldQuery fieldQuery, SELECT select) { SolrQuery query = initSolrQuery(fieldQuery); - setSelected(query, fieldQuery.getSelectedFields(), select); + setSelected(query, fieldQuery, select); StringBuilder queryString = new StringBuilder(); + Map<String,Constraint> processedFieldConstraints = new HashMap<String,Constraint>(); for (Entry<String,Constraint> fieldConstraint : fieldQuery) { if (fieldConstraint.getValue().getType() == ConstraintType.similarity) { // TODO: log make the FieldQuery ensure that there is no more than one instead of similarity @@ -174,19 +186,28 @@ public class SolrQueryFactory { } else { IndexConstraint indexConstraint = createIndexConstraint(fieldConstraint); if (indexConstraint.isInvalid()) { - log.warn(String - .format( - "Unable to create IndexConstraint for Constraint %s (type: %s) and Field %s (Reosens: %s)", - fieldConstraint.getValue(), fieldConstraint.getValue().getType(), - fieldConstraint.getKey(), indexConstraint.getInvalidMessages())); + log.warn(String.format( + "Unable to create IndexConstraint for Constraint %s (type: %s) and Field %s (Reosens: %s)", + fieldConstraint.getValue(), fieldConstraint.getValue().getType(), + fieldConstraint.getKey(), indexConstraint.getInvalidMessages())); } else { if (queryString.length() > 0) { queryString.append(" AND "); } indexConstraint.encode(queryString); + //set the constraint (may be changed because of some unsupported features) + processedFieldConstraints.put(fieldConstraint.getKey(), + indexConstraint.getFieldQueryConstraint() == null ? //if null + fieldConstraint.getValue() : //assume no change and add the parsed one + indexConstraint.getFieldQueryConstraint()); //add the changed version } } } + //set the constraints as processed to the parsed query + fieldQuery.removeAllConstraints(); + for(Entry<String,Constraint> constraint : processedFieldConstraints.entrySet()){ + fieldQuery.setConstraint(constraint.getKey(), constraint.getValue()); + } if (queryString.length() > 0) { String qs = queryString.toString(); log.info("QueryString: " + qs); @@ -210,13 +231,14 @@ public class SolrQueryFactory { * @param query * @param selected */ - private void setSelected(SolrQuery query, Collection<String> selected, SELECT select) { + private void setSelected(SolrQuery query, FieldQuery fieldQuery, SELECT select) { switch (select) { case ID: query.addField(fieldMapper.getDocumentIdField()); + fieldQuery.removeAllSelectedFields(); break; case QUERY: - if (selected.isEmpty()) { + if (fieldQuery.getSelectedFields().isEmpty()) { query.addField(fieldMapper.getDocumentIdField()); } else { query.addField("*"); @@ -239,6 +261,7 @@ public class SolrQueryFactory { } // add the select for the score query.addField("score"); + fieldQuery.addSelectedField(RdfResourceEnum.resultScore.getUri()); } private IndexConstraint createIndexConstraint(Entry<String,Constraint> fieldConstraint) { @@ -344,12 +367,14 @@ public class SolrQueryFactory { valueConstraint.getDataTypes())); } else { // first process the parsed dataTypes to get the supported types - Collection<IndexDataType> indexDataTypes = new ArrayList<IndexDataType>(); + List<IndexDataType> indexDataTypes = new ArrayList<IndexDataType>(); + List<String> acceptedDataTypes = new ArrayList<String>(); if (valueConstraint.getDataTypes() != null) { for (String dataType : valueConstraint.getDataTypes()) { IndexDataTypeEnum indexDataTypeEnumEntry = IndexDataTypeEnum.forUri(dataType); if (indexDataTypeEnumEntry != null) { indexDataTypes.add(indexDataTypeEnumEntry.getIndexType()); + acceptedDataTypes.add(dataType); } else { // TODO: Add possibility to add warnings to indexConstraints log.warn("A Datatype parsed for a ValueConstraint is not " + @@ -358,35 +383,33 @@ public class SolrQueryFactory { } } } - IndexDataType indexDataType; - if(indexDataTypes.isEmpty()){ - indexDataType = null; - } else { - Iterator<IndexDataType> it = indexDataTypes.iterator(); - indexDataType = it.next(); - if(it.hasNext()){ - log.warn("Only a single DataType is supported for ValueConstraints" + - "used: {} ignored {}", indexDataType, - ModelUtils.asCollection(it)); - } - } IndexValue constraintValue; - if (indexDataType == null) { // if no supported types are present + if(indexDataTypes.isEmpty()){ // if no supported types are present // get the dataType based on the type of the value try { constraintValue = indexValueFactory.createIndexValue(valueConstraint.getValue()); } catch (NoConverterException e) { // if not found use the toString() and string as type - indexDataType = IndexDataTypeEnum.STR.getIndexType(); log.warn(String .format( "Unable to create IndexValue for value %s (type: %s). Create IndexValue manually by using the first parsed IndexDataType %s", valueConstraint.getValue(), valueConstraint.getValue().getClass(), - indexDataType)); - constraintValue = new IndexValue(valueConstraint.getValue().toString(), indexDataType); + IndexDataTypeEnum.STR.getIndexType())); + constraintValue = new IndexValue(valueConstraint.getValue().toString(), + IndexDataTypeEnum.STR.getIndexType()); + } + acceptedDataTypes.add(constraintValue.getType().getId()); + } else { + constraintValue = new IndexValue(valueConstraint.getValue().toString(), indexDataTypes.get(0)); + //we support only a single dataType ... + // ... therefore remove additional data types from the ValueConstraint + if(indexDataTypes.size() > 1){ + log.warn("Only a single DataType is supported for ValueConstraints!"); + while(acceptedDataTypes.size()>1){ + String ignored = acceptedDataTypes.remove(acceptedDataTypes.size()-1); + log.warn(" > ignore parsed dataType {}",ignored); + } } - } else { // one or more supported dataTypes are present - constraintValue = new IndexValue(valueConstraint.getValue().toString(), indexDataType); } indexConstraint.setFieldConstraint(IndexConstraintTypeEnum.DATATYPE, constraintValue); if(IndexDataTypeEnum.TXT.getIndexType().equals(constraintValue.getType())){ @@ -396,6 +419,13 @@ public class SolrQueryFactory { Collections.singleton(constraintValue.getLanguage())); } indexConstraint.setFieldConstraint(IndexConstraintTypeEnum.EQ, constraintValue); + //update this constraint! + if(valueConstraint instanceof ReferenceConstraint){ + indexConstraint.setFieldQueryConstraint(valueConstraint); + } else { + indexConstraint.setFieldQueryConstraint( + new ValueConstraint(valueConstraint.getValue(), acceptedDataTypes)); + } } } @@ -416,12 +446,14 @@ public class SolrQueryFactory { log.warn(String.format( "Parsed Number of QueryResults %d is greater than the allowed maximum of %d!", entityhubQuery.getLimit(), MAX_QUERY_RESULTS)); + entityhubQuery.setLimit(MAX_QUERY_RESULTS); } } else { // maybe remove that to prevent to many results! But for now I would // rather like to have a default value within the FieldQuery! // e.g. set by the FieldQueryFactory when creating new queries! - query.setRows(MAX_QUERY_RESULTS); + query.setRows(DEFAULT_QUERY_RESULTS); + entityhubQuery.setLimit(DEFAULT_QUERY_RESULTS); } return query; } @@ -518,6 +550,7 @@ public class SolrQueryFactory { private final Map<IndexConstraintTypeEnum,Object> fieldConstraints = new EnumMap<IndexConstraintTypeEnum,Object>( IndexConstraintTypeEnum.class); private List<String> invalidMessages = new ArrayList<String>(); + private Constraint fieldQueryConstraint; /** * Creates a Field Term for the parsed path @@ -564,6 +597,24 @@ public class SolrQueryFactory { public List<String> getInvalidMessages() { return invalidMessages; } + /** + * Getter for the (possible modified against the parsed constrained) + * version of the FieldQuery {@link Constraint} + * @return the Constraint or <code>null</code> if + * <code>{@link #isInvalid()} == false</code> + */ + public final Constraint getFieldQueryConstraint() { + return fieldQueryConstraint; + } + /** + /** + * Getter for the (possible modified against the parsed constrained) + * version of the FieldQuery {@link Constraint} + * @param fieldQueryConstraint the constraint + */ + protected final void setFieldQueryConstraint(Constraint fieldQueryConstraint) { + this.fieldQueryConstraint = fieldQueryConstraint; + } /** * Sets an IndexConstraintType to a specific value
Modified: incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrYard.java URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrYard.java?rev=1151837&r1=1151836&r2=1151837&view=diff ============================================================================== --- incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrYard.java (original) +++ incubator/stanbol/trunk/entityhub/yard/solr/src/main/java/org/apache/stanbol/entityhub/yard/solr/impl/SolrYard.java Thu Jul 28 13:33:41 2011 @@ -601,12 +601,15 @@ public class SolrYard extends AbstractYa } private QueryResultList<Representation> find(final FieldMapper fieldMapper,final FieldQuery parsedQuery, SELECT select) throws YardException { - log.debug("find " + parsedQuery); + //create a clone of the query, because we need to refine it because the + //query (as executed) needs to be included in the result set + FieldQuery fieldQuery = parsedQuery.clone(); + log.debug("find " + fieldQuery); long start = System.currentTimeMillis(); final Set<String> selected; if (select == SELECT.QUERY) { // if query set the fields to add to the result Representations - selected = new HashSet<String>(parsedQuery.getSelectedFields()); + selected = new HashSet<String>(fieldQuery.getSelectedFields()); // add the score to query results! selected.add(RdfResourceEnum.resultScore.getUri()); } else { @@ -614,7 +617,7 @@ public class SolrYard extends AbstractYa selected = null; } - SolrQuery query = getSolrQueryFactory().parseFieldQuery(parsedQuery, select); + SolrQuery query = getSolrQueryFactory().parseFieldQuery(fieldQuery, select); long queryGeneration = System.currentTimeMillis(); QueryResponse response; @@ -631,7 +634,7 @@ public class SolrYard extends AbstractYa } long queryTime = System.currentTimeMillis(); // return a queryResultList - QueryResultListImpl<Representation> resultList = new QueryResultListImpl<Representation>(parsedQuery, + QueryResultListImpl<Representation> resultList = new QueryResultListImpl<Representation>(fieldQuery, // by adapting SolrDocuments to Representations new AdaptingIterator<SolrDocument,Representation>(response.getResults().iterator(), // inline Adapter Implementation @@ -652,7 +655,10 @@ public class SolrYard extends AbstractYa @Override public final QueryResultList<String> findReferences(FieldQuery parsedQuery) throws YardException { - SolrQuery query = getSolrQueryFactory().parseFieldQuery(parsedQuery, SELECT.ID); + //create a clone of the query, because we need to refine it because the + //query (as executed) needs to be included in the result set + FieldQuery fieldQuery = parsedQuery.clone(); + SolrQuery query = getSolrQueryFactory().parseFieldQuery(fieldQuery, SELECT.ID); QueryResponse respone; try { respone = getServer().query(query, METHOD.POST); @@ -661,7 +667,7 @@ public class SolrYard extends AbstractYa } final FieldMapper fieldMapper = getFieldMapper(); // return a queryResultList - return new QueryResultListImpl<String>(parsedQuery, + return new QueryResultListImpl<String>(fieldQuery, // by adapting SolrDocuments to Representations new AdaptingIterator<SolrDocument,String>(respone.getResults().iterator(), // inline Adapter Implementation Modified: incubator/stanbol/trunk/integration-tests/pom.xml URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/integration-tests/pom.xml?rev=1151837&r1=1151836&r2=1151837&view=diff ============================================================================== --- incubator/stanbol/trunk/integration-tests/pom.xml (original) +++ incubator/stanbol/trunk/integration-tests/pom.xml Thu Jul 28 13:33:41 2011 @@ -60,7 +60,7 @@ <groupId>org.apache.stanbol</groupId> <artifactId>org.apache.stanbol.launchers.full</artifactId> </dependency> - <dependency> + <dependency> <groupId>org.apache.stanbol</groupId> <artifactId>org.apache.stanbol.commons.web.base</artifactId> </dependency> @@ -73,6 +73,10 @@ <artifactId>org.apache.stanbol.commons.testing.stanbol</artifactId> </dependency> <dependency> + <groupId>org.apache.stanbol</groupId> + <artifactId>org.apache.stanbol.entityhub.test</artifactId> + </dependency> + <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> Modified: incubator/stanbol/trunk/integration-tests/src/test/java/org/apache/stanbol/entityhub/it/EntityHubTest.java URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/integration-tests/src/test/java/org/apache/stanbol/entityhub/it/EntityHubTest.java?rev=1151837&r1=1151836&r2=1151837&view=diff ============================================================================== --- incubator/stanbol/trunk/integration-tests/src/test/java/org/apache/stanbol/entityhub/it/EntityHubTest.java (original) +++ incubator/stanbol/trunk/integration-tests/src/test/java/org/apache/stanbol/entityhub/it/EntityHubTest.java Thu Jul 28 13:33:41 2011 @@ -16,19 +16,26 @@ */ package org.apache.stanbol.entityhub.it; +import static junit.framework.Assert.*; + +import java.util.ArrayList; +import java.util.Collections; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.stanbol.commons.testing.http.RequestExecutor; -import org.apache.stanbol.commons.web.base.writers.JsonLdSerializerProvider; -import org.apache.stanbol.enhancer.it.EnhancerTestBase; +import org.apache.stanbol.entityhub.test.it.EntityhubTestBase; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONObject; -import org.junit.Assert; import org.junit.Test; //inherit from EnhancerTestBase, but we more care about the entityhub readiness than engine's one. -public class EntityHubTest extends EnhancerTestBase { +public final class EntityHubTest extends EntityhubTestBase { + public EntityHubTest() { + super(new ArrayList<String>(),LoggerFactory.getLogger(EntityHubTest.class)); + } + private final Logger log = LoggerFactory.getLogger(getClass()); final String PARIS_VALUE = @@ -79,14 +86,14 @@ public class EntityHubTest extends Enhan ) ; log.info("Test request number {}/{} : ",i,queryRequests.length); - log.info(re.getContent()); + log.debug(re.getContent()); re.assertStatus(200) .assertContentType("application/json"); JSONObject jso = new JSONObject(re.getContent()); JSONArray result = jso.getJSONArray("results"); - Assert.assertNotSame(0, result.length()); + assertNotSame(0, result.length()); } } @@ -99,13 +106,13 @@ public class EntityHubTest extends Enhan ) ; log.info("Test request : "); - log.info(re.getContent()); + log.debug(re.getContent()); re.assertStatus(200) .assertContentType("application/json"); JSONObject jso = new JSONObject(re.getContent()); JSONArray result = jso.getJSONArray("results"); - Assert.assertNotSame(0, result.length()); + assertNotSame(0, result.length()); } }
