diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java index c4ef867c9bb8dc00ed0cb5cc00de59594c4a79fb..7c8c5e4df7b5200c74c854e07f958d356ef8536b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/AbstractEntityAdaptor.java @@ -51,34 +51,48 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstant */ public class AbstractEntityAdaptor implements IEntityAdaptor { - protected final Map<String, IEntityPropertyAdaptor> propertiesByCode = - new HashMap<String, IEntityPropertyAdaptor>(); - private final String code; + protected final IEntityPropertiesHolder propertiesHolder; + + protected Map<String, IEntityPropertyAdaptor> propertiesByCode; + protected final IDynamicPropertyEvaluator evaluator; protected static String ENTITY_TYPE_CODE_FIELD = SearchFieldConstants.PREFIX_ENTITY_TYPE + SearchFieldConstants.CODE; - public AbstractEntityAdaptor(String code) + public AbstractEntityAdaptor(String code, Collection<IEntityPropertyAdaptor> properties) { - this(code, null); + this.code = code; + this.propertiesHolder = null; + this.evaluator = null; + initPropertiesMap(properties); } - public AbstractEntityAdaptor(String code, IDynamicPropertyEvaluator evaluator) + public AbstractEntityAdaptor(IEntityPropertiesHolder propertiesHolder, + IDynamicPropertyEvaluator propertyEvaluator) { - this.code = code; - this.evaluator = evaluator; + this.code = propertiesHolder.getCode(); + this.propertiesHolder = propertiesHolder; + this.evaluator = propertyEvaluator; } - protected void initProperties(IEntityPropertiesHolder propertiesHolder) + private void initPropertiesMap() { + if (propertiesHolder == null) + { + throw new IllegalStateException( + "Couldn't init properties if the properties holder has not been set"); + } if (evaluator == null) { throw new IllegalStateException( - "Couldn't init properties if the evaluator has not been set"); + "Couldn't init properties if the property evaluator has not been set"); } + + propertiesByCode = new HashMap<String, IEntityPropertyAdaptor>(); + for (EntityPropertyPE property : propertiesHolder.getProperties()) { EntityTypePropertyTypePE etpt = property.getEntityTypePropertyType(); @@ -115,9 +129,32 @@ public class AbstractEntityAdaptor implements IEntityAdaptor } } - public void addProperty(IEntityPropertyAdaptor property) + private void initPropertiesMap(Collection<IEntityPropertyAdaptor> properties) + { + propertiesByCode = new HashMap<String, IEntityPropertyAdaptor>(); + + if (properties != null) + { + for (IEntityPropertyAdaptor property : properties) + { + addProperty(property); + } + } + } + + private Map<String, IEntityPropertyAdaptor> propertiesMap() + { + if (propertiesByCode == null) + { + initPropertiesMap(); + } + + return propertiesByCode; + } + + private void addProperty(IEntityPropertyAdaptor property) { - propertiesByCode.put(property.propertyTypeCode().toUpperCase(), property); + propertiesMap().put(property.propertyTypeCode().toUpperCase(), property); } @Override @@ -129,7 +166,7 @@ public class AbstractEntityAdaptor implements IEntityAdaptor @Override public IEntityPropertyAdaptor property(String propertyTypeCode) { - return propertiesByCode.get(propertyTypeCode.toUpperCase()); + return propertiesMap().get(propertyTypeCode.toUpperCase()); } @Override @@ -149,7 +186,7 @@ public class AbstractEntityAdaptor implements IEntityAdaptor @Override public Collection<IEntityPropertyAdaptor> properties() { - return propertiesByCode.values(); + return propertiesMap().values(); } protected Query regexpConstraint(String field, String value) @@ -159,8 +196,8 @@ public class AbstractEntityAdaptor implements IEntityAdaptor protected Query constraint(String field, String value) { - return LuceneQueryBuilder.parseQuery(field, value, LuceneQueryBuilder - .createSearchAnalyzer()); + return LuceneQueryBuilder.parseQuery(field, value, + LuceneQueryBuilder.createSearchAnalyzer()); } protected Query and(Query... queries) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java index 7da2d2852505009edb7b3cdf3d0d77759fc4d094..72e245d1c187cf67d840ade625dcda6f84095653 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExperimentAdaptor.java @@ -45,9 +45,8 @@ public class ExperimentAdaptor extends AbstractEntityAdaptor implements IExperim public ExperimentAdaptor(ExperimentPE experimentPE, IDynamicPropertyEvaluator evaluator, Session session) { - super(experimentPE.getCode(), evaluator); + super(experimentPE, evaluator); this.session = session; - initProperties(experimentPE); this.experimentPE = experimentPE; } @@ -71,8 +70,7 @@ public class ExperimentAdaptor extends AbstractEntityAdaptor implements IExperim @Override public Iterable<ISampleAdaptor> samplesOfType(String typeRegexp) { - Query typeConstraint = - regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeRegexp.toLowerCase()); + Query typeConstraint = regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeRegexp.toLowerCase()); Query experimentCodeConstraint = constraint(SearchFieldConstants.EXPERIMENT_ID, Long.toString(experimentPE.getId())); Query query = and(typeConstraint, experimentCodeConstraint); @@ -90,8 +88,7 @@ public class ExperimentAdaptor extends AbstractEntityAdaptor implements IExperim @Override public Iterable<IDataAdaptor> dataSetsOfType(String typeRegexp) { - Query typeConstraint = - regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeRegexp.toLowerCase()); + Query typeConstraint = regexpConstraint(ENTITY_TYPE_CODE_FIELD, typeRegexp.toLowerCase()); Query experimentCodeConstraint = constraint(SearchFieldConstants.EXPERIMENT_ID, Long.toString(experimentPE.getId())); Query query = and(typeConstraint, experimentCodeConstraint); diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java index c63475b6db0cc788c38704f6c2479bba57c96cd9..d7fecae3714fd59a4233d3528ddf70e40daac51b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/ExternalDataAdaptor.java @@ -44,9 +44,8 @@ public class ExternalDataAdaptor extends AbstractEntityAdaptor implements IDataA public ExternalDataAdaptor(DataPE externalDataPE, IDynamicPropertyEvaluator evaluator, Session session) { - super(externalDataPE.getCode(), evaluator); + super(externalDataPE, evaluator); this.session = session; - initProperties(externalDataPE); this.externalDataPE = externalDataPE; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/MaterialAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/MaterialAdaptor.java index 327c50be52bc1751486cf3513e74105dd4b7216e..b76232493b48b55a70c083597885aa6369314f90 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/MaterialAdaptor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/MaterialAdaptor.java @@ -33,8 +33,7 @@ public class MaterialAdaptor extends AbstractEntityAdaptor implements IMaterialA public MaterialAdaptor(MaterialPE MaterialPE, IDynamicPropertyEvaluator evaluator) { - super(MaterialPE.getCode(), evaluator); - initProperties(MaterialPE); + super(MaterialPE, evaluator); this.MaterialPE = MaterialPE; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java index 2487d63405a37c42fb020993a2e9aedfeed6fa7e..37e2bb720b7705f0277e929f7c87cccb27a3160b 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/SampleAdaptor.java @@ -42,9 +42,8 @@ public class SampleAdaptor extends AbstractEntityAdaptor implements ISampleAdapt public SampleAdaptor(SamplePE samplePE, IDynamicPropertyEvaluator evaluator, Session session) { - super(samplePE.getCode(), evaluator); + super(samplePE, evaluator); this.session = session; - initProperties(samplePE); this.samplePE = samplePE; } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java index d2c6033dc34f897282a376447d144bee94d645f9..fde907ad019f3dc4a87cbbe8529fd410a98bb01d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/DataPE.java @@ -42,6 +42,7 @@ import javax.persistence.Version; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Fetch; @@ -674,7 +675,7 @@ public class DataPE extends AbstractIdAndCodeHolder<DataPE> implements @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity", orphanRemoval = true) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_PROPERTIES) - @Fetch(FetchMode.SUBSELECT) + @BatchSize(size = 100) private Set<DataSetPropertyPE> getDataSetProperties() { return properties; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java index 8db2823f70d2b5e59d1825f24e4083dd08d510a9..837341cc6ac1cd6b9ca93a2398775e8b96c1a232 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ExperimentPE.java @@ -44,6 +44,7 @@ import javax.validation.constraints.Pattern; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Fetch; @@ -281,7 +282,7 @@ public class ExperimentPE extends AttachmentHolderPE implements @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity", orphanRemoval = true) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_PROPERTIES) - @Fetch(FetchMode.SUBSELECT) + @BatchSize(size = 100) private Set<ExperimentPropertyPE> getExperimentProperties() { return properties; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java index 53d831e4b4ef3d36f8778f31cff15bd2cff64dc4..6bb16b42a728720985ca30d722180bb74820c32a 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/MaterialPE.java @@ -41,6 +41,7 @@ import javax.validation.constraints.NotNull; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Fetch; @@ -76,7 +77,8 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; ColumnNames.DATABASE_INSTANCE_COLUMN })) @Indexed(index = "MaterialPE") public class MaterialPE implements IIdAndCodeHolder, Comparable<MaterialPE>, - IEntityInformationWithPropertiesHolder, Serializable, IMatchingEntity, IEntityWithMetaprojects + IEntityInformationWithPropertiesHolder, Serializable, IMatchingEntity, + IEntityWithMetaprojects { private static final long serialVersionUID = IServer.VERSION; @@ -215,7 +217,7 @@ public class MaterialPE implements IIdAndCodeHolder, Comparable<MaterialPE>, @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity", orphanRemoval = true) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_PROPERTIES) - @Fetch(FetchMode.SUBSELECT) + @BatchSize(size = 100) private Set<MaterialPropertyPE> getMaterialProperties() { return properties; diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java index 04474876de38db202d3ee52ca0168c1ab8110cea..41e62b1b7eccdfba3e96acb2c3662873f30dfcf5 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SamplePE.java @@ -46,6 +46,7 @@ import javax.validation.constraints.Pattern; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ToStringBuilder; +import org.hibernate.annotations.BatchSize; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Check; @@ -373,7 +374,7 @@ public class SamplePE extends AttachmentHolderPE implements IIdAndCodeHolder, Co @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity", orphanRemoval = true) @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @IndexedEmbedded(prefix = SearchFieldConstants.PREFIX_PROPERTIES) - @Fetch(FetchMode.SUBSELECT) + @BatchSize(size = 100) private Set<SamplePropertyPE> getSampleProperties() { return properties; diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java index 3be836117145f0f3828ff17a6a3ad9dad99741fb..be713d1acde656e8a415ececf53e5b5b65c82540 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/DynamicPropertyEvaluatorTest.java @@ -522,15 +522,7 @@ public class DynamicPropertyEvaluatorTest extends AbstractBOTest private static IEntityAdaptor createEntity(final String code, final Collection<IEntityPropertyAdaptor> properties) { - final AbstractEntityAdaptor result = new AbstractEntityAdaptor(code); - if (properties != null) - { - for (IEntityPropertyAdaptor property : properties) - { - result.addProperty(property); - } - } - return result; + return new AbstractEntityAdaptor(code, properties); } private static IEntityPropertyAdaptor createProperty(final String propertyTypeCode, diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorTest.java index e0ac229ab858f82e692ae0c39d13fca1c721ba92..99b0cc0bb84f880cea96272c6a588d48eb357c42 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/dynamic_property/calculator/DynamicPropertyCalculatorTest.java @@ -23,10 +23,6 @@ import org.testng.AssertJUnit; import org.testng.annotations.Test; import ch.systemsx.cisd.common.jython.evaluator.EvaluatorException; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.AbstractEntityAdaptor; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.BasicPropertyAdaptor; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.DynamicPropertyCalculator; -import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.XmlPropertyAdaptor; import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityAdaptor; import ch.systemsx.cisd.openbis.generic.server.dataaccess.dynamic_property.calculator.api.IEntityPropertyAdaptor; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier; @@ -152,15 +148,7 @@ public class DynamicPropertyCalculatorTest extends AssertJUnit private static IEntityAdaptor createEntity(final String code, final Collection<IEntityPropertyAdaptor> properties) { - final AbstractEntityAdaptor result = new AbstractEntityAdaptor(code); - if (properties != null) - { - for (IEntityPropertyAdaptor property : properties) - { - result.addProperty(property); - } - } - return result; + return new AbstractEntityAdaptor(code, properties); } private static IEntityPropertyAdaptor createProperty(final String propertyTypeCode,