Skip to content

Commit 83912d4

Browse files
committed
Add support for subqueries for the Criteria-based filtering service
1 parent c3004ba commit 83912d4

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

gemma-core/src/main/java/ubic/gemma/persistence/service/analysis/expression/diff/ExpressionAnalysisResultSetDaoImpl.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,9 @@
2626
import org.hibernate.sql.JoinType;
2727
import org.springframework.beans.factory.annotation.Autowired;
2828
import org.springframework.stereotype.Repository;
29-
import org.springframework.transaction.PlatformTransactionManager;
3029
import ubic.gemma.model.analysis.expression.diff.*;
3130
import ubic.gemma.model.common.description.Characteristic;
3231
import ubic.gemma.model.common.description.DatabaseEntry;
33-
import ubic.gemma.model.common.measurement.Measurement;
3432
import ubic.gemma.model.common.protocol.Protocol;
3533
import ubic.gemma.model.expression.experiment.BioAssaySet;
3634
import ubic.gemma.model.expression.experiment.ExpressionExperiment;
@@ -41,7 +39,10 @@
4139
import ubic.gemma.persistence.util.*;
4240

4341
import javax.annotation.Nullable;
44-
import java.util.*;
42+
import java.util.Collection;
43+
import java.util.HashSet;
44+
import java.util.List;
45+
import java.util.Map;
4546
import java.util.concurrent.TimeUnit;
4647
import java.util.stream.Collectors;
4748

@@ -221,13 +222,13 @@ protected void configureFilterableProperties( FilterablePropertiesConfigurer con
221222
configurer.unregisterEntity( "analysis.protocol.", Protocol.class );
222223

223224
// use the characteristics instead
224-
configurer.registerAlias( "analysis.subsetFactorValue.characteristics.", "sfvc", Characteristic.class, null, 1 );
225+
configurer.registerAlias( "analysis.subsetFactorValue.characteristics.", "sfvc", Characteristic.class, null, 1, true );
225226
configurer.unregisterProperty( "analysis.subsetFactorValue.characteristics.originalValue" );
226227
configurer.unregisterProperty( "analysis.subsetFactorValue.value" );
227228

228229
// baseline is always baseline
229230
configurer.unregisterProperty( "baselineGroup.isBaseline" );
230-
configurer.registerAlias( "baselineGroup.characteristics.", "bc", Characteristic.class, null, 1 );
231+
configurer.registerAlias( "baselineGroup.characteristics.", "bc", Characteristic.class, null, 1, true );
231232
configurer.unregisterProperty( "baselineGroup.characteristics.originalValue" );
232233
configurer.unregisterProperty( "baselineGroup.value" );
233234

gemma-core/src/main/java/ubic/gemma/persistence/util/FilterCriteriaUtils.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import javax.annotation.Nullable;
77
import java.util.Collection;
88
import java.util.List;
9-
import java.util.Objects;
9+
10+
import static java.util.Objects.requireNonNull;
1011

1112
/**
1213
* Utilities for integrating {@link Filter} with Hibernate {@link Criteria} API.
@@ -75,7 +76,8 @@ private static Criterion formRestrictionClause( Filter filter ) {
7576
return Restrictions.ne( property, filter.getRequiredValue() );
7677
}
7778
case like:
78-
return Restrictions.like( property, escapeLike( ( String ) Objects.requireNonNull( filter.getRequiredValue(), "Required value cannot be null for the like operator." ) ), MatchMode.START );
79+
return Restrictions.like( property, escapeLike( ( String ) requireNonNull( filter.getRequiredValue(),
80+
"Required value cannot be null for the like operator." ) ), MatchMode.START );
7981
case lessThan:
8082
return Restrictions.lt( property, filter.getRequiredValue() );
8183
case greaterThan:
@@ -85,8 +87,18 @@ private static Criterion formRestrictionClause( Filter filter ) {
8587
case greaterOrEq:
8688
return Restrictions.ge( property, filter.getRequiredValue() );
8789
case in:
88-
return Restrictions.in( property, ( Collection<?> ) Objects.requireNonNull( filter.getRequiredValue(),
90+
return Restrictions.in( property, ( Collection<?> ) requireNonNull( filter.getRequiredValue(),
8991
"Required value cannot be null for a collection." ) );
92+
case inSubquery:
93+
Subquery subquery = ( Subquery ) requireNonNull( filter.getRequiredValue(),
94+
"Required value cannot be null for a subquery." );
95+
DetachedCriteria dc = DetachedCriteria.forEntityName( subquery.getEntityName() )
96+
.setProjection( Projections.id() );
97+
for ( Subquery.Alias a : subquery.getAliases() ) {
98+
dc.createAlias( a.getPropertyName(), a.getAlias() );
99+
}
100+
dc.add( formRestrictionClause( subquery.getFilter() ) );
101+
return Subqueries.propertyIn( "id", dc );
90102
default:
91103
throw new IllegalStateException( "Unexpected operator for filter: " + filter.getOperator() );
92104
}

0 commit comments

Comments
 (0)