From 966aa362bcf9d0d62c615dbb8e1adf7eb7756345 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 26 Nov 2024 15:33:18 -0800 Subject: [PATCH 01/37] Initial hit criteria --- .../client/model/GWTPropertyDescriptor.java | 47 ++++----- .../api/assay/AbstractAssayProvider.java | 2 +- .../labkey/api/assay/AssayDomainService.java | 2 +- .../org/labkey/api/assay/AssayProvider.java | 2 +- .../plate/AssayPlateMetadataService.java | 16 ++- .../labkey/api/assay/plate/HitCriterion.java | 81 +++++++++++++++ .../labkey/api/query/ValidationException.java | 24 ++--- assay/resources/schemas/assay.xml | 11 +++ .../dbscripts/postgresql/assay-next.sql | 14 +++ .../dbscripts/sqlserver/assay-next.sql | 0 .../labkey/assay/AssayDomainServiceImpl.java | 84 +++++++++++----- .../org/labkey/assay/TsvAssayProvider.java | 24 ++--- .../plate/AssayPlateMetadataServiceImpl.java | 99 +++++++++++++------ .../assay/plate/AssayPlateTriggerFactory.java | 17 +++- .../org/labkey/assay/plate/PlateManager.java | 74 ++++++++++++-- .../assay/plate/query/HitCriteriaTable.java | 55 +++++++++++ .../labkey/assay/plate/query/PlateSchema.java | 3 + .../org/labkey/assay/query/AssayDbSchema.java | 5 + 18 files changed, 425 insertions(+), 135 deletions(-) create mode 100644 api/src/org/labkey/api/assay/plate/HitCriterion.java create mode 100644 assay/resources/schemas/dbscripts/postgresql/assay-next.sql create mode 100644 assay/resources/schemas/dbscripts/sqlserver/assay-next.sql create mode 100644 assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java index 82977e8b57a..b907374a3c3 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java @@ -17,6 +17,7 @@ package org.labkey.api.gwt.client.model; import com.google.gwt.user.client.rpc.IsSerializable; +import org.json.JSONArray; import org.labkey.api.gwt.client.DefaultScaleType; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.LockedPropertyType; @@ -29,10 +30,6 @@ import java.util.List; /** - * User: matthewb - * Date: Apr 24, 2007 - * Time: 1:28:42 PM - * * see org.labkey.api.exp.PropertyDescriptor */ public class GWTPropertyDescriptor implements IsSerializable @@ -82,14 +79,13 @@ public class GWTPropertyDescriptor implements IsSerializable private StringProperty lockType = new StringProperty(LockedPropertyType.NotLocked.name()); private BooleanProperty scannable = new BooleanProperty(false); private StringProperty valueExpression = new StringProperty(); + private JSONArray plateHitCriteria = null; // for controlling the property editor (not persisted or user settable) -// private boolean isEditable = true; private boolean isTypeEditable = true; -// private boolean isNameEditable = true; - private List validators = new ArrayList(); - private List conditionalFormats = new ArrayList(); + private List validators = new ArrayList<>(); + private List conditionalFormats = new ArrayList<>(); public GWTPropertyDescriptor() { @@ -148,6 +144,7 @@ public GWTPropertyDescriptor(GWTPropertyDescriptor s) setDerivationDataScope(s.getDerivationDataScope()); setScannable(s.isScannable()); setValueExpression(s.getValueExpression()); + setPlateHitCriteria(s.getPlateHitCriteria()); for (GWTPropertyValidator v : s.getPropertyValidators()) { @@ -595,6 +592,16 @@ public void setValueExpression(String valueExpression) this.valueExpression.set(valueExpression); } + public JSONArray getPlateHitCriteria() + { + return this.plateHitCriteria; + } + + public void setPlateHitCriteria(JSONArray plateHitCriteria) + { + this.plateHitCriteria = plateHitCriteria; + } + public boolean getIsPrimaryKey() { return isPrimaryKey.booleanValue(); @@ -690,6 +697,7 @@ public boolean equals(Object o) if (getRedactedText() != null ? !getRedactedText().equals(that.getRedactedText()) : that.getRedactedText() != null) return false; if (isScannable() != that.isScannable()) return false; if (!equals(getValueExpression(),that.getValueExpression())) return false; + // TODO: Implement equals return true; } @@ -737,6 +745,7 @@ public int hashCode() result = 31 * result + derivationDataScope.hashCode(); result = 31 * result + (scannable.getBoolean() != null ? scannable.getBoolean().hashCode() : 0); result = 31 * result + valueExpression.hashCode(); + result = 31 * result + (plateHitCriteria != null ? plateHitCriteria.hashCode() : 0); for (GWTPropertyValidator gwtPropertyValidator : getPropertyValidators()) { @@ -807,18 +816,6 @@ public boolean isFileType() "http://www.labkey.org/exp/xml#attachment".equals(getRangeURI()); } - - // for communicating with the type editor, not persisted -// public void setEditable(boolean b) -// { -// isEditable = b; -// } -// -// public boolean isEditable() -// { -// return isEditable; -// } - public void setTypeEditable(boolean b) { isTypeEditable = b; @@ -828,14 +825,4 @@ public boolean isTypeEditable() { return isTypeEditable; } - -// public void setNameEditable(boolean b) -// { -// isNameEditable = b; -// } -// -// public boolean isNameEditable() -// { -// return isNameEditable; -// } } diff --git a/api/src/org/labkey/api/assay/AbstractAssayProvider.java b/api/src/org/labkey/api/assay/AbstractAssayProvider.java index 0a138def90d..199b1d9e5a3 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayProvider.java +++ b/api/src/org/labkey/api/assay/AbstractAssayProvider.java @@ -401,7 +401,7 @@ public Domain getResultsDomain(ExpProtocol protocol) } @Override - public void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) + public void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException { } diff --git a/api/src/org/labkey/api/assay/AssayDomainService.java b/api/src/org/labkey/api/assay/AssayDomainService.java index ab81f5d8fe1..ee47049f1f0 100644 --- a/api/src/org/labkey/api/assay/AssayDomainService.java +++ b/api/src/org/labkey/api/assay/AssayDomainService.java @@ -25,5 +25,5 @@ public interface AssayDomainService GWTProtocol getAssayTemplate(String providerName); - GWTProtocol saveChanges(GWTProtocol plate, boolean replaceIfExisting) throws ValidationException; + GWTProtocol saveChanges(GWTProtocol protocol, boolean replaceIfExisting) throws ValidationException; } \ No newline at end of file diff --git a/api/src/org/labkey/api/assay/AssayProvider.java b/api/src/org/labkey/api/assay/AssayProvider.java index b3c912ab681..3c591651770 100644 --- a/api/src/org/labkey/api/assay/AssayProvider.java +++ b/api/src/org/labkey/api/assay/AssayProvider.java @@ -100,7 +100,7 @@ enum ReRunSupport Domain getResultsDomain(ExpProtocol protocol); - void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update); + void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException; AssayRunCreator getRunCreator(); diff --git a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java index ac88c481d51..512794fb646 100644 --- a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java +++ b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java @@ -17,6 +17,7 @@ import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; import org.labkey.api.qc.DataLoaderSettings; +import org.labkey.api.query.ValidationException; import org.labkey.api.security.User; import org.labkey.api.services.ServiceRegistry; import org.labkey.vfs.FileLike; @@ -106,7 +107,7 @@ void updateReplicateStatsDomain( ExpProtocol protocol, GWTDomain update, Domain resultsDomain - ) throws ExperimentException; + ) throws ValidationException; /** * Computes and inserts replicate statistics into the protocol schema table. @@ -120,19 +121,26 @@ void insertReplicateStats( ExpProtocol protocol, @NotNull ExpRun run, Map>> replicateRows - ) throws ExperimentException; + ) throws ValidationException; void updateReplicateStats( Container container, User user, ExpProtocol protocol, Map>> replicateRows - ) throws ExperimentException; + ) throws ValidationException; void deleteReplicateStats( Container container, User user, ExpProtocol protocol, List> keys - ) throws ExperimentException; + ) throws ValidationException; + + void updateHitCriteria( + User user, + ExpProtocol protocol, + GWTDomain update, + Domain resultsDomain + ) throws ValidationException; } diff --git a/api/src/org/labkey/api/assay/plate/HitCriterion.java b/api/src/org/labkey/api/assay/plate/HitCriterion.java new file mode 100644 index 00000000000..2cc39badff9 --- /dev/null +++ b/api/src/org/labkey/api/assay/plate/HitCriterion.java @@ -0,0 +1,81 @@ +package org.labkey.api.assay.plate; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; +import org.labkey.api.query.ValidationException; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public record HitCriterion(String operation, String value, @Nullable Integer propertyId, @Nullable String name, Integer referencePropertyId, Integer domainId) +{ + public static @NotNull List getCriteriaFromJSON(JSONArray jsonArray, int referencePropertyId, String referencePropertyName, int domainId) throws ValidationException + { + if (jsonArray == null || jsonArray.isEmpty()) + return Collections.emptyList(); + + var criteria = new ArrayList(); + + for (int i = 0; i < jsonArray.length(); i++) + { + var entry = jsonArray.get(i); + + if (!(entry instanceof JSONObject json)) + throw new ValidationException(errorMessage(referencePropertyName, i, "JSON array contains invalid elements.")); + + boolean hasPropertyId = json.has("propertyId"); + boolean hasName = json.has("name"); + + if (!hasPropertyId && !hasName) + throw new ValidationException(errorMessage(referencePropertyName, i, "Either a \"propertyId\" or \"name\" is required.")); + if (!json.has("op")) + throw new ValidationException(errorMessage(referencePropertyName, i, "An \"op\" (operation) property is required.")); + + try + { + Integer propertyId = hasPropertyId ? json.getInt("propertyId") : null; + String name = hasName ? json.getString("name") : null; + String operation = json.getString("op"); + Object value = json.has("value") ? json.get("value") : null; + + criteria.add(new HitCriterion(operation, value == null ? null : value.toString(), propertyId, name, referencePropertyId, domainId)); + } + catch (JSONException e) + { + throw new ValidationException(errorMessage(referencePropertyName, i, e.getMessage())); + } + } + + return criteria; + } + + public static JSONArray toJSON(List criteria) + { + var json = new JSONArray(); + + for (HitCriterion criterion : criteria) + { + var object = new JSONObject(); + + object.put("name", criterion.name); + object.put("op", criterion.operation); + object.put("propertyId", criterion.propertyId); + object.put("value", criterion.value); + // Intentionally not serializing "ReferencePropertyId" + // Intentionally not serializing "DomainId" + + json.put(object); + } + + return json; + } + + private static String errorMessage(String parentName, int index, String message) + { + return String.format("Invalid hit criteria for field \"%s\" at index [%d]. %s", parentName, index, message); + } +} diff --git a/api/src/org/labkey/api/query/ValidationException.java b/api/src/org/labkey/api/query/ValidationException.java index af558adeda0..69bf3032325 100644 --- a/api/src/org/labkey/api/query/ValidationException.java +++ b/api/src/org/labkey/api/query/ValidationException.java @@ -35,19 +35,13 @@ import java.util.Map; import java.util.Set; -/* - * User: Dave - * Date: Jun 9, 2008 - * Time: 4:49:33 PM - */ - /** * This class is thrown if there were validation errors during a save. * This class is essentially a container for objects that implement * ValidationError, so use the getErrors() method to * retrieve individual validation errors. The toString() * method will simply concatenate all the error messages together, - * separated by semi-colons. + * separated by semicolons. */ public class ValidationException extends Exception implements Iterable { @@ -56,8 +50,8 @@ public class ValidationException extends Exception implements Iterable> _fieldErrors = new LinkedHashMap<>(); - private List _globalErrors = new ArrayList<>(); + private final Map> _fieldErrors = new LinkedHashMap<>(); + private final List _globalErrors = new ArrayList<>(); private String _schemaName; private String _queryName; @@ -85,8 +79,8 @@ public enum SEVERITY WARN("Warning", Level.WARN), INFO("Info", Level.INFO); - String _sevName; - Level _level; + final String _sevName; + final Level _level; SEVERITY(String sevName, Level level) { @@ -293,10 +287,10 @@ else if (value instanceof Object[]) public ValidationException addError(ValidationError error) { - if (error instanceof PropertyValidationError) - addFieldError((PropertyValidationError) error); - else if (error instanceof SimpleValidationError) - addGlobalError((SimpleValidationError) error); + if (error instanceof PropertyValidationError pve) + addFieldError(pve); + else if (error instanceof SimpleValidationError sve) + addGlobalError(sve); else throw new IllegalArgumentException(); diff --git a/assay/resources/schemas/assay.xml b/assay/resources/schemas/assay.xml index bb1e3fe8897..37ef7d9a520 100644 --- a/assay/resources/schemas/assay.xml +++ b/assay/resources/schemas/assay.xml @@ -201,6 +201,17 @@ + + Contains one row per assay hit criteria. + + + + + + + + +
Contains one row per well in a plate. diff --git a/assay/resources/schemas/dbscripts/postgresql/assay-next.sql b/assay/resources/schemas/dbscripts/postgresql/assay-next.sql new file mode 100644 index 00000000000..2127e55329c --- /dev/null +++ b/assay/resources/schemas/dbscripts/postgresql/assay-next.sql @@ -0,0 +1,14 @@ +CREATE TABLE assay.HitCriteria +( + RowId SERIAL, + PropertyId INT NOT NULL, + ReferencePropertyId INT NOT NULL, + DomainId INT NOT NULL, + Operation VARCHAR(50) NOT NULL, + Value VARCHAR(4000) NULL, + + CONSTRAINT PK_HitCriteria PRIMARY KEY (RowId), + CONSTRAINT FK_HitCriteria_PropertyDescriptor FOREIGN KEY (PropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, + CONSTRAINT FK_HitCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, + CONSTRAINT FK_HitCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE +); diff --git a/assay/resources/schemas/dbscripts/sqlserver/assay-next.sql b/assay/resources/schemas/dbscripts/sqlserver/assay-next.sql new file mode 100644 index 00000000000..e69de29bb2d diff --git a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java index 1f4f4b1d1f1..6f24e4976f2 100644 --- a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java +++ b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java @@ -28,6 +28,7 @@ import org.labkey.api.assay.AssayQCService; import org.labkey.api.assay.AssayService; import org.labkey.api.assay.DetectionMethodAssayProvider; +import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.assay.plate.Plate; import org.labkey.api.assay.plate.PlateBasedAssayProvider; import org.labkey.api.assay.plate.PlateService; @@ -45,7 +46,6 @@ import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.property.Domain; -import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.property.DomainProperty; import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; @@ -127,14 +127,24 @@ public GWTProtocol getAssayTemplate(String providerName) return getAssayTemplate(provider, template, false); } - private GWTProtocol getAssayTemplate(AssayProvider provider, Pair>>> template, boolean copy) + private List> getDomains( + AssayProvider provider, + ExpProtocol protocol, + List>> domainInfos, + boolean copy + ) { - ExpProtocol protocol = template.getKey(); List> gwtDomains = new ArrayList<>(); - for (Pair> domainInfo : template.getValue()) + boolean supportsFlagColumnType = provider.supportsFlagColumnType(ExpProtocol.AssayDomainTypes.Result); + String resultsDomainPrefix = ":" + ExpProtocol.AssayDomainTypes.Result.getPrefix() + "."; + boolean isPlateMetadataEnabled = provider.isPlateMetadataEnabled(protocol); + List allHitCriteria = null; + + for (Pair> domainInfo : domainInfos) { Domain domain = domainInfo.getKey(); GWTDomain gwtDomain = DomainUtil.getDomainDescriptor(getUser(), domain); + boolean isResultsDomain = gwtDomain.getDomainURI().contains(resultsDomainPrefix); // If assay is new default value options and default may not have been available in getDomainDescriptor, so try again with provider. if (provider.allowDefaultValues(domain) && (gwtDomain.getDefaultValueOptions() == null || gwtDomain.getDefaultValueOptions().length == 0)) @@ -143,27 +153,23 @@ private GWTProtocol getAssayTemplate(AssayProvider provider, Pair kind = domain.getDomainKind(); List gwtProps = new ArrayList<>(); - List properties = domain.getProperties(); Map defaultValues = domainInfo.getValue(); - Set mandatoryPropertyDescriptors = new CaseInsensitiveHashSet(kind.getMandatoryPropertyNames(domain)); + Set mandatoryPropertyDescriptors = new CaseInsensitiveHashSet(domain.getDomainKind().getMandatoryPropertyNames(domain)); - for (DomainProperty prop : properties) + for (DomainProperty prop : domain.getProperties()) { GWTPropertyDescriptor gwtProp = getPropertyDescriptor(prop, copy); if (gwtProp.getDefaultValueType() == null) { - // we want to explicitly set these "special" properties NOT to remember the user's last entered + // Explicitly set these "special" properties NOT to remember the user's last entered // value if it hasn't been set before: if (AbstractAssayProvider.PARTICIPANTID_PROPERTY_NAME.equals(prop.getName()) || AbstractAssayProvider.SPECIMENID_PROPERTY_NAME.equals(prop.getName()) || @@ -175,7 +181,7 @@ private GWTProtocol getAssayTemplate(AssayProvider provider, Pair fieldHitCriteria = allHitCriteria.stream() + .filter(criterion -> prop.getPropertyId() == criterion.referencePropertyId()) + .toList(); + + gwtProp.setPlateHitCriteria(HitCriterion.toJSON(fieldHitCriteria)); + } + + gwtProps.add(gwtProp); } + gwtProps.addAll(gwtDomain.getCalculatedFields()); gwtDomain.setFields(gwtProps); gwtDomain.setMandatoryFieldNames(mandatoryPropertyDescriptors); + + if (isResultsDomain) + gwtDomain.setAllowFlagProperties(supportsFlagColumnType); + + gwtDomains.add(gwtDomain); } + return gwtDomains; + } + + private GWTProtocol getAssayTemplate(AssayProvider provider, Pair>>> template, boolean copy) + { + ExpProtocol protocol = template.getKey(); + GWTProtocol result = new GWTProtocol(); result.setProtocolId(protocol.getRowId() > 0 ? protocol.getRowId() : null); - result.setDomains(gwtDomains); + result.setDomains(getDomains(provider, protocol, template.getValue(), copy)); result.setName(protocol.getName()); result.setProviderName(provider.getName()); result.setDescription(protocol.getDescription()); result.setStatus(protocol.getStatus() != null ? protocol.getStatus().name() : ExpProtocol.Status.Active.name()); - Map gwtProtocolParams = new HashMap<>(); - for (ProtocolParameter property : protocol.getProtocolParameters().values()) + + // Configure protocol parameters { - if (property.getXmlBeanValueType() != SimpleTypeNames.STRING) + Map gwtProtocolParams = new HashMap<>(); + for (ProtocolParameter property : protocol.getProtocolParameters().values()) { - throw new IllegalStateException("Did not expect non-string protocol parameter " + property.getOntologyEntryURI() + " (" + property.getValueType() + ")"); + if (property.getXmlBeanValueType() != SimpleTypeNames.STRING) + throw new IllegalStateException("Did not expect non-string protocol parameter " + property.getOntologyEntryURI() + " (" + property.getValueType() + ")"); + + gwtProtocolParams.put(property.getOntologyEntryURI(), property.getStringValue()); } - gwtProtocolParams.put(property.getOntologyEntryURI(), property.getStringValue()); + result.setProtocolParameters(gwtProtocolParams); } - result.setProtocolParameters(gwtProtocolParams); + if (provider instanceof PlateBasedAssayProvider plateProvider) { Plate plateTemplate = plateProvider.getPlate(getContainer(), protocol); @@ -239,6 +276,7 @@ private GWTProtocol getAssayTemplate(AssayProvider provider, Pair gwtDomain : result.getDomains()) - if (gwtDomain.getDomainURI().contains(":" + ExpProtocol.AssayDomainTypes.Result.getPrefix() + ".")) - gwtDomain.setAllowFlagProperties(supportsFlag); - return result; } diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index a466b04fbfa..77996e8252e 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -71,6 +71,7 @@ import org.labkey.api.qc.DataExchangeHandler; import org.labkey.api.qc.TsvDataExchangeHandler; import org.labkey.api.query.FieldKey; +import org.labkey.api.query.ValidationException; import org.labkey.api.security.User; import org.labkey.api.settings.AppProps; import org.labkey.api.study.assay.ParticipantVisitResolverType; @@ -98,11 +99,6 @@ import static org.labkey.api.data.CompareType.STARTS_WITH; -/** - * User: brittp - * Date: Jul 11, 2007 - * Time: 9:59:39 AM - */ public class TsvAssayProvider extends AbstractTsvAssayProvider { public static final String NAME = "General"; @@ -375,7 +371,7 @@ public boolean isExclusionSupported() @Override public boolean supportsFlagColumnType(ExpProtocol.AssayDomainTypes type) { - return type== ExpProtocol.AssayDomainTypes.Result; + return ExpProtocol.AssayDomainTypes.Result.equals(type); } @Override @@ -393,7 +389,7 @@ private boolean hasDomainNameChanged(ExpProtocol protocol, GWTDomain orig, GWTDomain update) + public void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException { super.changeDomain(user, protocol, orig, update); @@ -500,15 +496,9 @@ public void changeDomain(User user, ExpProtocol protocol, GWTDomain update, Domain resultsDomain) throws ExperimentException + public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update, Domain resultsDomain) throws ValidationException { Domain replicateDomain = ensurePlateReplicateStatsDomain(protocol); boolean domainDirty = false; @@ -908,7 +910,16 @@ public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomai } if (domainDirty) - replicateDomain.save(user); + { + try + { + replicateDomain.save(user); + } + catch (ExperimentException e) + { + throw new ValidationException(e.getMessage()); + } + } } @Override @@ -920,7 +931,7 @@ public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomai private String getPlateReplicateStatsDomainUri(ExpProtocol protocol) { - DomainKind domainKind = PropertyService.get().getDomainKindByName(PlateReplicateStatsDomainKind.KIND_NAME); + var domainKind = PropertyService.get().getDomainKindByName(PlateReplicateStatsDomainKind.KIND_NAME); return domainKind.generateDomainURI(AssaySchema.NAME, protocol.getName(), protocol.getContainer(), null); } @@ -940,7 +951,7 @@ public void insertReplicateStats( ExpProtocol protocol, @NotNull ExpRun run, Map>> replicateRows - ) throws ExperimentException + ) throws ValidationException { insertOrUpdateReplicateStats(container, user, protocol, run, true, replicateRows); } @@ -951,7 +962,7 @@ public void updateReplicateStats( User user, ExpProtocol protocol, Map>> replicateRows - ) throws ExperimentException + ) throws ValidationException { insertOrUpdateReplicateStats(container, user, protocol, null, false, replicateRows); } @@ -963,13 +974,13 @@ private void insertOrUpdateReplicateStats( @Nullable ExpRun run, boolean forInsert, Map>> replicateRows - ) throws ExperimentException + ) throws ValidationException { if (replicateRows.isEmpty()) return; if (run == null && forInsert) - throw new ExperimentException("Run is required when inserting into the replicate stats table"); + throw new ValidationException("Run is required when inserting into the replicate stats table"); AssayProvider provider = requireProvider(protocol); Domain resultDomain = provider.getResultsDomain(protocol); @@ -1055,7 +1066,7 @@ private void insertOrUpdateReplicateStats( } @Nullable - private static DataState getStateFromRow(Container container, Map row, @Nullable DomainProperty stateProp) throws ExperimentException + private static DataState getStateFromRow(Container container, Map row, @Nullable DomainProperty stateProp) throws ValidationException { if (stateProp != null) { @@ -1069,7 +1080,7 @@ private static DataState getStateFromRow(Container container, Map row, DomainProperty stateProp) throws ValidationException { - try + DataState state = getStateFromRow(container, row, stateProp); + if (state != null) { - DataState state = getStateFromRow(container, row, stateProp); - if (state != null) - { - if (PlateDataStateManager.StateType.getType(state.getStateType()) == null) - { - throw new ValidationException(String.format("The data state '%s' is not valid for this assay.", state.getLabel())); - } - } - return state; - } - catch (ExperimentException e) - { - throw UnexpectedException.wrap(e); + if (PlateDataStateManager.StateType.getType(state.getStateType()) == null) + throw new ValidationException(String.format("The data state '%s' is not valid for this assay.", state.getLabel())); } + + return state; } - private @NotNull AssayProvider requireProvider(ExpProtocol protocol) throws ExperimentException + private @NotNull AssayProvider requireProvider(ExpProtocol protocol) throws ValidationException { AssayProvider provider = AssayService.get().getProvider(protocol); if (provider == null) - throw new ExperimentException(String.format("Unable to find the provider for protocol : %s", protocol.getName())); + throw new ValidationException(String.format("Unable to find the provider for protocol : %s", protocol.getName())); return provider; } @@ -1129,7 +1132,7 @@ private QueryUpdateService getReplicateStatsUpdateService( User user, AssayProvider provider, ExpProtocol protocol - ) throws ExperimentException + ) throws ValidationException { QueryUpdateService qus = null; AssayProtocolSchema schema = provider.createProtocolSchema(user, container, protocol, null); @@ -1141,7 +1144,7 @@ private QueryUpdateService getReplicateStatsUpdateService( } if (qus == null) - throw new ExperimentException(String.format("There is no replicate stats update service available for assay : %s", protocol.getName())); + throw new ValidationException(String.format("There is no replicate stats update service available for assay : %s", protocol.getName())); return qus; } @@ -1152,7 +1155,7 @@ public void deleteReplicateStats( User user, ExpProtocol protocol, List> keys - ) throws ExperimentException + ) throws ValidationException { if (keys.isEmpty()) return; @@ -1170,6 +1173,46 @@ public void deleteReplicateStats( } } + @Override + public void updateHitCriteria( + User user, + ExpProtocol protocol, + GWTDomain update, + Domain resultsDomain + ) throws ValidationException + { + assert AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive(); + + var provider = requireProvider(protocol); + if (!provider.isPlateMetadataEnabled(protocol)) + return; + + Set newCriteria = new HashSet<>(); + for (GWTPropertyDescriptor prop : update.getFields()) + newCriteria.addAll(HitCriterion.getCriteriaFromJSON(prop.getPlateHitCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId())); + + Set oldCriteria = new HashSet<>(PlateManager.get().getHitCriteria(resultsDomain, protocol)); + Set toAdd = new HashSet<>(newCriteria); + Set toRemove = new HashSet<>(); + + for (var criterion : newCriteria) + { + if (oldCriteria.contains(criterion)) + toAdd.remove(criterion); + } + + for (var criterion : oldCriteria) + { + if (!newCriteria.contains(criterion)) + toRemove.add(criterion); + } + + if (toAdd.isEmpty() && toRemove.isEmpty()) + return; + + + } + private static class PlateMetadataImportHelper extends SimpleAssayDataImportHelper { private final Map> _wellPositionMap; // map of plate position to well table diff --git a/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java b/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java index 50cf0d6d72e..fdc1a4192ca 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java @@ -15,7 +15,6 @@ import org.labkey.api.data.TableSelector; import org.labkey.api.data.triggers.Trigger; import org.labkey.api.data.triggers.TriggerFactory; -import org.labkey.api.exp.ExperimentException; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.DomainProperty; @@ -130,7 +129,11 @@ public void complete(TableInfo table, Container c, User user, TableInfo.TriggerT AssayPlateMetadataService.get().updateReplicateStats(c, user, _protocol, replicates); } - catch (ExperimentException | SQLException e) + catch (ValidationException ve) + { + errors.addRowError(ve); + } + catch (SQLException e) { throw UnexpectedException.wrap(e); } @@ -146,7 +149,15 @@ private class DataStateTrigger implements Trigger Set _excludedRows = new HashSet<>(); @Override - public void beforeUpdate(TableInfo table, Container c, User user, @Nullable Map newRow, @Nullable Map oldRow, ValidationException errors, Map extraContext) throws ValidationException + public void beforeUpdate( + TableInfo table, + Container c, + User user, + @Nullable Map newRow, + @Nullable Map oldRow, + ValidationException errors, + Map extraContext + ) throws ValidationException { if (newRow != null && _qcStateProp != null) { diff --git a/assay/src/org/labkey/assay/plate/PlateManager.java b/assay/src/org/labkey/assay/plate/PlateManager.java index e674f6bfce3..602d4b0087f 100644 --- a/assay/src/org/labkey/assay/plate/PlateManager.java +++ b/assay/src/org/labkey/assay/plate/PlateManager.java @@ -30,6 +30,7 @@ import org.labkey.api.assay.dilution.DilutionCurve; import org.labkey.api.assay.plate.AbstractPlateLayoutHandler; import org.labkey.api.assay.plate.AssayPlateMetadataService; +import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.assay.plate.Plate; import org.labkey.api.assay.plate.PlateCustomField; import org.labkey.api.assay.plate.PlateDataStateManager; @@ -374,7 +375,7 @@ private void deriveCustomFieldsFromWellData( @Nullable PlateSet plateSet ) throws Exception { - requireActiveTransaction(); + assert requireActiveTransaction(); Set customFields = new LinkedHashSet<>(getDefaultFieldsForPlateSet(plate, plateSet)); @@ -1323,7 +1324,7 @@ public void afterPlateDelete(Container container, Plate plate) // Called by the Plate Query Update Service prior to deleting a plate public void beforePlateDelete(Container container, Integer plateId) { - requireActiveTransaction(); + assert requireActiveTransaction(); Plate plate = PlateCache.getPlate(container, plateId); List lsids = new ArrayList<>(); @@ -1362,7 +1363,7 @@ public void beforePlateSetDelete(Container container, User user, Integer rowId) private void beforePlateSetsDelete(Collection plateSetIds, Container container) { - requireActiveTransaction(); + assert requireActiveTransaction(); if (plateSetIds.isEmpty()) return; @@ -1695,7 +1696,7 @@ private void copyProperties(@NotNull Plate source, @NotNull Plate copy) private void copyWellData(User user, @NotNull Plate source, @NotNull Plate copy, boolean copySample) throws Exception { - requireActiveTransaction(); + assert requireActiveTransaction(); var container = source.getContainer(); var wellTable = getWellTable(container, user); @@ -2740,7 +2741,7 @@ public PlateSet replatePlateSet( private void savePlateSetHeritage(Integer plateSetId, PlateSetType plateSetType, @Nullable PlateSetImpl parentPlateSet) { - requireActiveTransaction(); + assert requireActiveTransaction(); // Configure rootPlateSetId Integer rootPlateSetId = null; @@ -3115,6 +3116,62 @@ public void deleteHits(int protocolId, Collection resultIds) deleteHits(filter); } + public List getHitCriteria(Domain domain, ExpProtocol protocol) + { + var criteria = new ArrayList(); + var filter = new SimpleFilter(FieldKey.fromParts("DomainId"), domain.getTypeId()); + var tableSelector = new TableSelector(AssayDbSchema.getInstance().getTableInfoHitCriteria(), filter, null); + + Domain replicateStatsDomain = null; + boolean isReplicateStatsResolved = false; + + try (Results results = tableSelector.getResults()) + { + while (results.next()) + { + var propertyId = results.getInt("PropertyId"); + + var property = domain.getProperty(propertyId); + + // Lookup on the replicate stats domain + if (property == null) + { + if (!isReplicateStatsResolved) + { + isReplicateStatsResolved = true; + replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); + } + + if (replicateStatsDomain != null) + property = replicateStatsDomain.getProperty(propertyId); + } + + if (property == null) + { + // TODO: Log a warning + continue; + } + + var criterion = new HitCriterion( + results.getString("Operation"), + results.getString("Value"), + property.getPropertyId(), + property.getName(), + results.getInt("ReferencePropertyId"), + results.getInt("DomainId") + ); + + criteria.add(criterion); + } + } + catch (SQLException e) + { + throw new RuntimeSQLException(e); + } + + return criteria; + } + private void deleteReplicateStats(ExpProtocol protocol, User user, SimpleFilter filter) { AssayProvider provider = AssayService.get().getProvider(protocol); @@ -3239,10 +3296,9 @@ public void validatePrimaryPlateSetUniqueSamples(Set wellRowIds, BatchV } } - private void requireActiveTransaction() + private boolean requireActiveTransaction() { - if (!AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive()) - throw new IllegalStateException("This method must be called from within a transaction"); + return AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive(); } Pair>> getWellSampleData( @@ -3656,7 +3712,7 @@ public void computeWellGroups( Map> wellGroupChanges ) throws ValidationException { - requireActiveTransaction(); + assert requireActiveTransaction(); if (wellGroupChanges.isEmpty()) return; diff --git a/assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java b/assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java new file mode 100644 index 00000000000..ddba80956e3 --- /dev/null +++ b/assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java @@ -0,0 +1,55 @@ +package org.labkey.assay.plate.query; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.labkey.api.data.ContainerFilter; +import org.labkey.api.query.FieldKey; +import org.labkey.api.query.SimpleUserSchema; +import org.labkey.api.query.UserSchema; +import org.labkey.api.security.UserPrincipal; +import org.labkey.api.security.permissions.AdminPermission; +import org.labkey.api.security.permissions.DeletePermission; +import org.labkey.api.security.permissions.InsertPermission; +import org.labkey.api.security.permissions.Permission; +import org.labkey.api.security.permissions.UpdatePermission; +import org.labkey.assay.query.AssayDbSchema; + +import java.util.ArrayList; +import java.util.List; + +public class HitCriteriaTable extends SimpleUserSchema.SimpleTable +{ + public static final String NAME = "HitCriteria"; + private static final List defaultVisibleColumns = new ArrayList<>(); + private final boolean _allowInsertUpdate; + + static + { + defaultVisibleColumns.add(FieldKey.fromParts("RowId")); + defaultVisibleColumns.add(FieldKey.fromParts("PropertyId")); + defaultVisibleColumns.add(FieldKey.fromParts("Operation")); + defaultVisibleColumns.add(FieldKey.fromParts("Value")); + } + + public HitCriteriaTable(PlateSchema schema, @Nullable ContainerFilter cf, boolean allowInsertUpdate) + { + super(schema, AssayDbSchema.getInstance().getTableInfoHitCriteria(), cf); + _allowInsertUpdate = allowInsertUpdate; + } + + @Override + public List getDefaultVisibleColumns() + { + return defaultVisibleColumns; + } + + @Override + public boolean hasPermission(@NotNull UserPrincipal user, @NotNull Class perm) + { + if (!_allowInsertUpdate && (perm.equals(InsertPermission.class) || perm.equals(UpdatePermission.class))) + return false; + if (perm == DeletePermission.class) + return _userSchema.getContainer().hasPermission(user, AdminPermission.class); + return super.hasPermission(user, perm); + } +} \ No newline at end of file diff --git a/assay/src/org/labkey/assay/plate/query/PlateSchema.java b/assay/src/org/labkey/assay/plate/query/PlateSchema.java index 33f0e3bae92..bfc1ea7dbc2 100644 --- a/assay/src/org/labkey/assay/plate/query/PlateSchema.java +++ b/assay/src/org/labkey/assay/plate/query/PlateSchema.java @@ -38,6 +38,7 @@ public class PlateSchema extends SimpleUserSchema private static final Set AVAILABLE_TABLES = new CaseInsensitiveTreeSet(List.of( HitTable.NAME, + HitCriteriaTable.NAME, PlateTable.NAME, PlateSetTable.NAME, PlateTypeTable.NAME, @@ -73,6 +74,8 @@ public TableInfo createTable(String name, ContainerFilter cf) return new PlateTypeTable(this, cf, false).init(); if (HitTable.NAME.equalsIgnoreCase(name)) return new HitTable(this, cf, false).init(); + if (HitCriteriaTable.NAME.equalsIgnoreCase(name)) + return new HitCriteriaTable(this, cf, false).init(); if (WellGroupTable.NAME.equalsIgnoreCase(name)) return new WellGroupTable(this, cf, false).init(); if (WellGroupTypeTable.NAME.equalsIgnoreCase(name)) diff --git a/assay/src/org/labkey/assay/query/AssayDbSchema.java b/assay/src/org/labkey/assay/query/AssayDbSchema.java index 065fe909475..61655dd2dd0 100644 --- a/assay/src/org/labkey/assay/query/AssayDbSchema.java +++ b/assay/src/org/labkey/assay/query/AssayDbSchema.java @@ -78,4 +78,9 @@ public TableInfo getTableInfoHit() { return getSchema().getTable("Hit"); } + + public TableInfo getTableInfoHitCriteria() + { + return getSchema().getTable("HitCriteria"); + } } From 849cfd3a47d7930b6c35ecb332e054d723745a36 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 26 Nov 2024 16:10:01 -0800 Subject: [PATCH 02/37] GWTFilterCriteria --- .../gwt/client/model/GWTFilterCriteria.java | 68 +++++++++++++++++++ .../client/model/GWTPropertyDescriptor.java | 39 +++++------ .../labkey/api/assay/plate/HitCriterion.java | 51 ++++++++++---- .../labkey/assay/AssayDomainServiceImpl.java | 2 +- .../plate/AssayPlateMetadataServiceImpl.java | 4 +- 5 files changed, 126 insertions(+), 38 deletions(-) create mode 100644 api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java new file mode 100644 index 00000000000..4f3a87325e3 --- /dev/null +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java @@ -0,0 +1,68 @@ +package org.labkey.api.gwt.client.model; + +import com.google.gwt.user.client.rpc.IsSerializable; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode +public class GWTFilterCriteria implements Serializable, IsSerializable +{ + private String _name; + private String _op; + private Integer _propertyId; + private Object _value; + + public GWTFilterCriteria() + { + } + + public GWTFilterCriteria(GWTFilterCriteria fc) + { + setName(fc.getName()); + setOp(fc.getOp()); + setPropertyId(fc.getPropertyId()); + setValue(fc.getValue()); + } + + public String getName() + { + return _name; + } + + public void setName(String name) + { + _name = name; + } + + public String getOp() + { + return _op; + } + + public void setOp(String op) + { + _op = op; + } + + public Integer getPropertyId() + { + return _propertyId; + } + + public void setPropertyId(Integer propertyId) + { + _propertyId = propertyId; + } + + public Object getValue() + { + return _value; + } + + public void setValue(Object value) + { + _value = value; + } +} + diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java index b907374a3c3..a67d81e2d61 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java @@ -17,7 +17,6 @@ package org.labkey.api.gwt.client.model; import com.google.gwt.user.client.rpc.IsSerializable; -import org.json.JSONArray; import org.labkey.api.gwt.client.DefaultScaleType; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.LockedPropertyType; @@ -79,13 +78,13 @@ public class GWTPropertyDescriptor implements IsSerializable private StringProperty lockType = new StringProperty(LockedPropertyType.NotLocked.name()); private BooleanProperty scannable = new BooleanProperty(false); private StringProperty valueExpression = new StringProperty(); - private JSONArray plateHitCriteria = null; // for controlling the property editor (not persisted or user settable) private boolean isTypeEditable = true; - private List validators = new ArrayList<>(); private List conditionalFormats = new ArrayList<>(); + private List filterCriteria = new ArrayList<>(); + private List validators = new ArrayList<>(); public GWTPropertyDescriptor() { @@ -144,7 +143,6 @@ public GWTPropertyDescriptor(GWTPropertyDescriptor s) setDerivationDataScope(s.getDerivationDataScope()); setScannable(s.isScannable()); setValueExpression(s.getValueExpression()); - setPlateHitCriteria(s.getPlateHitCriteria()); for (GWTPropertyValidator v : s.getPropertyValidators()) { @@ -155,6 +153,11 @@ public GWTPropertyDescriptor(GWTPropertyDescriptor s) { conditionalFormats.add(new GWTConditionalFormat(f)); } + + for (GWTFilterCriteria fc : s.getFilterCriteria()) + { + filterCriteria.add(new GWTFilterCriteria(fc)); + } } public GWTPropertyDescriptor copy() @@ -592,16 +595,6 @@ public void setValueExpression(String valueExpression) this.valueExpression.set(valueExpression); } - public JSONArray getPlateHitCriteria() - { - return this.plateHitCriteria; - } - - public void setPlateHitCriteria(JSONArray plateHitCriteria) - { - this.plateHitCriteria = plateHitCriteria; - } - public boolean getIsPrimaryKey() { return isPrimaryKey.booleanValue(); @@ -682,10 +675,9 @@ public boolean equals(Object o) if (isExcludeFromShifting() != that.isExcludeFromShifting()) return false; if (!getPropertyValidators().equals(that.getPropertyValidators())) return false; - if (!getConditionalFormats().equals(that.getConditionalFormats())) - { - return false; - } + if (!getConditionalFormats().equals(that.getConditionalFormats())) return false; + if (!getFilterCriteria().equals(that.getFilterCriteria())) return false; + if (!getScale().equals(that.getScale())) return false; if (!equals(getPrincipalConceptCode(),that.getPrincipalConceptCode())) return false; @@ -745,7 +737,6 @@ public int hashCode() result = 31 * result + derivationDataScope.hashCode(); result = 31 * result + (scannable.getBoolean() != null ? scannable.getBoolean().hashCode() : 0); result = 31 * result + valueExpression.hashCode(); - result = 31 * result + (plateHitCriteria != null ? plateHitCriteria.hashCode() : 0); for (GWTPropertyValidator gwtPropertyValidator : getPropertyValidators()) { @@ -825,4 +816,14 @@ public boolean isTypeEditable() { return isTypeEditable; } + + public List getFilterCriteria() + { + return filterCriteria; + } + + public void setFilterCriteria(List filterCriteria) + { + this.filterCriteria = filterCriteria; + } } diff --git a/api/src/org/labkey/api/assay/plate/HitCriterion.java b/api/src/org/labkey/api/assay/plate/HitCriterion.java index 2cc39badff9..9dbf297d4e2 100644 --- a/api/src/org/labkey/api/assay/plate/HitCriterion.java +++ b/api/src/org/labkey/api/assay/plate/HitCriterion.java @@ -1,10 +1,12 @@ package org.labkey.api.assay.plate; +import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.labkey.api.gwt.client.model.GWTFilterCriteria; import org.labkey.api.query.ValidationException; import java.util.ArrayList; @@ -13,34 +15,30 @@ public record HitCriterion(String operation, String value, @Nullable Integer propertyId, @Nullable String name, Integer referencePropertyId, Integer domainId) { - public static @NotNull List getCriteriaFromJSON(JSONArray jsonArray, int referencePropertyId, String referencePropertyName, int domainId) throws ValidationException + public static @NotNull List getCriteriaFromGWTFilterCriteria(List filterCriteria, int referencePropertyId, String referencePropertyName, int domainId) throws ValidationException { - if (jsonArray == null || jsonArray.isEmpty()) + if (filterCriteria == null || filterCriteria.isEmpty()) return Collections.emptyList(); var criteria = new ArrayList(); - for (int i = 0; i < jsonArray.length(); i++) + for (int i = 0; i < filterCriteria.size(); i++) { - var entry = jsonArray.get(i); + var filterCriterion = filterCriteria.get(i); - if (!(entry instanceof JSONObject json)) - throw new ValidationException(errorMessage(referencePropertyName, i, "JSON array contains invalid elements.")); + boolean hasValidPropertyId = filterCriterion.getPropertyId() != null && filterCriterion.getPropertyId() > 0; + String name = StringUtils.trimToNull(filterCriterion.getName()); + String operation = StringUtils.trimToNull(filterCriterion.getOp()); - boolean hasPropertyId = json.has("propertyId"); - boolean hasName = json.has("name"); - - if (!hasPropertyId && !hasName) + if (!hasValidPropertyId && name == null) throw new ValidationException(errorMessage(referencePropertyName, i, "Either a \"propertyId\" or \"name\" is required.")); - if (!json.has("op")) + if (operation == null) throw new ValidationException(errorMessage(referencePropertyName, i, "An \"op\" (operation) property is required.")); try { - Integer propertyId = hasPropertyId ? json.getInt("propertyId") : null; - String name = hasName ? json.getString("name") : null; - String operation = json.getString("op"); - Object value = json.has("value") ? json.get("value") : null; + Integer propertyId = hasValidPropertyId ? filterCriterion.getPropertyId() : null; + Object value = filterCriterion.getValue() == null ? null : filterCriterion.getValue(); criteria.add(new HitCriterion(operation, value == null ? null : value.toString(), propertyId, name, referencePropertyId, domainId)); } @@ -53,6 +51,29 @@ public record HitCriterion(String operation, String value, @Nullable Integer pro return criteria; } + public static List toGWTFilterCriteria(List criteria) + { + if (criteria == null || criteria.isEmpty()) + return Collections.emptyList(); + + var filterCriteria = new ArrayList(); + + for (var criterion : criteria) + { + var filterCriterion = new GWTFilterCriteria(); + filterCriterion.setName(criterion.name); + filterCriterion.setOp(criterion.operation); + filterCriterion.setPropertyId(criterion.propertyId); + filterCriterion.setValue(criterion.value); + // Intentionally not serializing "ReferencePropertyId" + // Intentionally not serializing "DomainId" + + filterCriteria.add(filterCriterion); + } + + return filterCriteria; + } + public static JSONArray toJSON(List criteria) { var json = new JSONArray(); diff --git a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java index 6f24e4976f2..93190396c86 100644 --- a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java +++ b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java @@ -205,7 +205,7 @@ private List> getDomains( .filter(criterion -> prop.getPropertyId() == criterion.referencePropertyId()) .toList(); - gwtProp.setPlateHitCriteria(HitCriterion.toJSON(fieldHitCriteria)); + gwtProp.setFilterCriteria(HitCriterion.toGWTFilterCriteria(fieldHitCriteria)); } gwtProps.add(gwtProp); diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index b025b5aeb93..b85057eefe8 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -22,7 +22,6 @@ import org.labkey.api.assay.plate.ExcelPlateReader; import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.assay.plate.Plate; -import org.labkey.api.assay.plate.PlateBasedAssayProvider; import org.labkey.api.assay.plate.PlateDataStateManager; import org.labkey.api.assay.plate.PlateService; import org.labkey.api.assay.plate.PlateSet; @@ -68,7 +67,6 @@ import org.labkey.api.exp.api.ExpRun; import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.property.Domain; -import org.labkey.api.exp.property.DomainKind; import org.labkey.api.exp.property.DomainProperty; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.gwt.client.model.GWTDomain; @@ -1189,7 +1187,7 @@ public void updateHitCriteria( Set newCriteria = new HashSet<>(); for (GWTPropertyDescriptor prop : update.getFields()) - newCriteria.addAll(HitCriterion.getCriteriaFromJSON(prop.getPlateHitCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId())); + newCriteria.addAll(HitCriterion.getCriteriaFromGWTFilterCriteria(prop.getFilterCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId())); Set oldCriteria = new HashSet<>(PlateManager.get().getHitCriteria(resultsDomain, protocol)); Set toAdd = new HashSet<>(newCriteria); From 55215d32bed42e3c1972361575d82e024824aebd Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 26 Nov 2024 16:22:50 -0800 Subject: [PATCH 03/37] Lombok? --- .../client/model/GWTPropertyDescriptor.java | 174 ++---------------- 1 file changed, 17 insertions(+), 157 deletions(-) diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java index a67d81e2d61..27e70fd51f3 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java @@ -17,6 +17,10 @@ package org.labkey.api.gwt.client.model; import com.google.gwt.user.client.rpc.IsSerializable; +import io.micrometer.common.util.StringUtils; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import org.labkey.api.gwt.client.DefaultScaleType; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.LockedPropertyType; @@ -31,6 +35,7 @@ /** * see org.labkey.api.exp.PropertyDescriptor */ +@EqualsAndHashCode public class GWTPropertyDescriptor implements IsSerializable { private IntegerProperty propertyId = new IntegerProperty(0); @@ -82,9 +87,15 @@ public class GWTPropertyDescriptor implements IsSerializable // for controlling the property editor (not persisted or user settable) private boolean isTypeEditable = true; + @Setter + @Getter private List conditionalFormats = new ArrayList<>(); + @Setter + @Getter private List filterCriteria = new ArrayList<>(); - private List validators = new ArrayList<>(); + @Setter + @Getter + private List propertyValidators = new ArrayList<>(); public GWTPropertyDescriptor() { @@ -146,7 +157,7 @@ public GWTPropertyDescriptor(GWTPropertyDescriptor s) for (GWTPropertyValidator v : s.getPropertyValidators()) { - validators.add(new GWTPropertyValidator(v)); + propertyValidators.add(new GWTPropertyValidator(v)); } for (GWTConditionalFormat f : s.getConditionalFormats()) @@ -626,145 +637,6 @@ public String debugString() return getName() + " " + getLabel() + " " + getRangeURI() + " " + isRequired() + " " + getDescription(); } - private boolean equals(String a, String b) - { - if (null == a || null == b) - return a==b; - return a.equals(b); - } - - public boolean equals(Object o) - { - if (this == o) return true; - if (o == null) return false; - if (!(o instanceof GWTPropertyDescriptor)) - return false; - - GWTPropertyDescriptor that = (GWTPropertyDescriptor) o; - - if (getPropertyId() != that.getPropertyId()) return false; - if (isRequired() != that.isRequired()) return false; - if (isHidden() != that.isHidden()) return false; - if (getMvEnabled() != that.getMvEnabled()) return false; - if (getContainer() != null ? !getContainer().equals(that.getContainer()) : that.getContainer() != null) return false; - if (getConceptURI() != null ? !getConceptURI().equals(that.getConceptURI()) : that.getConceptURI() != null) return false; - if (getDescription() != null ? !getDescription().equals(that.getDescription()) : that.getDescription() != null) return false; - if (getFormat() != null ? !getFormat().equals(that.getFormat()) : that.getFormat() != null) return false; - if (getLabel() != null ? !getLabel().equals(that.getLabel()) : that.getLabel() != null) return false; - if (getLookupContainer() != null ? !getLookupContainer().equals(that.getLookupContainer()) : that.getLookupContainer() != null) - return false; - if (getLookupQuery() != null ? !getLookupQuery().equals(that.getLookupQuery()) : that.getLookupQuery() != null) return false; - if (getLookupSchema() != null ? !getLookupSchema().equals(that.getLookupSchema()) : that.getLookupSchema() != null) return false; - if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false; - if (getPropertyURI() != null ? !getPropertyURI().equals(that.getPropertyURI()) : that.getPropertyURI() != null) return false; - if (getRangeURI() != null ? !getRangeURI().equals(that.getRangeURI()) : that.getRangeURI() != null) return false; - if (getDefaultValueType() != null ? !getDefaultValueType().equals(that.getDefaultValueType()) : that.getDefaultValueType() != null) return false; - if (getDefaultValue() != null ? !getDefaultValue().equals(that.getDefaultValue()) : that.getDefaultValue() != null) return false; - if (getDefaultDisplayValue() != null ? !getDefaultDisplayValue().equals(that.getDefaultDisplayValue()) : that.getDefaultDisplayValue() != null) return false; - if (getImportAliases() != null ? !getImportAliases().equals(that.getImportAliases()) : that.getImportAliases() != null) return false; - if (getURL() != null ? !getURL().equals(that.getURL()) : that.getURL() != null) return false; - if (isShownInDetailsView() != that.isShownInDetailsView()) return false; - if (isShownInInsertView() != that.isShownInInsertView()) return false; - if (isShownInUpdateView() != that.isShownInUpdateView()) return false; - if (isMeasure() != that.isMeasure()) return false; - if (isDimension() != that.isDimension()) return false; - if (isRecommendedVariable() != that.isRecommendedVariable()) return false; - if (!equals(getDefaultScale(), that.getDefaultScale())) return false; - if (!equals(getFacetingBehaviorType(), that.getFacetingBehaviorType())) return false; - if (getPHI() != null ? !getPHI().equals(that.getPHI()) : that.getPHI() != null) return false; - if (isExcludeFromShifting() != that.isExcludeFromShifting()) return false; - - if (!getPropertyValidators().equals(that.getPropertyValidators())) return false; - if (!getConditionalFormats().equals(that.getConditionalFormats())) return false; - if (!getFilterCriteria().equals(that.getFilterCriteria())) return false; - - if (!getScale().equals(that.getScale())) return false; - - if (!equals(getPrincipalConceptCode(),that.getPrincipalConceptCode())) return false; - if (!equals(getSourceOntology(),that.getSourceOntology())) return false; - if (!equals(getConceptSubtree(), that.getConceptSubtree())) return false; - if (!equals(getConceptImportColumn(),that.getConceptImportColumn())) return false; - if (!equals(getConceptLabelColumn(),that.getConceptLabelColumn())) return false; - if (!equals(getDerivationDataScope(),that.getDerivationDataScope())) return false; - if (getRedactedText() != null ? !getRedactedText().equals(that.getRedactedText()) : that.getRedactedText() != null) return false; - if (isScannable() != that.isScannable()) return false; - if (!equals(getValueExpression(),that.getValueExpression())) return false; - // TODO: Implement equals - - return true; - } - - public int hashCode() - { - int result; - result = (propertyId.getInteger() != null ? propertyId.getInteger().hashCode() : 0); - result = 31 * result + (propertyURI.getString() != null ? propertyURI.getString().hashCode() : 0); - result = 31 * result + (name.getString() != null ? name.getString().hashCode() : 0); - result = 31 * result + (description.getString() != null ? description.getString().hashCode() : 0); - result = 31 * result + (container.getString() != null ? container.getString().hashCode() : 0); - result = 31 * result + (rangeURI.getString() != null ? rangeURI.getString().hashCode() : 0); - result = 31 * result + (conceptURI.getString() != null ? conceptURI.getString().hashCode() : 0); - result = 31 * result + (label.getString() != null ? label.getString().hashCode() : 0); - result = 31 * result + (format.getString() != null ? format.getString().hashCode() : 0); - result = 31 * result + (required.getBoolean() != null ? required.getBoolean().hashCode() : 0); - result = 31 * result + (hidden.getBoolean() != null ? hidden.getBoolean().hashCode() : 0); - result = 31 * result + (mvEnabled.getBoolean() != null ? mvEnabled.getBoolean().hashCode() : 0); - result = 31 * result + (lookupContainer.getString() != null ? lookupContainer.getString().hashCode() : 0); - result = 31 * result + (lookupSchema.getString() != null ? lookupSchema.getString().hashCode() : 0); - result = 31 * result + (lookupQuery.getString() != null ? lookupQuery.getString().hashCode() : 0); - result = 31 * result + (defaultValueType != null ? defaultValueType.hashCode() : 0); - result = 31 * result + (defaultValue != null ? defaultValue.hashCode() : 0); - result = 31 * result + (defaultDisplayValue != null ? defaultDisplayValue.hashCode() : 0); - result = 31 * result + (url != null ? url.hashCode() : 0); - result = 31 * result + (importAliases != null ? importAliases.hashCode() : 0); - result = 31 * result + (shownInDetailsView.getBoolean() != null ? shownInDetailsView.getBoolean().hashCode() : 0); - result = 31 * result + (shownInInsertView.getBoolean() != null ? shownInInsertView.getBoolean().hashCode() : 0); - result = 31 * result + (shownInUpdateView.getBoolean() != null ? shownInUpdateView.getBoolean().hashCode() : 0); - result = 31 * result + (dimension.getBoolean() != null ? dimension.getBoolean().hashCode() : 0); - result = 31 * result + (measure.getBoolean() != null ? measure.getBoolean().hashCode() : 0); - result = 31 * result + (recommendedVariable.getBoolean() != null ? recommendedVariable.getBoolean().hashCode() : 0); - result = 31 * result + (defaultScale.getString() != null ? defaultScale.getString().hashCode() : 0); - result = 31 * result + (facetingBehaviorType.getString() != null ? facetingBehaviorType.getString().hashCode() : 0); - result = 31 * result + (phi.getString() != null ? phi.hashCode() : 0); - result = 31 * result + (isExcludeFromShifting.getBoolean() != null ? isExcludeFromShifting.getBoolean().hashCode() : 0); - result = 31 * result + (scale.getInteger() != null ? scale.getInteger().hashCode() : 0); - result = 31 * result + sourceOntology.hashCode(); - result = 31 * result + conceptSubtree.hashCode(); - result = 31 * result + conceptImportColumn.hashCode(); - result = 31 * result + conceptLabelColumn.hashCode(); - result = 31 * result + principalConceptCode.hashCode(); - result = 31 * result + redactedText.hashCode(); - result = 31 * result + derivationDataScope.hashCode(); - result = 31 * result + (scannable.getBoolean() != null ? scannable.getBoolean().hashCode() : 0); - result = 31 * result + valueExpression.hashCode(); - - for (GWTPropertyValidator gwtPropertyValidator : getPropertyValidators()) - { - result = 31 * result + gwtPropertyValidator.hashCode(); - } - return result; - } - - public List getPropertyValidators() - { - return validators; - } - - public void setPropertyValidators(List validators) - { - this.validators = validators; - } - - public List getConditionalFormats() - { - return conditionalFormats; - } - - public void setConditionalFormats(List conditionalFormats) - { - this.conditionalFormats = conditionalFormats; - } - public String getImportAliases() { return importAliases.toString(); @@ -787,12 +659,10 @@ public void setURL(String url) public String getLookupDescription() { - if (getLookupQuery() != null && getLookupQuery().length() > 0 && - getLookupSchema() != null && getLookupSchema().length() > 0) - { - return getLookupSchema() + "." + getLookupQuery(); - } - return "(none)"; + if (StringUtils.isEmpty(getLookupSchema()) || StringUtils.isEmpty(getLookupQuery())) + return "(none)"; + + return getLookupSchema() + "." + getLookupQuery(); } @Override @@ -816,14 +686,4 @@ public boolean isTypeEditable() { return isTypeEditable; } - - public List getFilterCriteria() - { - return filterCriteria; - } - - public void setFilterCriteria(List filterCriteria) - { - this.filterCriteria = filterCriteria; - } } From 35d226201c573cc75680f6d6ad8c04cb622f17b6 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 26 Nov 2024 16:23:59 -0800 Subject: [PATCH 04/37] Bump scripts --- .../postgresql/{assay-next.sql => assay-24.015-24.016.sql} | 0 .../sqlserver/{assay-next.sql => assay-24.015-24.016.sql} | 0 assay/src/org/labkey/assay/AssayModule.java | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename assay/resources/schemas/dbscripts/postgresql/{assay-next.sql => assay-24.015-24.016.sql} (100%) rename assay/resources/schemas/dbscripts/sqlserver/{assay-next.sql => assay-24.015-24.016.sql} (100%) diff --git a/assay/resources/schemas/dbscripts/postgresql/assay-next.sql b/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql similarity index 100% rename from assay/resources/schemas/dbscripts/postgresql/assay-next.sql rename to assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql diff --git a/assay/resources/schemas/dbscripts/sqlserver/assay-next.sql b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql similarity index 100% rename from assay/resources/schemas/dbscripts/sqlserver/assay-next.sql rename to assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql diff --git a/assay/src/org/labkey/assay/AssayModule.java b/assay/src/org/labkey/assay/AssayModule.java index ded8dbba4d6..2d378547c65 100644 --- a/assay/src/org/labkey/assay/AssayModule.java +++ b/assay/src/org/labkey/assay/AssayModule.java @@ -118,7 +118,7 @@ public String getName() @Override public Double getSchemaVersion() { - return 24.015; + return 24.016; } @Override From 739fab91f84b9dad2332ab6c890e8d75c1cad5e9 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 27 Nov 2024 14:08:26 -0800 Subject: [PATCH 05/37] Round-trip filter criteria --- .../client/model/GWTConditionalFormat.java | 116 +------ .../api/gwt/client/model/GWTDomain.java | 307 ++---------------- .../gwt/client/model/GWTFilterCriteria.java | 54 +-- .../client/model/GWTPropertyDescriptor.java | 122 +++---- .../api/assay/AbstractAssayProvider.java | 27 +- .../org/labkey/api/assay/AssayProvider.java | 3 + .../org/labkey/api/assay/AssayService.java | 2 +- .../plate/AssayPlateMetadataService.java | 14 +- .../labkey/api/assay/plate/HitCriterion.java | 103 +++--- .../labkey/api/exp/property/DomainUtil.java | 12 +- .../labkey/api/query/MetadataColumnJSON.java | 37 +-- .../labkey/assay/AssayDomainServiceImpl.java | 11 +- assay/src/org/labkey/assay/AssayManager.java | 2 +- .../org/labkey/assay/TsvAssayProvider.java | 160 ++++++++- .../plate/AssayPlateMetadataServiceImpl.java | 43 +-- .../org/labkey/assay/plate/PlateManager.java | 56 ---- 16 files changed, 363 insertions(+), 706 deletions(-) diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTConditionalFormat.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTConditionalFormat.java index a866ef0f3f5..8200dd1bcc9 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTConditionalFormat.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTConditionalFormat.java @@ -16,27 +16,27 @@ package org.labkey.api.gwt.client.model; import com.google.gwt.user.client.rpc.IsSerializable; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.io.Serializable; -/** - * User: jeckels - * Date: Aug 23, 2010 - */ +@Getter +@Setter +@EqualsAndHashCode public class GWTConditionalFormat implements Serializable, IsSerializable { public static final String COLOR_REGEX = "[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]"; - public static final String DATA_REGION_NAME = "format"; public static final String COLUMN_NAME = "column"; - private boolean _bold = false; - private boolean _italic = false; - private boolean _strikethrough = false; - private String _textColor = null; - private String _backgroundColor = null; - - private String _filter; + private boolean bold = false; + private boolean italic = false; + private boolean strikethrough = false; + private String textColor = null; + private String backgroundColor = null; + private String filter; public GWTConditionalFormat() {} @@ -47,98 +47,6 @@ public GWTConditionalFormat(GWTConditionalFormat f) setStrikethrough(f.isStrikethrough()); setTextColor(f.getTextColor()); setBackgroundColor(f.getBackgroundColor()); - setFilter(f.getFilter()); } - - public boolean isBold() - { - return _bold; - } - - public void setBold(boolean bold) - { - _bold = bold; - } - - public boolean isItalic() - { - return _italic; - } - - public void setItalic(boolean italic) - { - _italic = italic; - } - - public boolean isStrikethrough() - { - return _strikethrough; - } - - public void setStrikethrough(boolean strikethrough) - { - _strikethrough = strikethrough; - } - - public String getTextColor() - { - return _textColor; - } - - public void setTextColor(String textColor) - { - _textColor = textColor; - } - - public String getBackgroundColor() - { - return _backgroundColor; - } - - public void setBackgroundColor(String backgroundColor) - { - _backgroundColor = backgroundColor; - } - - public String getFilter() - { - return _filter; - } - - public void setFilter(String filter) - { - _filter = filter; - } - - @Override - public boolean equals(Object o) - { - if (this == o) return true; - if (!(o instanceof GWTConditionalFormat)) return false; - - GWTConditionalFormat that = (GWTConditionalFormat) o; - - if (_bold != that._bold) return false; - if (_italic != that._italic) return false; - if (_strikethrough != that._strikethrough) return false; - if (_backgroundColor != null ? !_backgroundColor.equals(that._backgroundColor) : that._backgroundColor != null) - return false; - if (_filter != null ? !_filter.equals(that._filter) : that._filter != null) return false; - if (_textColor != null ? !_textColor.equals(that._textColor) : that._textColor != null) return false; - - return true; - } - - @Override - public int hashCode() - { - int result = (_bold ? 1 : 0); - result = 31 * result + (_italic ? 1 : 0); - result = 31 * result + (_strikethrough ? 1 : 0); - result = 31 * result + (_textColor != null ? _textColor.hashCode() : 0); - result = 31 * result + (_backgroundColor != null ? _backgroundColor.hashCode() : 0); - result = 31 * result + (_filter != null ? _filter.hashCode() : 0); - return result; - } } diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTDomain.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTDomain.java index 903afee21d5..d802cdfc2c6 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTDomain.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTDomain.java @@ -18,6 +18,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.gwt.user.client.rpc.IsSerializable; +import lombok.Getter; +import lombok.Setter; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.util.PropertyUtil; @@ -27,58 +29,47 @@ import java.util.List; import java.util.Set; -/** - * User: matthewb - * Date: Apr 24, 2007 - * Time: 1:44:49 PM - */ public class GWTDomain implements IsSerializable { private String _ts; - private int domainId; - private String name; - private String domainURI; - private String domainKindName; - private String description; - private String container; - private boolean allowFileLinkProperties; - private boolean allowAttachmentProperties; - private boolean allowFlagProperties; - private boolean allowTextChoiceProperties; - private boolean allowSampleSubjectProperties; - private boolean allowTimepointProperties; - private boolean allowUniqueConstraintProperties; - private boolean allowCalculatedFields; - private boolean showDefaultValueSettings; + @Getter @Setter private int domainId; + @Getter @Setter private String name; + @Getter @Setter private String domainURI; + @Getter @Setter private String domainKindName; + @Getter @Setter private String description; + @Getter @Setter private String container; + @Getter @Setter private boolean allowFileLinkProperties; + @Getter @Setter private boolean allowAttachmentProperties; + @Getter @Setter private boolean allowFlagProperties; + @Getter @Setter private boolean allowTextChoiceProperties; + @Getter @Setter private boolean allowSampleSubjectProperties; + @Getter @Setter private boolean allowTimepointProperties; + @Getter @Setter private boolean allowUniqueConstraintProperties; + @Getter @Setter private boolean allowCalculatedFields; + @Getter @Setter private boolean showDefaultValueSettings; private DefaultValueType defaultDefaultValueType = null; private DefaultValueType[] defaultValueOptions = new DefaultValueType[0]; - private List fields = new ArrayList(); + private List fields = new ArrayList<>(); private List standardFields = null; private List calculatedFields = null; - private List indices = new ArrayList(); + @Getter @Setter private List indices = new ArrayList<>(); private String defaultValuesURL = null; - - private Set mandatoryPropertyDescriptorNames = new HashSet(); - - private Set reservedFieldNames = new HashSet(); + private Set mandatoryPropertyDescriptorNames = new HashSet<>(); + private Set reservedFieldNames = new HashSet<>(); private Set reservedFieldNamePrefixes = new HashSet<>(); - private Set phiNotAllowedFieldNames = new HashSet(); - - private Set excludeFromExportFieldNames = new HashSet(); - private boolean provisioned = false; - - private List disabledSystemFields; + private Set phiNotAllowedFieldNames = new HashSet<>(); + private Set excludeFromExportFieldNames = new HashSet<>(); + @Getter @Setter private boolean provisioned = false; + @Getter @Setter private List disabledSystemFields; // schema,query,template are not part of the domain, but it's handy to pass // these values to the PropertiedEditor along with the GWTDomain. // NOTE queryName is not necessarily == name - private String schemaName=null; - private String queryName=null; - - private String templateDescription=null; // null if no template - private String instructions = null; - - private boolean supportsPhiLevel = false; + @Getter @Setter private String schemaName = null; + @Getter @Setter private String queryName = null; + @Getter @Setter private String templateDescription = null; // null if no template + @Getter @Setter private String instructions = null; + @Getter @Setter private boolean supportsPhiLevel = false; public GWTDomain() { @@ -88,7 +79,7 @@ public GWTDomain() public GWTDomain(GWTDomain src) { _ts = src._ts; - this.domainId = src.domainId; + this.domainId = src.domainId; this.name = src.name; this.domainURI = src.domainURI; this.domainKindName = src.domainKindName; @@ -107,7 +98,7 @@ public GWTDomain(GWTDomain src) this.defaultDefaultValueType = src.defaultDefaultValueType; this.defaultValueOptions = src.defaultValueOptions; this.defaultValuesURL = src.defaultValuesURL; - this.provisioned = src.isProvisioned(); + this.provisioned = src.provisioned; this.supportsPhiLevel = src.supportsPhiLevel; if (src.indices != null) @@ -158,106 +149,6 @@ public String get_Ts() return _ts; } - public int getDomainId() - { - return domainId; - } - - public void setDomainId(int domainId) - { - this.domainId = domainId; - } - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public String getSchemaName() - { - return this.schemaName; - } - - public void setSchemaName(String name) - { - this.schemaName = name; - } - - public String getQueryName() - { - return this.queryName; - } - - public void setQueryName(String name) - { - this.queryName = name; - } - - public String getTemplateDescription() - { - return templateDescription; - } - - public void setTemplateDescription(String templateDescription) - { - this.templateDescription = templateDescription; - } - - public String getInstructions() - { - return instructions; - } - - public void setInstructions(String instructions) - { - this.instructions = instructions; - } - - public String getDomainURI() - { - return domainURI; - } - - public void setDomainURI(String domainURI) - { - this.domainURI = domainURI; - } - - public String getDomainKindName() - { - return domainKindName; - } - - public void setDomainKindName(String domainKindName) - { - this.domainKindName = domainKindName; - } - - public String getDescription() - { - return description; - } - - public void setDescription(String description) - { - this.description = description; - } - - public String getContainer() - { - return container; - } - - public void setContainer(String container) - { - this.container = container; - } - @JsonIgnore public List getFields(boolean includeCalculated) { @@ -300,96 +191,6 @@ public FieldType getFieldByName(String name) return null; } - public List getIndices() - { - return indices; - } - - public void setIndices(List indices) - { - this.indices = indices; - } - - public boolean isAllowFileLinkProperties() - { - return allowFileLinkProperties; - } - - public void setAllowFileLinkProperties(boolean allowFileLinkProperties) - { - this.allowFileLinkProperties = allowFileLinkProperties; - } - - public boolean isAllowAttachmentProperties() - { - return allowAttachmentProperties; - } - - public void setAllowAttachmentProperties(boolean allowAttachmentProperties) - { - this.allowAttachmentProperties = allowAttachmentProperties; - } - - public boolean isAllowFlagProperties() - { - return allowFlagProperties; - } - - public void setAllowFlagProperties(boolean allowFlagProperties) - { - this.allowFlagProperties = allowFlagProperties; - } - - public boolean isAllowTextChoiceProperties() - { - return allowTextChoiceProperties; - } - - public void setAllowTextChoiceProperties(boolean allowTextChoiceProperties) - { - this.allowTextChoiceProperties = allowTextChoiceProperties; - } - - public boolean isAllowSampleSubjectProperties() - { - return allowSampleSubjectProperties; - } - - public void setAllowSampleSubjectProperties(boolean allowSampleSubjectProperties) - { - this.allowSampleSubjectProperties = allowSampleSubjectProperties; - } - - public boolean isAllowTimepointProperties() - { - return allowTimepointProperties; - } - - public void setAllowTimepointProperties(boolean allowTimepointProperties) - { - this.allowTimepointProperties = allowTimepointProperties; - } - - public boolean isAllowUniqueConstraintProperties() - { - return allowUniqueConstraintProperties; - } - - public void setAllowUniqueConstraintProperties(boolean allowUniqueConstraintProperties) - { - this.allowUniqueConstraintProperties = allowUniqueConstraintProperties; - } - - public boolean isAllowCalculatedFields() - { - return allowCalculatedFields; - } - - public void setAllowCalculatedFields(boolean allowCalculatedFields) - { - this.allowCalculatedFields = allowCalculatedFields; - } - /** * @return Indicates that the property can't be removed from the domain. The property may or may not be nullable. */ @@ -504,16 +305,6 @@ public void setPhiNotAllowedFieldNames(Set phiNotAllowedFieldNames) } } - public boolean isShowDefaultValueSettings() - { - return showDefaultValueSettings; - } - - public void setShowDefaultValueSettings(boolean showDefaultValueSettings) - { - this.showDefaultValueSettings = showDefaultValueSettings; - } - public DefaultValueType getDefaultDefaultValueType() { return defaultDefaultValueType; @@ -530,16 +321,6 @@ public void setDefaultValueOptions(DefaultValueType[] defaultOptions, DefaultVal this.defaultValueOptions = defaultOptions; } - public List getDisabledSystemFields() - { - return disabledSystemFields; - } - - public void setDisabledSystemFields(List disabledSystemFields) - { - this.disabledSystemFields = disabledSystemFields; - } - public String getDefaultValuesURL() { if (defaultValuesURL == null) @@ -551,28 +332,4 @@ public void setDefaultValuesURL(String defaultValuesURL) { this.defaultValuesURL = defaultValuesURL; } - - /** - * Flag indicating domain is provisioned - * @return - */ - public boolean isProvisioned() - { - return provisioned; - } - - public void setProvisioned(boolean value) - { - this.provisioned = value; - } - - public boolean isSupportsPhiLevel() - { - return supportsPhiLevel; - } - - public void setSupportsPhiLevel(boolean supportsPhiLevel) - { - this.supportsPhiLevel = supportsPhiLevel; - } } diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java index 4f3a87325e3..0dc50ead244 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTFilterCriteria.java @@ -2,16 +2,21 @@ import com.google.gwt.user.client.rpc.IsSerializable; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import java.io.Serializable; +@Setter +@Getter @EqualsAndHashCode public class GWTFilterCriteria implements Serializable, IsSerializable { - private String _name; - private String _op; - private Integer _propertyId; - private Object _value; + private String name; + private String op; + private Integer propertyId; + private Integer referencePropertyId; + private Object value; public GWTFilterCriteria() { @@ -22,47 +27,8 @@ public GWTFilterCriteria(GWTFilterCriteria fc) setName(fc.getName()); setOp(fc.getOp()); setPropertyId(fc.getPropertyId()); + setReferencePropertyId(fc.getReferencePropertyId()); setValue(fc.getValue()); } - - public String getName() - { - return _name; - } - - public void setName(String name) - { - _name = name; - } - - public String getOp() - { - return _op; - } - - public void setOp(String op) - { - _op = op; - } - - public Integer getPropertyId() - { - return _propertyId; - } - - public void setPropertyId(Integer propertyId) - { - _propertyId = propertyId; - } - - public Object getValue() - { - return _value; - } - - public void setValue(Object value) - { - _value = value; - } } diff --git a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java index 27e70fd51f3..d81c5af4cac 100644 --- a/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java +++ b/api/gwtsrc/org/labkey/api/gwt/client/model/GWTPropertyDescriptor.java @@ -17,10 +17,10 @@ package org.labkey.api.gwt.client.model; import com.google.gwt.user.client.rpc.IsSerializable; -import io.micrometer.common.util.StringUtils; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import org.apache.commons.lang3.StringUtils; import org.labkey.api.gwt.client.DefaultScaleType; import org.labkey.api.gwt.client.DefaultValueType; import org.labkey.api.gwt.client.LockedPropertyType; @@ -33,69 +33,60 @@ import java.util.List; /** - * see org.labkey.api.exp.PropertyDescriptor + * See {@link org.labkey.api.exp.PropertyDescriptor} */ @EqualsAndHashCode public class GWTPropertyDescriptor implements IsSerializable { - private IntegerProperty propertyId = new IntegerProperty(0); - private StringProperty propertyURI = new StringProperty(); - private StringProperty container = new StringProperty(); - private StringProperty name = new StringProperty(); - private StringProperty description = new StringProperty(); - private StringProperty rangeURI = new StringProperty("http://www.w3.org/2001/XMLSchema#string"); - private StringProperty conceptURI = new StringProperty(); - private StringProperty label = new StringProperty(); - private StringProperty format = new StringProperty(); - private BooleanProperty required = new BooleanProperty(false); - private BooleanProperty hidden = new BooleanProperty(false); - private StringProperty lookupContainer = new StringProperty(); - private StringProperty lookupSchema = new StringProperty(); - private StringProperty lookupQuery = new StringProperty(); - private BooleanProperty lookupIsValid = new BooleanProperty(true); + private final IntegerProperty propertyId = new IntegerProperty(0); + private final StringProperty propertyURI = new StringProperty(); + private final StringProperty container = new StringProperty(); + private final StringProperty name = new StringProperty(); + private final StringProperty description = new StringProperty(); + private final StringProperty rangeURI = new StringProperty("http://www.w3.org/2001/XMLSchema#string"); + private final StringProperty conceptURI = new StringProperty(); + private final StringProperty label = new StringProperty(); + private final StringProperty format = new StringProperty(); + private final BooleanProperty required = new BooleanProperty(false); + private final BooleanProperty hidden = new BooleanProperty(false); + private final StringProperty lookupContainer = new StringProperty(); + private final StringProperty lookupSchema = new StringProperty(); + private final StringProperty lookupQuery = new StringProperty(); + private final BooleanProperty lookupIsValid = new BooleanProperty(true); private String defaultValueType = null; - private StringProperty defaultValue = new StringProperty(); - private StringProperty defaultDisplayValue = new StringProperty("[none]"); - private BooleanProperty mvEnabled = new BooleanProperty(false); - private StringProperty importAliases = new StringProperty(); - private StringProperty url = new StringProperty(); - private BooleanProperty shownInInsertView = new BooleanProperty(true); - private BooleanProperty shownInUpdateView = new BooleanProperty(true); - private BooleanProperty shownInDetailsView = new BooleanProperty(true); - private BooleanProperty measure = new BooleanProperty(); - private BooleanProperty dimension = new BooleanProperty(); - private BooleanProperty recommendedVariable = new BooleanProperty(false); - private StringProperty defaultScale = new StringProperty(DefaultScaleType.LINEAR.name()); - private StringProperty facetingBehaviorType = new StringProperty(); - private StringProperty phi = new StringProperty("NotPHI"); // Must match PHI.NotPHI and tableInfo.xsd enum PHIType.NotPHI - private BooleanProperty isExcludeFromShifting = new BooleanProperty(); - private BooleanProperty isPreventReordering = new BooleanProperty(); - private BooleanProperty isDisableEditing = new BooleanProperty(); - private IntegerProperty scale = new IntegerProperty(4000); - private StringProperty principalConceptCode = new StringProperty(); - private StringProperty sourceOntology = new StringProperty(); - private StringProperty conceptSubtree = new StringProperty(); - private StringProperty conceptImportColumn = new StringProperty(); - private StringProperty conceptLabelColumn = new StringProperty(); - private StringProperty redactedText = new StringProperty(); - private StringProperty derivationDataScope = new StringProperty(); - private BooleanProperty isPrimaryKey = new BooleanProperty(false); - private StringProperty lockType = new StringProperty(LockedPropertyType.NotLocked.name()); - private BooleanProperty scannable = new BooleanProperty(false); - private StringProperty valueExpression = new StringProperty(); - - // for controlling the property editor (not persisted or user settable) - private boolean isTypeEditable = true; - - @Setter - @Getter - private List conditionalFormats = new ArrayList<>(); - @Setter - @Getter - private List filterCriteria = new ArrayList<>(); - @Setter - @Getter - private List propertyValidators = new ArrayList<>(); + private final StringProperty defaultValue = new StringProperty(); + private final StringProperty defaultDisplayValue = new StringProperty("[none]"); + private final BooleanProperty mvEnabled = new BooleanProperty(false); + private final StringProperty importAliases = new StringProperty(); + private final StringProperty url = new StringProperty(); + private final BooleanProperty shownInInsertView = new BooleanProperty(true); + private final BooleanProperty shownInUpdateView = new BooleanProperty(true); + private final BooleanProperty shownInDetailsView = new BooleanProperty(true); + private final BooleanProperty measure = new BooleanProperty(); + private final BooleanProperty dimension = new BooleanProperty(); + private final BooleanProperty recommendedVariable = new BooleanProperty(false); + private final StringProperty defaultScale = new StringProperty(DefaultScaleType.LINEAR.name()); + private final StringProperty facetingBehaviorType = new StringProperty(); + private final StringProperty phi = new StringProperty("NotPHI"); // Must match PHI.NotPHI and tableInfo.xsd enum PHIType.NotPHI + private final BooleanProperty isExcludeFromShifting = new BooleanProperty(); + private final BooleanProperty isPreventReordering = new BooleanProperty(); + private final BooleanProperty isDisableEditing = new BooleanProperty(); + private final IntegerProperty scale = new IntegerProperty(4000); + private final StringProperty principalConceptCode = new StringProperty(); + private final StringProperty sourceOntology = new StringProperty(); + private final StringProperty conceptSubtree = new StringProperty(); + private final StringProperty conceptImportColumn = new StringProperty(); + private final StringProperty conceptLabelColumn = new StringProperty(); + private final StringProperty redactedText = new StringProperty(); + private final StringProperty derivationDataScope = new StringProperty(); + private final BooleanProperty isPrimaryKey = new BooleanProperty(false); + private final StringProperty lockType = new StringProperty(LockedPropertyType.NotLocked.name()); + private final BooleanProperty scannable = new BooleanProperty(false); + private final StringProperty valueExpression = new StringProperty(); + + @Getter @Setter private List conditionalFormats = new ArrayList<>(); + @Getter @Setter private List filterCriteria = new ArrayList<>(); + @Getter @Setter private List propertyValidators = new ArrayList<>(); public GWTPropertyDescriptor() { @@ -129,6 +120,7 @@ public GWTPropertyDescriptor(GWTPropertyDescriptor s) setRecommendedVariable(s.isRecommendedVariable()); setDefaultScale(s.getDefaultScale()); setLookupContainer(s.getLookupContainer()); + setLookupIsValid(s.getLookupIsValid()); setLookupSchema(s.getLookupSchema()); setLookupQuery(s.getLookupQuery()); setDefaultValueType(s.getDefaultValueType()); @@ -145,7 +137,6 @@ public GWTPropertyDescriptor(GWTPropertyDescriptor s) setRedactedText(s.getRedactedText()); setIsPrimaryKey(s.getIsPrimaryKey()); setLockType(s.getLockType()); - setTypeEditable(s.isTypeEditable()); setPrincipalConceptCode(s.getPrincipalConceptCode()); setSourceOntology(s.getSourceOntology()); setConceptSubtree(s.getConceptSubtree()); @@ -286,7 +277,6 @@ public void guessMeasureAndDimension() setDimension(getLookupQuery() != null && !isHidden()); } - public String getConceptURI() { return conceptURI.getString(); @@ -676,14 +666,4 @@ public boolean isFileType() return "http://cpas.fhcrc.org/exp/xml#fileLink".equals(getRangeURI()) || "http://www.labkey.org/exp/xml#attachment".equals(getRangeURI()); } - - public void setTypeEditable(boolean b) - { - isTypeEditable = b; - } - - public boolean isTypeEditable() - { - return isTypeEditable; - } } diff --git a/api/src/org/labkey/api/assay/AbstractAssayProvider.java b/api/src/org/labkey/api/assay/AbstractAssayProvider.java index 199b1d9e5a3..29d32fbd0db 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayProvider.java +++ b/api/src/org/labkey/api/assay/AbstractAssayProvider.java @@ -24,6 +24,7 @@ import org.labkey.api.assay.actions.DesignerAction; import org.labkey.api.assay.actions.UploadWizardAction; import org.labkey.api.assay.pipeline.AssayRunAsyncContext; +import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.assay.security.DesignAssayPermission; import org.labkey.api.audit.AuditLogService; import org.labkey.api.data.ActionButton; @@ -1349,7 +1350,7 @@ public List getValidationAndAnalysisScripts(ExpProtocol protocol, Scope sc } @Override - public void setSaveScriptFiles(ExpProtocol protocol, boolean save) throws ExperimentException + public void setSaveScriptFiles(ExpProtocol protocol, boolean save) { setBooleanProperty(protocol, SAVE_SCRIPT_FILES_PROPERTY_SUFFIX, save); } @@ -1453,12 +1454,9 @@ protected Boolean getBooleanProperty(ExpProtocol protocol, String propertySuffix { ObjectProperty prop = protocol.getObjectProperties().get(createPropertyURI(protocol, propertySuffix)); - if (prop != null) - { - Object o = prop.value(); - if (o instanceof Boolean) - return (Boolean)o; - } + if (prop != null && prop.value() instanceof Boolean b) + return b; + return null; } @@ -1747,6 +1745,21 @@ public boolean isPlateMetadataEnabled(ExpProtocol protocol) return supportsPlateMetadata(protocol) && Boolean.TRUE.equals(getBooleanProperty(protocol, PLATE_METADATA_PROPERTY_SUFFIX)); } + @Override + public @NotNull List getFilterCriteria(ExpProtocol protocol) + { + Domain resultsDomain = getResultsDomain(protocol); + if (resultsDomain == null) + return Collections.emptyList(); + + return getFilterCriteria(protocol, resultsDomain); + } + + protected @NotNull List getFilterCriteria(ExpProtocol protocol, Domain resultsDomain) + { + return Collections.emptyList(); + } + public record AssayFileMoveData(ExpRun run, Container sourceContainer, String fieldName, File sourceFile, File targetFile) {} public record AssayMoveData(Map counts, Map> fileMovesByRunId) {} diff --git a/api/src/org/labkey/api/assay/AssayProvider.java b/api/src/org/labkey/api/assay/AssayProvider.java index 3c591651770..6fe91bbf86d 100644 --- a/api/src/org/labkey/api/assay/AssayProvider.java +++ b/api/src/org/labkey/api/assay/AssayProvider.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.assay.actions.AssayRunUploadForm; import org.labkey.api.assay.pipeline.AssayRunAsyncContext; +import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.exp.ExperimentException; @@ -274,6 +275,8 @@ enum Scope void setPlateMetadataEnabled(ExpProtocol protocol, boolean metadataEnabled); boolean isPlateMetadataEnabled(ExpProtocol protocol); + @NotNull List getFilterCriteria(ExpProtocol protocol); + /** * @return the data type that this run creates for its analyzed results */ diff --git a/api/src/org/labkey/api/assay/AssayService.java b/api/src/org/labkey/api/assay/AssayService.java index 64e443e5223..826817c8894 100644 --- a/api/src/org/labkey/api/assay/AssayService.java +++ b/api/src/org/labkey/api/assay/AssayService.java @@ -80,7 +80,7 @@ static void setInstance(AssayService impl) @NotNull Collection getAssayProviders(); - WebPartView createAssayListView(ViewContext context, boolean portalView, BindException errors); + WebPartView createAssayListView(ViewContext context, boolean portalView, BindException errors); ExpRunTable createRunTable(ExpProtocol protocol, AssayProvider provider, User user, Container container, ContainerFilter cf); diff --git a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java index 512794fb646..5f8fffafda2 100644 --- a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java +++ b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java @@ -102,12 +102,7 @@ OntologyManager.UpdateableTableImportHelper getImportHelper( * Called when a plate enabled protocol has changes to its results domain. This is to allow analogous changes * to the replicate table to create/delete fields to track replicate statistics. */ - void updateReplicateStatsDomain( - User user, - ExpProtocol protocol, - GWTDomain update, - Domain resultsDomain - ) throws ValidationException; + void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException; /** * Computes and inserts replicate statistics into the protocol schema table. @@ -136,11 +131,4 @@ void deleteReplicateStats( ExpProtocol protocol, List> keys ) throws ValidationException; - - void updateHitCriteria( - User user, - ExpProtocol protocol, - GWTDomain update, - Domain resultsDomain - ) throws ValidationException; } diff --git a/api/src/org/labkey/api/assay/plate/HitCriterion.java b/api/src/org/labkey/api/assay/plate/HitCriterion.java index 9dbf297d4e2..6866db621a0 100644 --- a/api/src/org/labkey/api/assay/plate/HitCriterion.java +++ b/api/src/org/labkey/api/assay/plate/HitCriterion.java @@ -3,9 +3,7 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; +import org.labkey.api.exp.property.Domain; import org.labkey.api.gwt.client.model.GWTFilterCriteria; import org.labkey.api.query.ValidationException; @@ -13,39 +11,78 @@ import java.util.Collections; import java.util.List; -public record HitCriterion(String operation, String value, @Nullable Integer propertyId, @Nullable String name, Integer referencePropertyId, Integer domainId) +public record HitCriterion( + String operation, + String value, + @Nullable Integer propertyId, + @Nullable String name, + Integer referencePropertyId, + Integer domainId +) { - public static @NotNull List getCriteriaFromGWTFilterCriteria(List filterCriteria, int referencePropertyId, String referencePropertyName, int domainId) throws ValidationException + public static @NotNull List fromGWTFilterCriteria( + List filterCriteria, + int referencePropertyId, + String referencePropertyName, + int domainId, + @Nullable Domain replicateStatsDomain + ) throws ValidationException { if (filterCriteria == null || filterCriteria.isEmpty()) return Collections.emptyList(); + // Invariants + if (referencePropertyId <= 0) + throw new IllegalArgumentException("A valid \"referencePropertyId\" must be specified for filter criteria."); + if (StringUtils.trimToNull(referencePropertyName) == null) + throw new IllegalArgumentException("A valid \"referencePropertyName\" must be specified for filter criteria."); + if (domainId <= 0) + throw new IllegalArgumentException("A valid \"domainId\" must be specified for filter criteria."); + var criteria = new ArrayList(); for (int i = 0; i < filterCriteria.size(); i++) { var filterCriterion = filterCriteria.get(i); + Integer propertyId = filterCriterion.getPropertyId(); - boolean hasValidPropertyId = filterCriterion.getPropertyId() != null && filterCriterion.getPropertyId() > 0; - String name = StringUtils.trimToNull(filterCriterion.getName()); - String operation = StringUtils.trimToNull(filterCriterion.getOp()); + if (propertyId != null && propertyId <= 0) + throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value.")); - if (!hasValidPropertyId && name == null) - throw new ValidationException(errorMessage(referencePropertyName, i, "Either a \"propertyId\" or \"name\" is required.")); - if (operation == null) - throw new ValidationException(errorMessage(referencePropertyName, i, "An \"op\" (operation) property is required.")); + String name = StringUtils.trimToNull(filterCriterion.getName()); - try + // Attempt to resolve the field by name + if (propertyId == null && name != null) { - Integer propertyId = hasValidPropertyId ? filterCriterion.getPropertyId() : null; - Object value = filterCriterion.getValue() == null ? null : filterCriterion.getValue(); - - criteria.add(new HitCriterion(operation, value == null ? null : value.toString(), propertyId, name, referencePropertyId, domainId)); + if (replicateStatsDomain != null) + { + var property = replicateStatsDomain.getPropertyByName(name); + if (property == null) + throw new ValidationException(errorMessage(referencePropertyName, i, String.format("Unable to resolve field from name \"%s\".", name))); + + propertyId = property.getPropertyId(); + } + else if (name.equalsIgnoreCase(referencePropertyName)) + { + propertyId = referencePropertyId; + name = null; + } } - catch (JSONException e) + else if (propertyId != null && propertyId != referencePropertyId) + throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value. Cannot specify criteria against other fields.")); + + if (propertyId == null) { - throw new ValidationException(errorMessage(referencePropertyName, i, e.getMessage())); + propertyId = referencePropertyId; + name = null; } + + String operation = StringUtils.trimToNull(filterCriterion.getOp()); + if (operation == null) + throw new ValidationException(errorMessage(referencePropertyName, i, "An \"op\" (operation) property is required.")); + + String value = filterCriterion.getValue() == null ? null : filterCriterion.getValue().toString(); + criteria.add(new HitCriterion(operation, value, propertyId, name, referencePropertyId, domainId)); } return criteria; @@ -64,9 +101,8 @@ public static List toGWTFilterCriteria(List cri filterCriterion.setName(criterion.name); filterCriterion.setOp(criterion.operation); filterCriterion.setPropertyId(criterion.propertyId); + filterCriterion.setReferencePropertyId(criterion.referencePropertyId); filterCriterion.setValue(criterion.value); - // Intentionally not serializing "ReferencePropertyId" - // Intentionally not serializing "DomainId" filterCriteria.add(filterCriterion); } @@ -74,29 +110,8 @@ public static List toGWTFilterCriteria(List cri return filterCriteria; } - public static JSONArray toJSON(List criteria) - { - var json = new JSONArray(); - - for (HitCriterion criterion : criteria) - { - var object = new JSONObject(); - - object.put("name", criterion.name); - object.put("op", criterion.operation); - object.put("propertyId", criterion.propertyId); - object.put("value", criterion.value); - // Intentionally not serializing "ReferencePropertyId" - // Intentionally not serializing "DomainId" - - json.put(object); - } - - return json; - } - - private static String errorMessage(String parentName, int index, String message) + private static String errorMessage(String referencePropertyName, int index, String message) { - return String.format("Invalid hit criteria for field \"%s\" at index [%d]. %s", parentName, index, message); + return String.format("Invalid hit criteria for field \"%s\" at index [%d]. %s", referencePropertyName, index, message); } } diff --git a/api/src/org/labkey/api/exp/property/DomainUtil.java b/api/src/org/labkey/api/exp/property/DomainUtil.java index fb8ec6a4506..d26c1e3af96 100644 --- a/api/src/org/labkey/api/exp/property/DomainUtil.java +++ b/api/src/org/labkey/api/exp/property/DomainUtil.java @@ -677,17 +677,19 @@ public static GWTPropertyDescriptor getPropertyDescriptor(ColumnType columnXml) return gwtProp; } - public static Domain createDomain(DomainTemplate template, Container container, User user, @Nullable String domainName) throws ValidationException { return createDomain(template.getDomainKind(), template.getDomain(), template.getOptions(), container, user, domainName, template.getTemplateInfo()); } - public static Domain createDomain( - String kindName, GWTDomain domain, Map arguments, - Container container, User user, @Nullable String domainName, - @Nullable TemplateInfo templateInfo + String kindName, + GWTDomain domain, + Map arguments, + Container container, + User user, + @Nullable String domainName, + @Nullable TemplateInfo templateInfo ) throws ValidationException { // Create a copy of the GWTDomain to ensure the template's Domain is not modified diff --git a/api/src/org/labkey/api/query/MetadataColumnJSON.java b/api/src/org/labkey/api/query/MetadataColumnJSON.java index c856bcf018e..b49aaa9a8a7 100644 --- a/api/src/org/labkey/api/query/MetadataColumnJSON.java +++ b/api/src/org/labkey/api/query/MetadataColumnJSON.java @@ -15,14 +15,10 @@ */ package org.labkey.api.query; +import lombok.EqualsAndHashCode; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; -import java.util.Objects; - -/** - * User: jeckels - * Date: Nov 14, 2008 - */ +@EqualsAndHashCode(callSuper = true) public class MetadataColumnJSON extends GWTPropertyDescriptor { private String _wrappedColumnName; @@ -41,6 +37,7 @@ public MetadataColumnJSON(MetadataColumnJSON ci) setWrappedColumnName(ci.getWrappedColumnName()); setValueExpression(ci.getValueExpression()); setLookupCustom(ci.isLookupCustom()); + setLockExistingField(ci.isLockExistingField()); } public MetadataColumnJSON(GWTPropertyDescriptor ci) @@ -59,11 +56,13 @@ public void setWrappedColumnName(String wrappedColumnName) _wrappedColumnName = wrappedColumnName; } + @Override public String getValueExpression() { return _valueExpression; } + @Override public void setValueExpression(String valueExpression) { _valueExpression = valueExpression; @@ -113,33 +112,7 @@ public void setLookupQuery(String lookupQuery) public String getLookupDescription() { if (_lookupCustom) - { return "(custom)"; - } return super.getLookupDescription(); } - - @Override - public boolean equals(Object o) - { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - - MetadataColumnJSON that = (MetadataColumnJSON)o; - - if (_lookupCustom != that._lookupCustom) return false; - if (!Objects.equals(_valueExpression, that._valueExpression)) return false; - return Objects.equals(_wrappedColumnName, that._wrappedColumnName); - } - - @Override - public int hashCode() - { - int result = super.hashCode(); - result = 31 * result + (_wrappedColumnName != null ? _wrappedColumnName.hashCode() : 0); - result = 31 * result + (_valueExpression != null ? _valueExpression.hashCode() : 0); - result = 31 * result + (_lookupCustom ? 1 : 0); - return result; - } } \ No newline at end of file diff --git a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java index 93190396c86..3085eb03ec0 100644 --- a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java +++ b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java @@ -120,9 +120,8 @@ public GWTProtocol getAssayTemplate(String providerName) { AssayProvider provider = AssayService.get().getProvider(providerName); if (provider == null) - { throw new NotFoundException("Could not find assay provider " + providerName); - } + Pair>>> template = provider.getAssayTemplate(getUser(), getContainer()); return getAssayTemplate(provider, template, false); } @@ -135,9 +134,7 @@ private List> getDomains( ) { List> gwtDomains = new ArrayList<>(); - boolean supportsFlagColumnType = provider.supportsFlagColumnType(ExpProtocol.AssayDomainTypes.Result); String resultsDomainPrefix = ":" + ExpProtocol.AssayDomainTypes.Result.getPrefix() + "."; - boolean isPlateMetadataEnabled = provider.isPlateMetadataEnabled(protocol); List allHitCriteria = null; for (Pair> domainInfo : domainInfos) @@ -196,10 +193,10 @@ private List> getDomains( if (provider.isMandatoryDomainProperty(domain, prop.getName())) mandatoryPropertyDescriptors.add(prop.getName()); - if (isResultsDomain && isPlateMetadataEnabled) + if (isResultsDomain) { if (allHitCriteria == null) - allHitCriteria = PlateManager.get().getHitCriteria(domain, protocol); + allHitCriteria = provider.getFilterCriteria(protocol); List fieldHitCriteria = allHitCriteria.stream() .filter(criterion -> prop.getPropertyId() == criterion.referencePropertyId()) @@ -216,7 +213,7 @@ private List> getDomains( gwtDomain.setMandatoryFieldNames(mandatoryPropertyDescriptors); if (isResultsDomain) - gwtDomain.setAllowFlagProperties(supportsFlagColumnType); + gwtDomain.setAllowFlagProperties(provider.supportsFlagColumnType(ExpProtocol.AssayDomainTypes.Result)); gwtDomains.add(gwtDomain); } diff --git a/assay/src/org/labkey/assay/AssayManager.java b/assay/src/org/labkey/assay/AssayManager.java index 89a061e12a9..1a10aa418af 100644 --- a/assay/src/org/labkey/assay/AssayManager.java +++ b/assay/src/org/labkey/assay/AssayManager.java @@ -429,7 +429,7 @@ public void onBeforeAssayResultDelete(Container container, User user, ExpRun run } @Override - public WebPartView createAssayListView(ViewContext context, boolean portalView, BindException errors) + public WebPartView createAssayListView(ViewContext context, boolean portalView, BindException errors) { String name = AssaySchema.ASSAY_LIST_TABLE_NAME; UserSchema schema = createSchema(context.getUser(), context.getContainer(), null); diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 77996e8252e..97a8d0cd808 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -32,6 +32,7 @@ import org.labkey.api.assay.AssayPipelineProvider; import org.labkey.api.assay.AssayProtocolSchema; import org.labkey.api.assay.AssayProviderSchema; +import org.labkey.api.assay.AssayQCService; import org.labkey.api.assay.AssayResultDomainKind; import org.labkey.api.assay.AssaySaveHandler; import org.labkey.api.assay.AssayTableMetadata; @@ -41,12 +42,19 @@ import org.labkey.api.assay.TsvDataHandler; import org.labkey.api.assay.actions.AssayRunUploadForm; import org.labkey.api.assay.plate.AssayPlateMetadataService; +import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.CoreSchema; import org.labkey.api.data.DbSequence; import org.labkey.api.data.DbSequenceManager; +import org.labkey.api.data.Results; +import org.labkey.api.data.RuntimeSQLException; +import org.labkey.api.data.SQLFragment; import org.labkey.api.data.SimpleFilter; +import org.labkey.api.data.Sort; +import org.labkey.api.data.SqlExecutor; +import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; import org.labkey.api.exp.ExperimentException; @@ -82,16 +90,21 @@ import org.labkey.api.util.UnexpectedException; import org.labkey.api.view.HttpView; import org.labkey.api.view.JspView; +import org.labkey.assay.plate.PlateManager; import org.labkey.assay.plate.query.PlateSchema; import org.labkey.assay.plate.query.PlateSetTable; import org.labkey.assay.plate.query.PlateTable; +import org.labkey.assay.query.AssayDbSchema; import java.io.File; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -428,8 +441,7 @@ public void changeDomain(User user, ExpProtocol protocol, GWTDomain newFields = new ArrayList<>(); @@ -497,10 +509,11 @@ public void changeDomain(User user, ExpProtocol protocol, GWTDomain getFilterCriteria(ExpProtocol protocol, Domain domain) + { + return new ArrayList<>(getFilterCriteriaMap(protocol, domain).values()); + } + + private @NotNull Map getFilterCriteriaMap(ExpProtocol protocol, Domain domain) + { + var criteria = new LinkedHashMap(); + var filter = new SimpleFilter(FieldKey.fromParts("DomainId"), domain.getTypeId()); + + Domain replicateStatsDomain = null; + boolean isReplicateStatsResolved = false; + + try (Results results = new TableSelector(AssayDbSchema.getInstance().getTableInfoHitCriteria(), filter, new Sort(FieldKey.fromParts("RowId"))).getResults()) + { + while (results.next()) + { + var propertyId = results.getInt("PropertyId"); + + var property = domain.getProperty(propertyId); + + // Lookup on the replicate stats domain + if (property == null) + { + if (!isReplicateStatsResolved) + { + isReplicateStatsResolved = true; + replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); + } + + if (replicateStatsDomain != null) + property = replicateStatsDomain.getProperty(propertyId); + } + + if (property == null) + { + // TODO: Log a warning + continue; + } + + var criterion = new HitCriterion( + results.getString("Operation"), + results.getString("Value"), + property.getPropertyId(), + property.getName(), + results.getInt("ReferencePropertyId"), + results.getInt("DomainId") + ); + + criteria.put(results.getInt("RowId"), criterion); + } + } + catch (SQLException e) + { + throw new RuntimeSQLException(e); + } + + return criteria; + } + + private void updateFilterCriteria( + User user, + ExpProtocol protocol, + GWTDomain original, + GWTDomain update + ) throws ValidationException + { + assert AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive(); + + // Filter criteria are only available to result domains + if (!isResultsDomain(update)) + return; + + Domain replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); + + Set newCriteria = new HashSet<>(); + for (GWTPropertyDescriptor prop : update.getFields()) + newCriteria.addAll(HitCriterion.fromGWTFilterCriteria(prop.getFilterCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId(), replicateStatsDomain)); + + Map keyedCriteria = getFilterCriteriaMap(protocol, getResultsDomain(protocol)); + Set oldCriteria = new HashSet<>(keyedCriteria.values()); + Set toAdd = new HashSet<>(newCriteria); + Set toRemove = new HashSet<>(); + + for (var criterion : newCriteria) + { + if (oldCriteria.contains(criterion)) + toAdd.remove(criterion); + } + + for (var criterion : oldCriteria) + { + if (!newCriteria.contains(criterion)) + { + for (var entry : keyedCriteria.entrySet()) + { + if (entry.getValue().equals(criterion)) + toRemove.add(entry.getKey()); + } + } + } + + if (toAdd.isEmpty() && toRemove.isEmpty()) + return; + + var table = AssayDbSchema.getInstance().getTableInfoHitCriteria(); + + if (!toRemove.isEmpty()) + { + var sql = new SQLFragment("DELETE FROM ").append(table, "criteria") + .append("WHERE RowId ").appendInClause(toRemove, table.getSqlDialect()); + new SqlExecutor(table.getSchema()).execute(sql); + } + + if (!toAdd.isEmpty()) + { + List> criteriaToInsert = new ArrayList<>(); + for (var criterion : toAdd) + criteriaToInsert.add(Arrays.asList(criterion.propertyId(), criterion.referencePropertyId(), criterion.domainId(), criterion.operation(), criterion.value())); + + String sql = "INSERT INTO " + table + " (propertyId, referencePropertyId, domainId, operation, value) VALUES (?, ?, ?, ?, ?)"; + + try + { + Table.batchExecute(table.getSchema(), sql, criteriaToInsert); + } + catch (SQLException e) + { + throw new RuntimeSQLException(e); + } + } + } + + private static boolean isResultsDomain(GWTDomain domain) + { + return domain != null && domain.getDomainURI().contains(":" + ExpProtocol.AssayDomainTypes.Result.getPrefix() + "."); + } + public static class TestCase extends Assert { private Mockery _context; diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index b85057eefe8..64e32a00db9 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -20,7 +20,6 @@ import org.labkey.api.assay.TsvDataHandler; import org.labkey.api.assay.plate.AssayPlateMetadataService; import org.labkey.api.assay.plate.ExcelPlateReader; -import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.assay.plate.Plate; import org.labkey.api.assay.plate.PlateDataStateManager; import org.labkey.api.assay.plate.PlateService; @@ -859,7 +858,7 @@ public OntologyManager.UpdateableTableImportHelper getImportHelper( } @Override - public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update, Domain resultsDomain) throws ValidationException + public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException { Domain replicateDomain = ensurePlateReplicateStatsDomain(protocol); boolean domainDirty = false; @@ -1171,46 +1170,6 @@ public void deleteReplicateStats( } } - @Override - public void updateHitCriteria( - User user, - ExpProtocol protocol, - GWTDomain update, - Domain resultsDomain - ) throws ValidationException - { - assert AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive(); - - var provider = requireProvider(protocol); - if (!provider.isPlateMetadataEnabled(protocol)) - return; - - Set newCriteria = new HashSet<>(); - for (GWTPropertyDescriptor prop : update.getFields()) - newCriteria.addAll(HitCriterion.getCriteriaFromGWTFilterCriteria(prop.getFilterCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId())); - - Set oldCriteria = new HashSet<>(PlateManager.get().getHitCriteria(resultsDomain, protocol)); - Set toAdd = new HashSet<>(newCriteria); - Set toRemove = new HashSet<>(); - - for (var criterion : newCriteria) - { - if (oldCriteria.contains(criterion)) - toAdd.remove(criterion); - } - - for (var criterion : oldCriteria) - { - if (!newCriteria.contains(criterion)) - toRemove.add(criterion); - } - - if (toAdd.isEmpty() && toRemove.isEmpty()) - return; - - - } - private static class PlateMetadataImportHelper extends SimpleAssayDataImportHelper { private final Map> _wellPositionMap; // map of plate position to well table diff --git a/assay/src/org/labkey/assay/plate/PlateManager.java b/assay/src/org/labkey/assay/plate/PlateManager.java index 602d4b0087f..27bbb1e7cd8 100644 --- a/assay/src/org/labkey/assay/plate/PlateManager.java +++ b/assay/src/org/labkey/assay/plate/PlateManager.java @@ -3116,62 +3116,6 @@ public void deleteHits(int protocolId, Collection resultIds) deleteHits(filter); } - public List getHitCriteria(Domain domain, ExpProtocol protocol) - { - var criteria = new ArrayList(); - var filter = new SimpleFilter(FieldKey.fromParts("DomainId"), domain.getTypeId()); - var tableSelector = new TableSelector(AssayDbSchema.getInstance().getTableInfoHitCriteria(), filter, null); - - Domain replicateStatsDomain = null; - boolean isReplicateStatsResolved = false; - - try (Results results = tableSelector.getResults()) - { - while (results.next()) - { - var propertyId = results.getInt("PropertyId"); - - var property = domain.getProperty(propertyId); - - // Lookup on the replicate stats domain - if (property == null) - { - if (!isReplicateStatsResolved) - { - isReplicateStatsResolved = true; - replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); - } - - if (replicateStatsDomain != null) - property = replicateStatsDomain.getProperty(propertyId); - } - - if (property == null) - { - // TODO: Log a warning - continue; - } - - var criterion = new HitCriterion( - results.getString("Operation"), - results.getString("Value"), - property.getPropertyId(), - property.getName(), - results.getInt("ReferencePropertyId"), - results.getInt("DomainId") - ); - - criteria.add(criterion); - } - } - catch (SQLException e) - { - throw new RuntimeSQLException(e); - } - - return criteria; - } - private void deleteReplicateStats(ExpProtocol protocol, User user, SimpleFilter filter) { AssayProvider provider = AssayService.get().getProvider(protocol); From c0a7b1b4317229b8dac67a06026a5452f098e052 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 27 Nov 2024 14:15:26 -0800 Subject: [PATCH 06/37] HitCriterion -> FilterCriteria --- .../api/assay/AbstractAssayProvider.java | 6 ++--- .../org/labkey/api/assay/AssayProvider.java | 4 ++-- ...{HitCriterion.java => FilterCriteria.java} | 20 ++++++++-------- .../labkey/assay/AssayDomainServiceImpl.java | 12 +++++----- .../org/labkey/assay/TsvAssayProvider.java | 24 ++++++++----------- .../org/labkey/assay/plate/PlateManager.java | 1 - 6 files changed, 31 insertions(+), 36 deletions(-) rename api/src/org/labkey/api/assay/plate/{HitCriterion.java => FilterCriteria.java} (85%) diff --git a/api/src/org/labkey/api/assay/AbstractAssayProvider.java b/api/src/org/labkey/api/assay/AbstractAssayProvider.java index 29d32fbd0db..f45b08bb606 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayProvider.java +++ b/api/src/org/labkey/api/assay/AbstractAssayProvider.java @@ -24,7 +24,7 @@ import org.labkey.api.assay.actions.DesignerAction; import org.labkey.api.assay.actions.UploadWizardAction; import org.labkey.api.assay.pipeline.AssayRunAsyncContext; -import org.labkey.api.assay.plate.HitCriterion; +import org.labkey.api.assay.plate.FilterCriteria; import org.labkey.api.assay.security.DesignAssayPermission; import org.labkey.api.audit.AuditLogService; import org.labkey.api.data.ActionButton; @@ -1746,7 +1746,7 @@ public boolean isPlateMetadataEnabled(ExpProtocol protocol) } @Override - public @NotNull List getFilterCriteria(ExpProtocol protocol) + public @NotNull List getFilterCriteria(ExpProtocol protocol) { Domain resultsDomain = getResultsDomain(protocol); if (resultsDomain == null) @@ -1755,7 +1755,7 @@ public boolean isPlateMetadataEnabled(ExpProtocol protocol) return getFilterCriteria(protocol, resultsDomain); } - protected @NotNull List getFilterCriteria(ExpProtocol protocol, Domain resultsDomain) + protected @NotNull List getFilterCriteria(ExpProtocol protocol, Domain resultsDomain) { return Collections.emptyList(); } diff --git a/api/src/org/labkey/api/assay/AssayProvider.java b/api/src/org/labkey/api/assay/AssayProvider.java index 6fe91bbf86d..96702a72e0d 100644 --- a/api/src/org/labkey/api/assay/AssayProvider.java +++ b/api/src/org/labkey/api/assay/AssayProvider.java @@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.assay.actions.AssayRunUploadForm; import org.labkey.api.assay.pipeline.AssayRunAsyncContext; -import org.labkey.api.assay.plate.HitCriterion; +import org.labkey.api.assay.plate.FilterCriteria; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.exp.ExperimentException; @@ -275,7 +275,7 @@ enum Scope void setPlateMetadataEnabled(ExpProtocol protocol, boolean metadataEnabled); boolean isPlateMetadataEnabled(ExpProtocol protocol); - @NotNull List getFilterCriteria(ExpProtocol protocol); + @NotNull List getFilterCriteria(ExpProtocol protocol); /** * @return the data type that this run creates for its analyzed results diff --git a/api/src/org/labkey/api/assay/plate/HitCriterion.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java similarity index 85% rename from api/src/org/labkey/api/assay/plate/HitCriterion.java rename to api/src/org/labkey/api/assay/plate/FilterCriteria.java index 6866db621a0..6a071007c92 100644 --- a/api/src/org/labkey/api/assay/plate/HitCriterion.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; -public record HitCriterion( +public record FilterCriteria( String operation, String value, @Nullable Integer propertyId, @@ -20,7 +20,7 @@ public record HitCriterion( Integer domainId ) { - public static @NotNull List fromGWTFilterCriteria( + public static @NotNull List fromGWTFilterCriteria( List filterCriteria, int referencePropertyId, String referencePropertyName, @@ -39,17 +39,17 @@ public record HitCriterion( if (domainId <= 0) throw new IllegalArgumentException("A valid \"domainId\" must be specified for filter criteria."); - var criteria = new ArrayList(); + var criteria = new ArrayList(); for (int i = 0; i < filterCriteria.size(); i++) { - var filterCriterion = filterCriteria.get(i); - Integer propertyId = filterCriterion.getPropertyId(); + var criterion = filterCriteria.get(i); + Integer propertyId = criterion.getPropertyId(); if (propertyId != null && propertyId <= 0) throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value.")); - String name = StringUtils.trimToNull(filterCriterion.getName()); + String name = StringUtils.trimToNull(criterion.getName()); // Attempt to resolve the field by name if (propertyId == null && name != null) @@ -77,18 +77,18 @@ else if (propertyId != null && propertyId != referencePropertyId) name = null; } - String operation = StringUtils.trimToNull(filterCriterion.getOp()); + String operation = StringUtils.trimToNull(criterion.getOp()); if (operation == null) throw new ValidationException(errorMessage(referencePropertyName, i, "An \"op\" (operation) property is required.")); - String value = filterCriterion.getValue() == null ? null : filterCriterion.getValue().toString(); - criteria.add(new HitCriterion(operation, value, propertyId, name, referencePropertyId, domainId)); + String value = criterion.getValue() == null ? null : criterion.getValue().toString(); + criteria.add(new FilterCriteria(operation, value, propertyId, name, referencePropertyId, domainId)); } return criteria; } - public static List toGWTFilterCriteria(List criteria) + public static List toGWTFilterCriteria(List criteria) { if (criteria == null || criteria.isEmpty()) return Collections.emptyList(); diff --git a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java index 3085eb03ec0..12e1e2cf070 100644 --- a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java +++ b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java @@ -28,7 +28,7 @@ import org.labkey.api.assay.AssayQCService; import org.labkey.api.assay.AssayService; import org.labkey.api.assay.DetectionMethodAssayProvider; -import org.labkey.api.assay.plate.HitCriterion; +import org.labkey.api.assay.plate.FilterCriteria; import org.labkey.api.assay.plate.Plate; import org.labkey.api.assay.plate.PlateBasedAssayProvider; import org.labkey.api.assay.plate.PlateService; @@ -135,7 +135,7 @@ private List> getDomains( { List> gwtDomains = new ArrayList<>(); String resultsDomainPrefix = ":" + ExpProtocol.AssayDomainTypes.Result.getPrefix() + "."; - List allHitCriteria = null; + List allFilterCriteria = null; for (Pair> domainInfo : domainInfos) { @@ -195,14 +195,14 @@ private List> getDomains( if (isResultsDomain) { - if (allHitCriteria == null) - allHitCriteria = provider.getFilterCriteria(protocol); + if (allFilterCriteria == null) + allFilterCriteria = provider.getFilterCriteria(protocol); - List fieldHitCriteria = allHitCriteria.stream() + List fieldFilterCriteria = allFilterCriteria.stream() .filter(criterion -> prop.getPropertyId() == criterion.referencePropertyId()) .toList(); - gwtProp.setFilterCriteria(HitCriterion.toGWTFilterCriteria(fieldHitCriteria)); + gwtProp.setFilterCriteria(FilterCriteria.toGWTFilterCriteria(fieldFilterCriteria)); } gwtProps.add(gwtProp); diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 97a8d0cd808..8f3150521a3 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -32,7 +32,6 @@ import org.labkey.api.assay.AssayPipelineProvider; import org.labkey.api.assay.AssayProtocolSchema; import org.labkey.api.assay.AssayProviderSchema; -import org.labkey.api.assay.AssayQCService; import org.labkey.api.assay.AssayResultDomainKind; import org.labkey.api.assay.AssaySaveHandler; import org.labkey.api.assay.AssayTableMetadata; @@ -42,7 +41,7 @@ import org.labkey.api.assay.TsvDataHandler; import org.labkey.api.assay.actions.AssayRunUploadForm; import org.labkey.api.assay.plate.AssayPlateMetadataService; -import org.labkey.api.assay.plate.HitCriterion; +import org.labkey.api.assay.plate.FilterCriteria; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; import org.labkey.api.data.CoreSchema; @@ -57,7 +56,6 @@ import org.labkey.api.data.Table; import org.labkey.api.data.TableInfo; import org.labkey.api.data.TableSelector; -import org.labkey.api.exp.ExperimentException; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.ObjectProperty; import org.labkey.api.exp.PropertyType; @@ -87,10 +85,8 @@ import org.labkey.api.study.assay.ThawListResolverType; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; -import org.labkey.api.util.UnexpectedException; import org.labkey.api.view.HttpView; import org.labkey.api.view.JspView; -import org.labkey.assay.plate.PlateManager; import org.labkey.assay.plate.query.PlateSchema; import org.labkey.assay.plate.query.PlateSetTable; import org.labkey.assay.plate.query.PlateTable; @@ -549,14 +545,14 @@ public boolean supportsSampleLookupsAsMaterialInputs() } @Override - protected @NotNull List getFilterCriteria(ExpProtocol protocol, Domain domain) + protected @NotNull List getFilterCriteria(ExpProtocol protocol, Domain domain) { return new ArrayList<>(getFilterCriteriaMap(protocol, domain).values()); } - private @NotNull Map getFilterCriteriaMap(ExpProtocol protocol, Domain domain) + private @NotNull Map getFilterCriteriaMap(ExpProtocol protocol, Domain domain) { - var criteria = new LinkedHashMap(); + var criteria = new LinkedHashMap(); var filter = new SimpleFilter(FieldKey.fromParts("DomainId"), domain.getTypeId()); Domain replicateStatsDomain = null; @@ -589,7 +585,7 @@ public boolean supportsSampleLookupsAsMaterialInputs() continue; } - var criterion = new HitCriterion( + var criterion = new FilterCriteria( results.getString("Operation"), results.getString("Value"), property.getPropertyId(), @@ -624,13 +620,13 @@ private void updateFilterCriteria( Domain replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); - Set newCriteria = new HashSet<>(); + Set newCriteria = new HashSet<>(); for (GWTPropertyDescriptor prop : update.getFields()) - newCriteria.addAll(HitCriterion.fromGWTFilterCriteria(prop.getFilterCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId(), replicateStatsDomain)); + newCriteria.addAll(FilterCriteria.fromGWTFilterCriteria(prop.getFilterCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId(), replicateStatsDomain)); - Map keyedCriteria = getFilterCriteriaMap(protocol, getResultsDomain(protocol)); - Set oldCriteria = new HashSet<>(keyedCriteria.values()); - Set toAdd = new HashSet<>(newCriteria); + Map keyedCriteria = getFilterCriteriaMap(protocol, getResultsDomain(protocol)); + Set oldCriteria = new HashSet<>(keyedCriteria.values()); + Set toAdd = new HashSet<>(newCriteria); Set toRemove = new HashSet<>(); for (var criterion : newCriteria) diff --git a/assay/src/org/labkey/assay/plate/PlateManager.java b/assay/src/org/labkey/assay/plate/PlateManager.java index 27bbb1e7cd8..7b0eb4e16cd 100644 --- a/assay/src/org/labkey/assay/plate/PlateManager.java +++ b/assay/src/org/labkey/assay/plate/PlateManager.java @@ -30,7 +30,6 @@ import org.labkey.api.assay.dilution.DilutionCurve; import org.labkey.api.assay.plate.AbstractPlateLayoutHandler; import org.labkey.api.assay.plate.AssayPlateMetadataService; -import org.labkey.api.assay.plate.HitCriterion; import org.labkey.api.assay.plate.Plate; import org.labkey.api.assay.plate.PlateCustomField; import org.labkey.api.assay.plate.PlateDataStateManager; From a8326f5369803e4085a836de29e9b36498a4b88e Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 27 Nov 2024 14:57:30 -0800 Subject: [PATCH 07/37] assay.HitCriteria -> assay.FilterCriteria --- assay/resources/schemas/assay.xml | 4 +- .../postgresql/assay-24.015-24.016.sql | 10 ++-- .../org/labkey/assay/TsvAssayProvider.java | 4 +- .../assay/plate/query/HitCriteriaTable.java | 55 ------------------- .../labkey/assay/plate/query/PlateSchema.java | 3 - .../org/labkey/assay/query/AssayDbSchema.java | 4 +- 6 files changed, 11 insertions(+), 69 deletions(-) delete mode 100644 assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java diff --git a/assay/resources/schemas/assay.xml b/assay/resources/schemas/assay.xml index 37ef7d9a520..d01dd0df335 100644 --- a/assay/resources/schemas/assay.xml +++ b/assay/resources/schemas/assay.xml @@ -201,8 +201,8 @@
- - Contains one row per assay hit criteria. +
+ Contains one row per assay result field filter criteria. diff --git a/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql b/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql index 2127e55329c..0659b6607eb 100644 --- a/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql +++ b/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql @@ -1,4 +1,4 @@ -CREATE TABLE assay.HitCriteria +CREATE TABLE assay.FilterCriteria ( RowId SERIAL, PropertyId INT NOT NULL, @@ -7,8 +7,8 @@ CREATE TABLE assay.HitCriteria Operation VARCHAR(50) NOT NULL, Value VARCHAR(4000) NULL, - CONSTRAINT PK_HitCriteria PRIMARY KEY (RowId), - CONSTRAINT FK_HitCriteria_PropertyDescriptor FOREIGN KEY (PropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, - CONSTRAINT FK_HitCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, - CONSTRAINT FK_HitCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE + CONSTRAINT PK_FilterCriteria PRIMARY KEY (RowId), + CONSTRAINT FK_FilterCriteria_PropertyDescriptor FOREIGN KEY (PropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, + CONSTRAINT FK_FilterCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, + CONSTRAINT FK_FilterCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE ); diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 8f3150521a3..11815bf05d4 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -558,7 +558,7 @@ public boolean supportsSampleLookupsAsMaterialInputs() Domain replicateStatsDomain = null; boolean isReplicateStatsResolved = false; - try (Results results = new TableSelector(AssayDbSchema.getInstance().getTableInfoHitCriteria(), filter, new Sort(FieldKey.fromParts("RowId"))).getResults()) + try (Results results = new TableSelector(AssayDbSchema.getInstance().getTableInfoFilterCriteria(), filter, new Sort(FieldKey.fromParts("RowId"))).getResults()) { while (results.next()) { @@ -650,7 +650,7 @@ private void updateFilterCriteria( if (toAdd.isEmpty() && toRemove.isEmpty()) return; - var table = AssayDbSchema.getInstance().getTableInfoHitCriteria(); + var table = AssayDbSchema.getInstance().getTableInfoFilterCriteria(); if (!toRemove.isEmpty()) { diff --git a/assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java b/assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java deleted file mode 100644 index ddba80956e3..00000000000 --- a/assay/src/org/labkey/assay/plate/query/HitCriteriaTable.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.labkey.assay.plate.query; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.labkey.api.data.ContainerFilter; -import org.labkey.api.query.FieldKey; -import org.labkey.api.query.SimpleUserSchema; -import org.labkey.api.query.UserSchema; -import org.labkey.api.security.UserPrincipal; -import org.labkey.api.security.permissions.AdminPermission; -import org.labkey.api.security.permissions.DeletePermission; -import org.labkey.api.security.permissions.InsertPermission; -import org.labkey.api.security.permissions.Permission; -import org.labkey.api.security.permissions.UpdatePermission; -import org.labkey.assay.query.AssayDbSchema; - -import java.util.ArrayList; -import java.util.List; - -public class HitCriteriaTable extends SimpleUserSchema.SimpleTable -{ - public static final String NAME = "HitCriteria"; - private static final List defaultVisibleColumns = new ArrayList<>(); - private final boolean _allowInsertUpdate; - - static - { - defaultVisibleColumns.add(FieldKey.fromParts("RowId")); - defaultVisibleColumns.add(FieldKey.fromParts("PropertyId")); - defaultVisibleColumns.add(FieldKey.fromParts("Operation")); - defaultVisibleColumns.add(FieldKey.fromParts("Value")); - } - - public HitCriteriaTable(PlateSchema schema, @Nullable ContainerFilter cf, boolean allowInsertUpdate) - { - super(schema, AssayDbSchema.getInstance().getTableInfoHitCriteria(), cf); - _allowInsertUpdate = allowInsertUpdate; - } - - @Override - public List getDefaultVisibleColumns() - { - return defaultVisibleColumns; - } - - @Override - public boolean hasPermission(@NotNull UserPrincipal user, @NotNull Class perm) - { - if (!_allowInsertUpdate && (perm.equals(InsertPermission.class) || perm.equals(UpdatePermission.class))) - return false; - if (perm == DeletePermission.class) - return _userSchema.getContainer().hasPermission(user, AdminPermission.class); - return super.hasPermission(user, perm); - } -} \ No newline at end of file diff --git a/assay/src/org/labkey/assay/plate/query/PlateSchema.java b/assay/src/org/labkey/assay/plate/query/PlateSchema.java index bfc1ea7dbc2..33f0e3bae92 100644 --- a/assay/src/org/labkey/assay/plate/query/PlateSchema.java +++ b/assay/src/org/labkey/assay/plate/query/PlateSchema.java @@ -38,7 +38,6 @@ public class PlateSchema extends SimpleUserSchema private static final Set AVAILABLE_TABLES = new CaseInsensitiveTreeSet(List.of( HitTable.NAME, - HitCriteriaTable.NAME, PlateTable.NAME, PlateSetTable.NAME, PlateTypeTable.NAME, @@ -74,8 +73,6 @@ public TableInfo createTable(String name, ContainerFilter cf) return new PlateTypeTable(this, cf, false).init(); if (HitTable.NAME.equalsIgnoreCase(name)) return new HitTable(this, cf, false).init(); - if (HitCriteriaTable.NAME.equalsIgnoreCase(name)) - return new HitCriteriaTable(this, cf, false).init(); if (WellGroupTable.NAME.equalsIgnoreCase(name)) return new WellGroupTable(this, cf, false).init(); if (WellGroupTypeTable.NAME.equalsIgnoreCase(name)) diff --git a/assay/src/org/labkey/assay/query/AssayDbSchema.java b/assay/src/org/labkey/assay/query/AssayDbSchema.java index 61655dd2dd0..0cb9f1d2ba9 100644 --- a/assay/src/org/labkey/assay/query/AssayDbSchema.java +++ b/assay/src/org/labkey/assay/query/AssayDbSchema.java @@ -79,8 +79,8 @@ public TableInfo getTableInfoHit() return getSchema().getTable("Hit"); } - public TableInfo getTableInfoHitCriteria() + public TableInfo getTableInfoFilterCriteria() { - return getSchema().getTable("HitCriteria"); + return getSchema().getTable("FilterCriteria"); } } From 8a9f28fa7907e2ac87d6e9930876d12a8b8a9c8e Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 27 Nov 2024 16:32:07 -0800 Subject: [PATCH 08/37] SQL Server --- .../api/assay/AbstractAssayProvider.java | 12 ++++++++++- .../org/labkey/api/assay/AssayProvider.java | 2 ++ .../api/assay/plate/FilterCriteria.java | 4 ++-- .../api/assay/AssayResultDomainKind.java | 21 +++++++++++++++++++ .../sqlserver/assay-24.015-24.016.sql | 18 ++++++++++++++++ .../org/labkey/assay/TsvAssayProvider.java | 16 ++++++++++++-- 6 files changed, 68 insertions(+), 5 deletions(-) diff --git a/api/src/org/labkey/api/assay/AbstractAssayProvider.java b/api/src/org/labkey/api/assay/AbstractAssayProvider.java index f45b08bb606..97b28adcd56 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayProvider.java +++ b/api/src/org/labkey/api/assay/AbstractAssayProvider.java @@ -401,6 +401,11 @@ public Domain getResultsDomain(ExpProtocol protocol) return getDomainByPrefix(protocol, ExpProtocol.ASSAY_DOMAIN_DATA); } + protected @Nullable Domain getResultsDomainIfExists(ExpProtocol protocol) + { + return getDomainByPrefixIfExists(protocol, ExpProtocol.ASSAY_DOMAIN_DATA); + } + @Override public void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException { @@ -1748,7 +1753,7 @@ public boolean isPlateMetadataEnabled(ExpProtocol protocol) @Override public @NotNull List getFilterCriteria(ExpProtocol protocol) { - Domain resultsDomain = getResultsDomain(protocol); + Domain resultsDomain = getResultsDomainIfExists(protocol); if (resultsDomain == null) return Collections.emptyList(); @@ -1760,6 +1765,11 @@ public boolean isPlateMetadataEnabled(ExpProtocol protocol) return Collections.emptyList(); } + @Override + public void removeFilterCriteriaForProperty(PropertyDescriptor pd) + { + } + public record AssayFileMoveData(ExpRun run, Container sourceContainer, String fieldName, File sourceFile, File targetFile) {} public record AssayMoveData(Map counts, Map> fileMovesByRunId) {} diff --git a/api/src/org/labkey/api/assay/AssayProvider.java b/api/src/org/labkey/api/assay/AssayProvider.java index 96702a72e0d..e0d93b25089 100644 --- a/api/src/org/labkey/api/assay/AssayProvider.java +++ b/api/src/org/labkey/api/assay/AssayProvider.java @@ -28,6 +28,7 @@ import org.labkey.api.exp.Handler; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.ObjectProperty; +import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.XarContext; import org.labkey.api.exp.api.ExpData; import org.labkey.api.exp.api.ExpExperiment; @@ -276,6 +277,7 @@ enum Scope boolean isPlateMetadataEnabled(ExpProtocol protocol); @NotNull List getFilterCriteria(ExpProtocol protocol); + void removeFilterCriteriaForProperty(PropertyDescriptor pd); /** * @return the data type that this run creates for its analyzed results diff --git a/api/src/org/labkey/api/assay/plate/FilterCriteria.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java index 6a071007c92..24ecc33da4e 100644 --- a/api/src/org/labkey/api/assay/plate/FilterCriteria.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -65,7 +65,7 @@ public record FilterCriteria( else if (name.equalsIgnoreCase(referencePropertyName)) { propertyId = referencePropertyId; - name = null; + name = referencePropertyName; } } else if (propertyId != null && propertyId != referencePropertyId) @@ -74,7 +74,7 @@ else if (propertyId != null && propertyId != referencePropertyId) if (propertyId == null) { propertyId = referencePropertyId; - name = null; + name = referencePropertyName; } String operation = StringUtils.trimToNull(criterion.getOp()); diff --git a/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java index 2ff9e63523e..3c351a4bd2a 100644 --- a/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java @@ -22,6 +22,8 @@ import org.labkey.api.data.DbScope; import org.labkey.api.data.JdbcType; import org.labkey.api.data.PropertyStorageSpec; +import org.labkey.api.exp.OntologyManager; +import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; import org.labkey.api.security.User; @@ -152,4 +154,23 @@ public boolean allowCalculatedFields() { return true; } + + @Override + public void deletePropertyDescriptor(Domain domain, User user, PropertyDescriptor pd) + { + super.deletePropertyDescriptor(domain, user, pd); + + // SQL Server does not allow for multiple foreign keys to the same table to utilize ON DELETE CASCADE as it may + // cause cycles or multiple cascade paths. The solution is to only ON DELETE CASCADE for one foreign key and + // clean up upon delete of the property for other changes. See the "CREATE TABLE assay.FilterCriteria" + // statement in assay schema upgrade scripts. + if (!OntologyManager.getSqlDialect().isSqlServer()) + return; + + Pair pair = findProviderAndProtocol(domain); + if (pair == null) + return; + + pair.first.removeFilterCriteriaForProperty(pd); + } } diff --git a/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql index e69de29bb2d..b693bc2cf2e 100644 --- a/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql +++ b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql @@ -0,0 +1,18 @@ +CREATE TABLE assay.FilterCriteria +( + RowId INT IDENTITY(1,1), + PropertyId INT NOT NULL, + ReferencePropertyId INT NOT NULL, + DomainId INT NOT NULL, + Operation NVARCHAR(50) NOT NULL, + Value NVARCHAR(4000) NULL, + + CONSTRAINT PK_FilterCriteria PRIMARY KEY (RowId), + CONSTRAINT FK_FilterCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE + + -- SQL Server does not allow for multiple foreign keys to the same table to utilize ON DELETE CASCADE as it may + -- cause cycles or multiple cascade paths. The solution is to only ON DELETE CASCADE for one foreign key and + -- clean up upon delete of the property for other changes. See AssayResultDomainKind.deletePropertyDescriptor(). + CONSTRAINT FK_FilterCriteria_PropertyDescriptor FOREIGN KEY (PropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, + CONSTRAINT FK_FilterCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE NO ACTION, +); diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 11815bf05d4..11100332d0b 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -58,6 +58,7 @@ import org.labkey.api.data.TableSelector; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.ObjectProperty; +import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.PropertyType; import org.labkey.api.exp.XarContext; import org.labkey.api.exp.api.ExpData; @@ -654,8 +655,8 @@ private void updateFilterCriteria( if (!toRemove.isEmpty()) { - var sql = new SQLFragment("DELETE FROM ").append(table, "criteria") - .append("WHERE RowId ").appendInClause(toRemove, table.getSqlDialect()); + var sql = new SQLFragment("DELETE FROM ").append(table) + .append(" WHERE RowId ").appendInClause(toRemove, table.getSqlDialect()); new SqlExecutor(table.getSchema()).execute(sql); } @@ -678,6 +679,17 @@ private void updateFilterCriteria( } } + @Override + public void removeFilterCriteriaForProperty(PropertyDescriptor pd) + { + var table = AssayDbSchema.getInstance().getTableInfoFilterCriteria(); + var sql = new SQLFragment("DELETE FROM ").append(table) + .append(" WHERE (PropertyId = ? OR ReferencePropertyId = ?)") + .addAll(pd.getPropertyId(), pd.getPropertyId()); + + new SqlExecutor(table.getSchema()).execute(sql); + } + private static boolean isResultsDomain(GWTDomain domain) { return domain != null && domain.getDomainURI().contains(":" + ExpProtocol.AssayDomainTypes.Result.getPrefix() + "."); From aa918dca7f0da30354e88fc28d241f535b70503e Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Mon, 2 Dec 2024 16:51:14 -0800 Subject: [PATCH 09/37] FilterCriteriaColumnsAction --- .../actions/FilterCriteriaColumnsAction.java | 5 + .../plate/AssayPlateMetadataService.java | 3 + .../src/org/labkey/assay/AssayController.java | 58 +++++++++++ .../plate/AssayPlateMetadataServiceImpl.java | 97 +++++++++++++++---- 4 files changed, 146 insertions(+), 17 deletions(-) create mode 100644 api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java diff --git a/api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java b/api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java new file mode 100644 index 00000000000..01beb23132c --- /dev/null +++ b/api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java @@ -0,0 +1,5 @@ +package org.labkey.api.assay.actions; + +public class FilterCriteriaColumnsAction +{ +} diff --git a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java index 5f8fffafda2..f667f94a849 100644 --- a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java +++ b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java @@ -47,6 +47,9 @@ static AssayPlateMetadataService get() return ServiceRegistry.get().getService(AssayPlateMetadataService.class); } + Map> previewFilterCriteriaColumns(@NotNull ExpProtocol protocol, List columnNames); + Map> previewFilterCriteriaColumns(@NotNull Container container, String protocolName, List columnNames); + /** * Merges the results data with the plate metadata to produce a single row map * diff --git a/assay/src/org/labkey/assay/AssayController.java b/assay/src/org/labkey/assay/AssayController.java index a15e940aee8..4165daee3dc 100644 --- a/assay/src/org/labkey/assay/AssayController.java +++ b/assay/src/org/labkey/assay/AssayController.java @@ -59,6 +59,7 @@ import org.labkey.api.assay.actions.ProtocolIdForm; import org.labkey.api.assay.actions.ReimportRedirectAction; import org.labkey.api.assay.actions.UploadWizardAction; +import org.labkey.api.assay.plate.AssayPlateMetadataService; import org.labkey.api.assay.plate.PlateBasedAssayProvider; import org.labkey.api.assay.sample.AssaySampleLookupContext; import org.labkey.api.assay.security.DesignAssayPermission; @@ -1876,4 +1877,61 @@ public Object execute(SyncRunLineageForm form, BindException errors) throws Exce return success(); } } + + public static class FilterCriteriaColumnsForm + { + private List _columnNames = new ArrayList<>(); + private Integer _protocolId; + + public List getColumnNames() + { + return _columnNames; + } + + public void setColumnNames(List columnNames) + { + _columnNames = columnNames; + } + + public Integer getProtocolId() + { + return _protocolId; + } + + public void setProtocolId(Integer protocolId) + { + _protocolId = protocolId; + } + } + + @Marshal(Marshaller.Jackson) + @RequiresPermission(ReadPermission.class) + public static class FilterCriteriaColumnsAction extends MutatingApiAction + { + @Override + public void validateForm(FilterCriteriaColumnsForm form, Errors errors) + { + if (form.getProtocolId() != null && form.getProtocolId() <= 0) + errors.reject(ERROR_REQUIRED, "A valid \"protocolId\" is required."); + else if (form.getColumnNames() == null || form.getColumnNames().isEmpty()) + errors.reject(ERROR_REQUIRED, "At least one \"columnNames\" must be specified."); + // TODO: Sanitize, validate column names? Need to ensure mapping back to user provided values. + } + + @Override + public Object execute(FilterCriteriaColumnsForm form, BindException errors) throws Exception + { + if (form.getProtocolId() == null) + return AssayPlateMetadataService.get().previewFilterCriteriaColumns(getContainer(), "FilterCriteriaColumnsAction", form.getColumnNames()); + + var protocol = ExperimentService.get().getExpProtocol(form.getProtocolId()); + if (protocol == null || !protocol.getContainer().hasPermission(getUser(), ReadPermission.class) || AssayService.get().getProvider(protocol) == null) + { + errors.reject(ERROR_GENERIC, String.format("Unable to resolve assay protocol with id (%d).", form.getProtocolId())); + return null; + } + + return AssayPlateMetadataService.get().previewFilterCriteriaColumns(protocol, form.getColumnNames()); + } + } } diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index 64e32a00db9..a8db3110231 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -67,6 +67,7 @@ import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainProperty; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.gwt.client.model.GWTDomain; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; @@ -857,11 +858,20 @@ public OntologyManager.UpdateableTableImportHelper getImportHelper( return new PlateMetadataImportHelper(data, container, user, run, protocol, provider, context); } - @Override - public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException + private @NotNull DomainProperty addField(Domain replicateDomain, String fieldName, @Nullable String format) + { + // create the property and copy the format + PropertyStorageSpec spec = new PropertyStorageSpec(fieldName, JdbcType.DOUBLE); + + // Default formatting is 4 decimal places + DomainProperty domainProperty = replicateDomain.addProperty(spec); + domainProperty.setFormat(format == null ? "#.####" : format); + + return domainProperty; + } + + private Map getExistingFields(Domain replicateDomain) { - Domain replicateDomain = ensurePlateReplicateStatsDomain(protocol); - boolean domainDirty = false; Set domainBaseProperties = replicateDomain.getBaseProperties().stream().map(DomainProperty::getName).collect(Collectors.toSet()); Map existingFields = new HashMap<>(); replicateDomain.getProperties().forEach(dp -> { @@ -869,6 +879,55 @@ public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomai existingFields.put(dp.getName(), dp); }); + return existingFields; + } + + @Override + public Map> previewFilterCriteriaColumns(@NotNull ExpProtocol protocol, List columnNames) + { + return previewFilterCriteriaColumns(protocol.getContainer(), protocol.getName(), columnNames); + } + + @Override + public Map> previewFilterCriteriaColumns(@NotNull Container container, String protocolName, List columnNames) + { + if (columnNames.isEmpty()) + return Collections.emptyMap(); + + var replicateDomain = ensurePlateReplicateStatsDomain(container, protocolName); + var existingFields = getExistingFields(replicateDomain); + var columnMap = new HashMap>(); + + for (var columnName : columnNames) + { + var properties = new ArrayList(); + + for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(columnName)) + { + DomainProperty dp; + if (existingFields.containsKey(name)) + dp = existingFields.get(name); + else + dp = addField(replicateDomain, name, null); + + properties.add(DomainUtil.getPropertyDescriptor(dp)); + } + + columnMap.put(columnName, properties); + } + + // Notably, this method does not commit/save the changes made on the underlying domain. + + return columnMap; + } + + @Override + public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException + { + Domain replicateDomain = ensurePlateReplicateStatsDomain(protocol); + Map existingFields = getExistingFields(replicateDomain); + boolean domainDirty = false; + for (GWTPropertyDescriptor prop : update.getFields()) { // for measures of type : numeric create the stats fields @@ -882,13 +941,7 @@ public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomai // check for additions if (!existingFields.containsKey(name)) { - // create the property and copy the format - PropertyStorageSpec spec = new PropertyStorageSpec(name, JdbcType.DOUBLE); - - // Default formatting is 4 decimal places - DomainProperty domainProperty = replicateDomain.addProperty(spec); - domainProperty.setFormat(prop.getFormat() == null ? "#.####" : prop.getFormat()); - + addField(replicateDomain, name, prop.getFormat()); domainDirty = true; } else @@ -922,21 +975,31 @@ public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomai @Override public @Nullable Domain getPlateReplicateStatsDomain(ExpProtocol protocol) { - String uri = getPlateReplicateStatsDomainUri(protocol); - return PropertyService.get().getDomain(protocol.getContainer(), uri); + return getPlateReplicateStatsDomain(protocol.getContainer(), protocol.getName()); } - private String getPlateReplicateStatsDomainUri(ExpProtocol protocol) + private @Nullable Domain getPlateReplicateStatsDomain(Container container, String protocolName) + { + String uri = getPlateReplicateStatsDomainUri(container, protocolName); + return PropertyService.get().getDomain(container, uri); + } + + private String getPlateReplicateStatsDomainUri(Container container, String protocolName) { var domainKind = PropertyService.get().getDomainKindByName(PlateReplicateStatsDomainKind.KIND_NAME); - return domainKind.generateDomainURI(AssaySchema.NAME, protocol.getName(), protocol.getContainer(), null); + return domainKind.generateDomainURI(AssaySchema.NAME, protocolName, container, null); } private @NotNull Domain ensurePlateReplicateStatsDomain(ExpProtocol protocol) { - Domain domain = getPlateReplicateStatsDomain(protocol); + return ensurePlateReplicateStatsDomain(protocol.getContainer(), protocol.getName()); + } + + private @NotNull Domain ensurePlateReplicateStatsDomain(Container container, String protocolName) + { + Domain domain = getPlateReplicateStatsDomain(container, protocolName); if (domain == null) - domain = PropertyService.get().createDomain(protocol.getContainer(), getPlateReplicateStatsDomainUri(protocol), PlateReplicateStatsDomainKind.NAME); + domain = PropertyService.get().createDomain(container, getPlateReplicateStatsDomainUri(container, protocolName), PlateReplicateStatsDomainKind.NAME); return domain; } From 2ae59123134ec1210fd0a394aa3125893a03c8d5 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 4 Dec 2024 09:03:38 -0800 Subject: [PATCH 10/37] Apply hit criteria --- .../api/assay/AbstractAssayProvider.java | 15 +++ .../org/labkey/api/assay/AssayProvider.java | 1 + .../plate/AssayPlateMetadataService.java | 9 ++ .../api/assay/plate/FilterCriteria.java | 2 +- .../org/labkey/assay/TSVProtocolSchema.java | 6 +- .../org/labkey/assay/TsvAssayProvider.java | 7 ++ .../plate/AssayPlateMetadataServiceImpl.java | 103 +++++++++++++++++- .../assay/plate/AssayPlateTriggerFactory.java | 96 ++++++++++++++-- .../org/labkey/assay/plate/PlateManager.java | 11 ++ 9 files changed, 231 insertions(+), 19 deletions(-) diff --git a/api/src/org/labkey/api/assay/AbstractAssayProvider.java b/api/src/org/labkey/api/assay/AbstractAssayProvider.java index 97b28adcd56..fba89009a93 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayProvider.java +++ b/api/src/org/labkey/api/assay/AbstractAssayProvider.java @@ -1765,6 +1765,21 @@ public boolean isPlateMetadataEnabled(ExpProtocol protocol) return Collections.emptyList(); } + @Override + public boolean hasFilterCriteria(ExpProtocol protocol) + { + Domain resultsDomain = getResultsDomainIfExists(protocol); + if (resultsDomain == null) + return false; + + return hasFilterCriteria(protocol, resultsDomain); + } + + protected boolean hasFilterCriteria(ExpProtocol protocol, Domain resultsDomain) + { + return false; + } + @Override public void removeFilterCriteriaForProperty(PropertyDescriptor pd) { diff --git a/api/src/org/labkey/api/assay/AssayProvider.java b/api/src/org/labkey/api/assay/AssayProvider.java index e0d93b25089..703a45d0f17 100644 --- a/api/src/org/labkey/api/assay/AssayProvider.java +++ b/api/src/org/labkey/api/assay/AssayProvider.java @@ -277,6 +277,7 @@ enum Scope boolean isPlateMetadataEnabled(ExpProtocol protocol); @NotNull List getFilterCriteria(ExpProtocol protocol); + boolean hasFilterCriteria(ExpProtocol protocol); void removeFilterCriteriaForProperty(PropertyDescriptor pd); /** diff --git a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java index f667f94a849..b41271da6a2 100644 --- a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java +++ b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java @@ -6,6 +6,7 @@ import org.labkey.api.assay.AssayRunUploadContext; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; +import org.labkey.api.data.TableInfo; import org.labkey.api.dataiterator.DataIteratorBuilder; import org.labkey.api.exp.ExperimentException; import org.labkey.api.exp.Lsid; @@ -134,4 +135,12 @@ void deleteReplicateStats( ExpProtocol protocol, List> keys ) throws ValidationException; + + void applyHitSelectionCriteria( + Container container, + User user, + ExpProtocol protocol, + TableInfo resultsTable, + List runIds + ) throws ValidationException; } diff --git a/api/src/org/labkey/api/assay/plate/FilterCriteria.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java index 24ecc33da4e..3dbdd4c188c 100644 --- a/api/src/org/labkey/api/assay/plate/FilterCriteria.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -14,7 +14,7 @@ public record FilterCriteria( String operation, String value, - @Nullable Integer propertyId, + Integer propertyId, @Nullable String name, Integer referencePropertyId, Integer domainId diff --git a/assay/src/org/labkey/assay/TSVProtocolSchema.java b/assay/src/org/labkey/assay/TSVProtocolSchema.java index 9e1b2c1fbb0..fc1ff8a2790 100644 --- a/assay/src/org/labkey/assay/TSVProtocolSchema.java +++ b/assay/src/org/labkey/assay/TSVProtocolSchema.java @@ -149,11 +149,12 @@ private class _AssayResultTable extends AssayResultTable } } - List defaultColumns = new ArrayList<>(getDefaultVisibleColumns()); if (getProvider().isPlateMetadataEnabled(getProtocol())) { + List defaultColumns = new ArrayList<>(getDefaultVisibleColumns()); + // plate related triggers - addTriggerFactory(new AssayPlateTriggerFactory(getProtocol())); + addTriggerFactory(new AssayPlateTriggerFactory(getProvider(), getProtocol())); // join to the well table which may have plate metadata ColumnInfo wellLsidCol = getColumn(AssayResultDomainKind.WELL_LSID_COLUMN_NAME); @@ -221,6 +222,7 @@ private class _AssayResultTable extends AssayResultTable defaultColumns = newDefaultColumns; } } + setDefaultVisibleColumns(defaultColumns); } } diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 11100332d0b..2c5710f9c2e 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -606,6 +606,13 @@ public boolean supportsSampleLookupsAsMaterialInputs() return criteria; } + @Override + protected boolean hasFilterCriteria(ExpProtocol protocol, Domain domain) + { + var filter = new SimpleFilter(FieldKey.fromParts("DomainId"), domain.getTypeId()); + return new TableSelector(AssayDbSchema.getInstance().getTableInfoFilterCriteria(), Collections.singleton("RowId"), filter, null).exists(); + } + private void updateFilterCriteria( User user, ExpProtocol protocol, diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index a8db3110231..cf365d81522 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -35,6 +35,7 @@ import org.labkey.api.collections.CaseInsensitiveHashSet; import org.labkey.api.collections.CaseInsensitiveMapWrapper; import org.labkey.api.data.ColumnInfo; +import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; import org.labkey.api.data.DbScope; @@ -43,6 +44,7 @@ import org.labkey.api.data.ParameterMapStatement; import org.labkey.api.data.PropertyStorageSpec; import org.labkey.api.data.Results; +import org.labkey.api.data.RuntimeSQLException; import org.labkey.api.data.SQLFragment; import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.Sort; @@ -87,6 +89,7 @@ import org.labkey.api.util.TestContext; import org.labkey.api.util.UnexpectedException; import org.labkey.api.util.logging.LogHelper; +import org.labkey.api.view.ActionURL; import org.labkey.assay.TSVProtocolSchema; import org.labkey.assay.plate.model.WellBean; import org.labkey.assay.plate.query.PlateTable; @@ -95,6 +98,7 @@ import org.labkey.vfs.FileLike; import java.io.IOException; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -112,6 +116,7 @@ import static org.junit.Assert.assertNull; import static org.labkey.api.assay.AssayResultDomainKind.REPLICATE_LSID_COLUMN_NAME; import static org.labkey.api.assay.AssayResultDomainKind.WELL_LSID_COLUMN_NAME; +import static org.labkey.api.assay.AssayRunUploadContext.ReImportOption.MERGE_DATA; public class AssayPlateMetadataServiceImpl implements AssayPlateMetadataService { @@ -254,7 +259,7 @@ public DataIteratorBuilder parsePlateData( if (context.getReRunId() != null) { // check if we are merging the re-imported data - if (context.getReImportOption() == AssayRunUploadContext.ReImportOption.MERGE_DATA) + if (context.getReImportOption() == MERGE_DATA) rows = mergeReRunData(container, user, context, rows, plates, provider, protocol, data, dataFile); else { @@ -1233,6 +1238,91 @@ public void deleteReplicateStats( } } + @Override + public void applyHitSelectionCriteria( + Container container, + User user, + ExpProtocol protocol, + TableInfo table, + List runIds + ) throws ValidationException + { + if (runIds.isEmpty()) + return; + + var provider = requireProvider(protocol); + var filterCriteria = provider.getFilterCriteria(protocol); + if (filterCriteria.isEmpty()) + return; + + var domain = table.getDomain(); + if (domain == null) + { + LOG.error("Automatic hit selection failed. Unable to resolve domain from table ({}).", table); + return; + } + + var url = new ActionURL(); + var replicateDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); + + for (var criteria : filterCriteria) // TODO: Need to validate filterCriteria compare types coming in + { + var domainProperty = domain.getProperty(criteria.propertyId()); + boolean isReplicateProperty = false; + + if (domainProperty == null && replicateDomain != null) + { + domainProperty = replicateDomain.getProperty(criteria.propertyId()); + isReplicateProperty = domainProperty != null; + } + + if (domainProperty == null) + { + LOG.error("Automatic hit selection failed. Unable to resolve domain property from propertyId ({}).", criteria.propertyId()); + return; + } + + FieldKey fieldKey; + if (isReplicateProperty) + fieldKey = FieldKey.fromParts("Replicate", domainProperty.getName()); + else + fieldKey = FieldKey.fromParts(domainProperty.getName()); + + CompareType ct = CompareType.getByURLKey(criteria.operation()); + if (ct == null) + { + LOG.error("Automatic hit selection failed. Unable to resolve filter comparison type from operation \"{}\".", criteria.operation()); + return; + } + + url.addFilter(null, fieldKey, ct, criteria.value()); + } + + // The referenced plate well must have a sample value + var filter = new SimpleFilter(FieldKey.fromParts("Well", "SampleId"), null, CompareType.NONBLANK); + + // Applying filters via ActionURL allows for automatic type coercion of the filter value + filter.addUrlFilters(url, null); + + var selector = new TableSelector(table, Collections.singleton(table.getColumn(FieldKey.fromParts("RowId"))), filter, null); + var matchingResults = selector.getArrayList(Integer.class); + + // Remove previous hits against the runs that have been modified + PlateManager.get().deleteHitsForRuns(runIds); + + if (matchingResults.isEmpty()) + return; + + try + { + PlateManager.get().markHits(container, user, protocol.getRowId(), true, matchingResults, null); + } + catch (SQLException e) + { + throw new RuntimeSQLException(e); + } + } + private static class PlateMetadataImportHelper extends SimpleAssayDataImportHelper { private final Map> _wellPositionMap; // map of plate position to well table @@ -1369,15 +1459,15 @@ public void afterBatchInsert(int rowCount) // compute replicate calculations and insert into the replicate stats table AssayPlateMetadataService.get().insertReplicateStats(_container, _user, _protocol, _run, _replicateRows); + AssayProtocolSchema schema = _provider.createProtocolSchema(_user, _container, _protocol, null); + TableInfo resultsTable = schema.createDataTable(null, false); + // re-select any hits that were present in the previous run if (isExistingRun()) { ExpRun prevRun = ExperimentService.get().getExpRun(_context.getReRunId()); if (prevRun != null) { - AssayProtocolSchema schema = _provider.createProtocolSchema(_user, _container, _protocol, null); - TableInfo resultsTable = schema.createDataTable(null, false); - SQLFragment sql = new SQLFragment("SELECT AR.rowId FROM ").append(resultsTable, "AR") .append(" JOIN ").append(AssayDbSchema.getInstance().getTableInfoHit(), "HT") .append(" ON AR.welllsid = HT.welllsid") @@ -1390,9 +1480,12 @@ public void afterBatchInsert(int rowCount) PlateManager.get().markHits(_container, _user, _protocol.getRowId(), true, rowIds, null); // remove the selections from the previous run - PlateManager.get().deleteHits(FieldKey.fromParts("RunId"), List.of(prevRun)); + PlateManager.get().deleteHitsForRuns(List.of(prevRun.getRowId())); } } + + AssayPlateMetadataService.get().applyHitSelectionCriteria(_container, _user, _protocol, resultsTable, List.of(_run.getRowId())); + tx.commit(); } catch (Throwable e) diff --git a/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java b/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java index fdc1a4192ca..ad5b270e57b 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java @@ -4,7 +4,6 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.assay.AssayProvider; import org.labkey.api.assay.AssayResultDomainKind; -import org.labkey.api.assay.AssayService; import org.labkey.api.assay.plate.AssayPlateMetadataService; import org.labkey.api.assay.plate.PlateDataStateManager; import org.labkey.api.data.CompareType; @@ -17,6 +16,7 @@ import org.labkey.api.data.triggers.TriggerFactory; import org.labkey.api.exp.Lsid; import org.labkey.api.exp.api.ExpProtocol; +import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.property.DomainProperty; import org.labkey.api.qc.DataState; import org.labkey.api.query.BatchValidationException; @@ -36,19 +36,15 @@ public class AssayPlateTriggerFactory implements TriggerFactory { + private final AssayProvider _provider; private final ExpProtocol _protocol; - private DomainProperty _qcStateProp; + private final DomainProperty _qcStateProp; - public AssayPlateTriggerFactory(ExpProtocol protocol) + public AssayPlateTriggerFactory(@NotNull AssayProvider provider, @NotNull ExpProtocol protocol) { + _provider = provider; _protocol = protocol; - - if (_protocol != null) - { - AssayProvider provider = AssayService.get().getProvider(_protocol); - if (provider != null) - _qcStateProp = AssayPlateMetadataServiceImpl.getAssayStateProp(provider.getResultsDomain(_protocol)); - } + _qcStateProp = AssayPlateMetadataServiceImpl.getAssayStateProp(provider.getResultsDomain(_protocol)); } @Override @@ -56,7 +52,8 @@ public AssayPlateTriggerFactory(ExpProtocol protocol) { return List.of( new ReplicateStatsTrigger(), - new DataStateTrigger() + new DataStateTrigger(), + new AutomaticHitSelectionTrigger() ); } @@ -159,6 +156,9 @@ public void beforeUpdate( Map extraContext ) throws ValidationException { + if (errors.hasErrors()) + return; + if (newRow != null && _qcStateProp != null) { DataState state = AssayPlateMetadataServiceImpl.validateRowDataStates(c, newRow, _qcStateProp); @@ -179,4 +179,78 @@ public void complete(TableInfo table, Container c, User user, TableInfo.TriggerT PlateManager.get().deleteHits(_protocol.getRowId(), _excludedRows); } } + + private class AutomaticHitSelectionTrigger implements Trigger + { + private Set dataIds = null; + private boolean enabled = false; + + @Override + public void init( + TableInfo table, + Container c, + User user, + TableInfo.TriggerType event, + BatchValidationException errors, + Map extraContext + ) + { + if (errors.hasErrors()) + return; + + if (_provider.hasFilterCriteria(_protocol)) + { + enabled = true; + dataIds = new HashSet<>(); + } + } + + @Override + public void afterUpdate( + TableInfo table, + Container c, + User user, + @Nullable Map newRow, + @Nullable Map oldRow, + ValidationException errors, + Map extraContext + ) + { + if (!enabled || errors.hasErrors() || oldRow == null) + return; + + dataIds.add(((Number) oldRow.get("DataId")).intValue()); + } + + @Override + public void complete( + TableInfo table, + Container c, + User user, + TableInfo.TriggerType event, + BatchValidationException errors, + Map extraContext + ) + { + if (!enabled || errors.hasErrors()) + return; + + List runIds = new ArrayList<>(); + for (var expDataId : dataIds) + { + var data = ExperimentService.get().getExpData(expDataId); + if (data != null) + runIds.add(data.getRunId()); + } + + try + { + AssayPlateMetadataService.get().applyHitSelectionCriteria(c, user, _protocol, table, runIds); + } + catch (ValidationException e) + { + errors.addRowError(e); + } + } + } } diff --git a/assay/src/org/labkey/assay/plate/PlateManager.java b/assay/src/org/labkey/assay/plate/PlateManager.java index 7b0eb4e16cd..9ef4d994e73 100644 --- a/assay/src/org/labkey/assay/plate/PlateManager.java +++ b/assay/src/org/labkey/assay/plate/PlateManager.java @@ -3110,11 +3110,22 @@ public void deleteHits(FieldKey fieldKey, Collection object public void deleteHits(int protocolId, Collection resultIds) { + if (resultIds == null || resultIds.isEmpty()) + return; + SimpleFilter filter = new SimpleFilter(FieldKey.fromParts("ProtocolId"), protocolId); filter.addCondition(FieldKey.fromParts("ResultId"), resultIds, CompareType.IN); deleteHits(filter); } + public void deleteHitsForRuns(Collection runIds) + { + if (runIds == null || runIds.isEmpty()) + return; + + deleteHits(new SimpleFilter(FieldKey.fromParts("RunId"), runIds, CompareType.IN)); + } + private void deleteReplicateStats(ExpProtocol protocol, User user, SimpleFilter filter) { AssayProvider provider = AssayService.get().getProvider(protocol); From c2d5b6febc09099fc546377ae44a1b093a6fac42 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 4 Dec 2024 09:58:00 -0800 Subject: [PATCH 11/37] Remove action --- .../api/assay/actions/FilterCriteriaColumnsAction.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java diff --git a/api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java b/api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java deleted file mode 100644 index 01beb23132c..00000000000 --- a/api/src/org/labkey/api/assay/actions/FilterCriteriaColumnsAction.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.labkey.api.assay.actions; - -public class FilterCriteriaColumnsAction -{ -} From b1107a690ad09fc48ce2937d2c425e4d762d3f23 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Fri, 6 Dec 2024 10:20:02 -0800 Subject: [PATCH 12/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index da6c80249e9..16bf0807630 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0" + "@labkey/components": "6.4.1-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0.tgz", - "integrity": "sha512-OVmQjchyUr8VlaKaSDTg+QpGjImEm+dWhnfctvK8uRLb6GynNAkgL7nPv/Bt+awRwtv5L66qXUeSSOcIWqV8sg==", + "version": "6.4.1-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", + "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/assay/package.json b/assay/package.json index 00e2338ba57..29d7dd91851 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.6.0" + "@labkey/components": "6.4.1-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index ab6f8893953..615bda31064 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0", + "@labkey/components": "6.4.1-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0.tgz", - "integrity": "sha512-OVmQjchyUr8VlaKaSDTg+QpGjImEm+dWhnfctvK8uRLb6GynNAkgL7nPv/Bt+awRwtv5L66qXUeSSOcIWqV8sg==", + "version": "6.4.1-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", + "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/core/package.json b/core/package.json index 914f3745ee2..d875c7da298 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.6.0", + "@labkey/components": "6.4.1-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 9efb44a315e..3eb67257d71 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0" + "@labkey/components": "6.4.1-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0.tgz", - "integrity": "sha512-OVmQjchyUr8VlaKaSDTg+QpGjImEm+dWhnfctvK8uRLb6GynNAkgL7nPv/Bt+awRwtv5L66qXUeSSOcIWqV8sg==", + "version": "6.4.1-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", + "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/experiment/package.json b/experiment/package.json index 7332f69d2d1..ba732b0df4f 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.6.0" + "@labkey/components": "6.4.1-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 98ce7226cba..e3c5b38d236 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0" + "@labkey/components": "6.4.1-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0.tgz", - "integrity": "sha512-OVmQjchyUr8VlaKaSDTg+QpGjImEm+dWhnfctvK8uRLb6GynNAkgL7nPv/Bt+awRwtv5L66qXUeSSOcIWqV8sg==", + "version": "6.4.1-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", + "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/pipeline/package.json b/pipeline/package.json index 5be82d29c38..3e888343284 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.6.0" + "@labkey/components": "6.4.1-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", From 131f39ac27a7eb4d80e351281b6ad46076852586 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Fri, 6 Dec 2024 10:41:23 -0800 Subject: [PATCH 13/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 16bf0807630..e803ee908ac 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0" + "@labkey/components": "6.4.1-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", - "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", + "version": "6.4.1-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", + "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/assay/package.json b/assay/package.json index 29d7dd91851..0873015557c 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0" + "@labkey/components": "6.4.1-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 615bda31064..246f3d9821b 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0", + "@labkey/components": "6.4.1-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", - "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", + "version": "6.4.1-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", + "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/core/package.json b/core/package.json index d875c7da298..ce2ce0ff86b 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0", + "@labkey/components": "6.4.1-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 3eb67257d71..37b4ac545a7 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0" + "@labkey/components": "6.4.1-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", - "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", + "version": "6.4.1-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", + "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/experiment/package.json b/experiment/package.json index ba732b0df4f..876cccfa784 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0" + "@labkey/components": "6.4.1-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index e3c5b38d236..4255c7f9d73 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0" + "@labkey/components": "6.4.1-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.0.tgz", - "integrity": "sha512-1MfcpxF+9TqJuhPrmTvhpzzqBVmSZ3B+pxRpdBrs0CScZZfBbFQdmALfS0pZf7ZyR0FmxnpbIPu5FRTsu2WLuw==", + "version": "6.4.1-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", + "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0", diff --git a/pipeline/package.json b/pipeline/package.json index 3e888343284..a00e3a12246 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.0" + "@labkey/components": "6.4.1-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", From 705dae4c3d48bb691e9d027f5bd47ba5ddeadecc Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Fri, 6 Dec 2024 14:57:23 -0800 Subject: [PATCH 14/37] Replicate stats: retain data upon colum rename --- .../api/assay/AbstractAssayProvider.java | 7 +- .../org/labkey/api/assay/AssayProvider.java | 3 +- .../plate/AssayPlateMetadataService.java | 7 +- .../labkey/assay/AssayDomainServiceImpl.java | 32 ++--- .../org/labkey/assay/TsvAssayProvider.java | 29 +++-- .../plate/AssayPlateMetadataServiceImpl.java | 111 +++++++++++++++--- 6 files changed, 143 insertions(+), 46 deletions(-) diff --git a/api/src/org/labkey/api/assay/AbstractAssayProvider.java b/api/src/org/labkey/api/assay/AbstractAssayProvider.java index fba89009a93..09d707bd205 100644 --- a/api/src/org/labkey/api/assay/AbstractAssayProvider.java +++ b/api/src/org/labkey/api/assay/AbstractAssayProvider.java @@ -407,7 +407,12 @@ public Domain getResultsDomain(ExpProtocol protocol) } @Override - public void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException + public void beforeDomainChange(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException + { + } + + @Override + public void afterDomainChange(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException { } diff --git a/api/src/org/labkey/api/assay/AssayProvider.java b/api/src/org/labkey/api/assay/AssayProvider.java index 703a45d0f17..983737614a7 100644 --- a/api/src/org/labkey/api/assay/AssayProvider.java +++ b/api/src/org/labkey/api/assay/AssayProvider.java @@ -102,7 +102,8 @@ enum ReRunSupport Domain getResultsDomain(ExpProtocol protocol); - void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException; + void beforeDomainChange(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException; + void afterDomainChange(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException; AssayRunCreator getRunCreator(); diff --git a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java index b41271da6a2..d35aa0fea66 100644 --- a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java +++ b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java @@ -106,7 +106,12 @@ OntologyManager.UpdateableTableImportHelper getImportHelper( * Called when a plate enabled protocol has changes to its results domain. This is to allow analogous changes * to the replicate table to create/delete fields to track replicate statistics. */ - void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException; + void updateReplicateStatsDomain( + User user, + ExpProtocol protocol, + GWTDomain original, + GWTDomain update + ) throws ValidationException; /** * Computes and inserts replicate statistics into the protocol schema table. diff --git a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java index 12e1e2cf070..7b0b8e73117 100644 --- a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java +++ b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java @@ -445,7 +445,7 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr else { GWTDomain previous = DomainUtil.getDomainDescriptor(getUser(), domain.getDomainURI(), protocol.getContainer()); - updateDomainDescriptor(domain, protocol, previous, assayProvider, false); + updateDomainDescriptor(assayProvider, protocol, previous, domain, false); domainURIs.add(domain.getDomainURI()); } @@ -607,7 +607,7 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr for (GWTDomain domain : assay.getDomains()) { GWTDomain previous = DomainUtil.getDomainDescriptor(getUser(), domain.getDomainURI(), protocol.getContainer()); - updateDomainDescriptor(domain, protocol, previous, provider, hasNameChange); + updateDomainDescriptor(provider, protocol, previous, domain, hasNameChange); boolean hasExistingCalcFields = previous != null && !previous.getCalculatedFields().isEmpty(); GWTDomain savedDomain = DomainUtil.getDomainDescriptor(getUser(), domain.getDomainURI(), protocol.getContainer()); @@ -635,31 +635,33 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr } private void updateDomainDescriptor( - GWTDomain domain, - ExpProtocol protocol, - GWTDomain previous, AssayProvider provider, + ExpProtocol protocol, + GWTDomain original, + GWTDomain update, boolean hasNameChange ) throws ValidationException { - for (GWTPropertyDescriptor prop : domain.getFields()) + for (GWTPropertyDescriptor prop : update.getFields()) { if (prop.getLookupQuery() != null) - { prop.setLookupQuery(prop.getLookupQuery().replace(AbstractAssayProvider.ASSAY_NAME_SUBSTITUTION, protocol.getName())); - } } - provider.changeDomain(getUser(), protocol, previous, domain); String auditComment = null; if (hasNameChange) - { - auditComment = "The name of the assay domain '" + previous.getName() + "' was changed to '" + domain.getName() + "'."; - } + auditComment = "The name of the assay domain '" + original.getName() + "' was changed to '" + update.getName() + "'."; + + // Before update + provider.beforeDomainChange(getUser(), protocol, original, update); + + // Update + ValidationException validationErrors = DomainUtil.updateDomainDescriptor(original, update, getContainer(), getUser(), hasNameChange, auditComment); + if (validationErrors.hasErrors()) + throw validationErrors; - ValidationException domainErrors = DomainUtil.updateDomainDescriptor(previous, domain, getContainer(), getUser(), hasNameChange, auditComment); - if (domainErrors.hasErrors()) - throw domainErrors; + // After update + provider.afterDomainChange(getUser(), protocol, original, update); } private boolean canUpdateProtocols() diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 2c5710f9c2e..b46f3a2477c 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -399,9 +399,9 @@ private boolean hasDomainNameChanged(ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException + public void beforeDomainChange(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException { - super.changeDomain(user, protocol, orig, update); + super.beforeDomainChange(user, protocol, orig, update); if (hasDomainNameChanged(protocol, orig)) { @@ -504,13 +504,26 @@ public void changeDomain(User user, ExpProtocol protocol, GWTDomain orig, GWTDomain update) throws ValidationException + { + super.afterDomainChange(user, protocol, orig, update); + + if (isResultsDomain(update)) + { + if (isPlateMetadataEnabled(protocol)) + { + // Update fields in the replicate stats table to match any changes to measures in the results domain + AssayPlateMetadataService.get().updateReplicateStatsDomain(user, protocol, orig, update); + } - updateFilterCriteria(user, protocol, orig, update); + // Filter criteria are only available to result domains + updateFilterCriteria(user, protocol, orig, update); + } } @Override @@ -622,10 +635,6 @@ private void updateFilterCriteria( { assert AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive(); - // Filter criteria are only available to result domains - if (!isResultsDomain(update)) - return; - Domain replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); Set newCriteria = new HashSet<>(); diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index cf365d81522..ce182cb5d13 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -927,40 +927,115 @@ public Map> previewFilterCriteriaColumns(@No } @Override - public void updateReplicateStatsDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException + public void updateReplicateStatsDomain( + User user, + ExpProtocol protocol, + GWTDomain original, + GWTDomain update + ) throws ValidationException { - Domain replicateDomain = ensurePlateReplicateStatsDomain(protocol); - Map existingFields = getExistingFields(replicateDomain); - boolean domainDirty = false; + var replicateDomain = ensurePlateReplicateStatsDomain(protocol); + var existingReplicateFields = getExistingFields(replicateDomain); + + var originalFields = new HashMap(); + for (var field : original.getFields()) + originalFields.put(field.getPropertyId(), field); + + var domainDirty = false; + var fieldsToRemove = new ArrayList(); - for (GWTPropertyDescriptor prop : update.getFields()) + for (var updateField : update.getFields()) { - // for measures of type : numeric create the stats fields - if (prop.isMeasure()) + var propertyId = updateField.getPropertyId(); + var isNew = !originalFields.containsKey(propertyId); + var isValidType = updateField.isMeasure() && PropertyType.getFromURI(null, updateField.getRangeURI()).getJdbcType().isNumeric(); + + if (isNew) { - PropertyType type = PropertyType.getFromURI(null, prop.getRangeURI()); - if (type.getJdbcType().isNumeric()) + if (isValidType) { - for (String name : PlateReplicateStatsDomainKind.getStatsFieldNames(prop.getName())) + for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(updateField.getName())) + { + addField(replicateDomain, name, null); + domainDirty = true; + } + } + } + else + { + var originalField = originalFields.get(propertyId); + var renamed = !originalField.getName().equals(updateField.getName()); + var wasValidType = originalField.isMeasure() && PropertyType.getFromURI(null, originalField.getRangeURI()).getJdbcType().isNumeric(); + + if (isValidType) + { + if (wasValidType) + { + if (renamed) + { + var originalNames = PlateReplicateStatsDomainKind.getStatsFieldNames(originalField.getName()); + var updatedNames = PlateReplicateStatsDomainKind.getStatsFieldNames(updateField.getName()); + + for (int i = 0; i < originalNames.size(); i++) + { + var name = originalNames.get(i); + if (existingReplicateFields.containsKey(name)) + { + var updatedName = updatedNames.get(i); + var dp = replicateDomain.getPropertyByName(name); + dp.setName(updatedName); + domainDirty = true; + } + } + } + } + else { - // check for additions - if (!existingFields.containsKey(name)) + // something else to numeric measure + for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(updateField.getName())) { - addField(replicateDomain, name, prop.getFormat()); + addField(replicateDomain, name, null); domainDirty = true; } - else - existingFields.remove(name); } } + else if (wasValidType) + { + // numeric measure to something else + var fieldName = renamed ? originalField.getName() : updateField.getName(); + for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(fieldName)) + { + var field = existingReplicateFields.get(name); + if (field != null) + fieldsToRemove.add(field); + } + } + } + + originalFields.remove(propertyId); + } + + // The only fields that remain in "originalFields" are ones that no longer exist in the updated domain. + // Remove any related replicate fields. + for (var originalField : originalFields.values()) + { + var wasValidType = originalField.isMeasure() && PropertyType.getFromURI(null, originalField.getRangeURI()).getJdbcType().isNumeric(); + if (wasValidType) + { + var fieldName = originalField.getName(); + for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(fieldName)) + { + var field = existingReplicateFields.get(name); + if (field != null) + fieldsToRemove.add(field); + } } } - // check for removals - if (!existingFields.isEmpty()) + if (!fieldsToRemove.isEmpty()) { domainDirty = true; - for (DomainProperty prop : existingFields.values()) + for (DomainProperty prop : fieldsToRemove) prop.delete(); } From ab5b274f7df9b749817ef18e7dc9dafce50d652b Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 10 Dec 2024 16:24:35 -0800 Subject: [PATCH 15/37] Filter criteria: support creation upon domain creation --- .../api/assay/plate/FilterCriteria.java | 3 ++ .../labkey/assay/AssayDomainServiceImpl.java | 33 ++++-------- .../org/labkey/assay/TsvAssayProvider.java | 50 ++++++++++++++++++- 3 files changed, 61 insertions(+), 25 deletions(-) diff --git a/api/src/org/labkey/api/assay/plate/FilterCriteria.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java index 3dbdd4c188c..e56021524b3 100644 --- a/api/src/org/labkey/api/assay/plate/FilterCriteria.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -3,6 +3,7 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.labkey.api.data.CompareType; import org.labkey.api.exp.property.Domain; import org.labkey.api.gwt.client.model.GWTFilterCriteria; import org.labkey.api.query.ValidationException; @@ -80,6 +81,8 @@ else if (propertyId != null && propertyId != referencePropertyId) String operation = StringUtils.trimToNull(criterion.getOp()); if (operation == null) throw new ValidationException(errorMessage(referencePropertyName, i, "An \"op\" (operation) property is required.")); + if (CompareType.getByURLKey(operation) == null) + throw new ValidationException(errorMessage(referencePropertyName, i, String.format("\"%s\" is not a valid operation.", operation))); String value = criterion.getValue() == null ? null : criterion.getValue().toString(); criteria.add(new FilterCriteria(operation, value, propertyId, name, referencePropertyId, domainId)); diff --git a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java index 7b0b8e73117..10b64e74763 100644 --- a/assay/src/org/labkey/assay/AssayDomainServiceImpl.java +++ b/assay/src/org/labkey/assay/AssayDomainServiceImpl.java @@ -448,20 +448,17 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr updateDomainDescriptor(assayProvider, protocol, previous, domain, false); domainURIs.add(domain.getDomainURI()); } - } + setPropertyDomainURIs(protocol, domainURIs, assayProvider); } else { protocol = ExperimentService.get().getExpProtocol(assay.getProtocolId().intValue()); - if (protocol == null) - { throw new ValidationException("Assay design has been deleted"); - } - //ensure that the user has edit perms in this container + // ensure that the user has edit perms in this container if (!canUpdateProtocols()) throw new ValidationException("You do not have sufficient permissions to update this Assay"); @@ -517,11 +514,10 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr if (provider instanceof PlateBasedAssayProvider plateProvider && assay.getSelectedPlateTemplate() != null) { Plate plate = PlateManager.get().getPlateByName(getContainer(), assay.getSelectedPlateTemplate()); - if (plate != null) - plateProvider.setPlate(getContainer(), protocol, plate); - else + if (plate == null) throw new ValidationException("The selected plate could not be found. Perhaps it was deleted by another user?"); + plateProvider.setPlate(getContainer(), protocol, plate); String selectedFormat = assay.getSelectedMetadataInputFormat(); SampleMetadataInputFormat inputFormat = SampleMetadataInputFormat.valueOf(selectedFormat); if (inputFormat != null) @@ -529,25 +525,24 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr } // data transform scripts - List transformScripts = new ArrayList<>(); List submittedScripts = assay.getProtocolTransformScripts(); if (!submittedScripts.isEmpty() && !canUpdateTransformationScript()) throw new ValidationException("You must be a platform developer or site admin to configure assay transformation scripts."); - for (String script : assay.getProtocolTransformScripts()) + + List transformScripts = new ArrayList<>(); + for (String script : submittedScripts) { if (!StringUtils.isBlank(script)) - { transformScripts.add(new File(script)); - } } if (provider instanceof DetectionMethodAssayProvider dmProvider && assay.getSelectedDetectionMethod() != null) { String detectionMethod = assay.getSelectedDetectionMethod(); - if (detectionMethod != null) - dmProvider.setSelectedDetectionMethod(getContainer(), protocol, detectionMethod); - else + if (detectionMethod == null) throw new ValidationException("The selected detection method could not be found."); + + dmProvider.setSelectedDetectionMethod(getContainer(), protocol, detectionMethod); } ValidationException scriptValidation = provider.setValidationAndAnalysisScripts(protocol, transformScripts); @@ -582,23 +577,15 @@ public GWTProtocol saveChanges(GWTProtocol assay, boolean replaceIfExisting) thr } if (autoLinkTargetContainerId != null) - { props.put(StudyPublishService.AUTO_LINK_TARGET_PROPERTY_URI, new ObjectProperty(protocol.getLSID(), protocol.getContainer(), StudyPublishService.AUTO_LINK_TARGET_PROPERTY_URI, autoLinkTargetContainerId)); - } else - { props.remove(StudyPublishService.AUTO_LINK_TARGET_PROPERTY_URI); - } String autoLinkCategory = assay.getAutoLinkCategory(); if (autoLinkCategory != null) - { props.put(StudyPublishService.AUTO_LINK_CATEGORY_PROPERTY_URI, new ObjectProperty(protocol.getLSID(), protocol.getContainer(), StudyPublishService.AUTO_LINK_CATEGORY_PROPERTY_URI, autoLinkCategory)); - } else - { props.remove(StudyPublishService.AUTO_LINK_CATEGORY_PROPERTY_URI); - } protocol.setObjectProperties(props); diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index b46f3a2477c..98b645d3cf4 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -68,8 +68,10 @@ import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainProperty; +import org.labkey.api.exp.property.DomainUtil; import org.labkey.api.exp.property.PropertyService; import org.labkey.api.gwt.client.model.GWTDomain; +import org.labkey.api.gwt.client.model.GWTFilterCriteria; import org.labkey.api.gwt.client.model.GWTPropertyDescriptor; import org.labkey.api.module.Module; import org.labkey.api.module.ModuleLoader; @@ -626,6 +628,15 @@ protected boolean hasFilterCriteria(ExpProtocol protocol, Domain domain) return new TableSelector(AssayDbSchema.getInstance().getTableInfoFilterCriteria(), Collections.singleton("RowId"), filter, null).exists(); } + private @NotNull GWTDomain getSavedDomain(User user, ExpProtocol protocol, GWTDomain update) throws ValidationException + { + GWTDomain savedDomain = DomainUtil.getDomainDescriptor(user, update.getDomainURI(), protocol.getContainer()); + if (savedDomain == null) + throw new ValidationException(String.format("Failed to resolve saved domain for domain URI \"%s\" in %s.", update.getDomainURI(), protocol.getContainer().getPath())); + + return savedDomain; + } + private void updateFilterCriteria( User user, ExpProtocol protocol, @@ -636,10 +647,45 @@ private void updateFilterCriteria( assert AssayDbSchema.getInstance().getSchema().getScope().isTransactionActive(); Domain replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); + GWTDomain savedDomain = null; - Set newCriteria = new HashSet<>(); + Set newCriteria = new HashSet<>(); // TODO: Maintain declaration order for (GWTPropertyDescriptor prop : update.getFields()) - newCriteria.addAll(FilterCriteria.fromGWTFilterCriteria(prop.getFilterCriteria(), prop.getPropertyId(), prop.getName(), update.getDomainId(), replicateStatsDomain)); + { + List filterCriteria = prop.getFilterCriteria(); + if (filterCriteria == null || filterCriteria.isEmpty()) + continue; + + int referencePropertyId = prop.getPropertyId(); + if (referencePropertyId == 0) + { + if (savedDomain == null) + savedDomain = getSavedDomain(user, protocol, update); + + for (GWTPropertyDescriptor savedProp : savedDomain.getFields(true)) + { + if (savedProp.getPropertyURI().equals(prop.getPropertyURI())) + { + referencePropertyId = savedProp.getPropertyId(); + break; + } + } + + if (referencePropertyId == 0) + throw new ValidationException(String.format("Failed to resolve \"referencePropertyId\" for field \"%s\"", prop.getName())); + } + + int domainId = update.getDomainId(); + if (domainId == 0) + { + if (savedDomain == null) + savedDomain = getSavedDomain(user, protocol, update); + + domainId = savedDomain.getDomainId(); + } + + newCriteria.addAll(FilterCriteria.fromGWTFilterCriteria(filterCriteria, referencePropertyId, prop.getName(), domainId, replicateStatsDomain)); + } Map keyedCriteria = getFilterCriteriaMap(protocol, getResultsDomain(protocol)); Set oldCriteria = new HashSet<>(keyedCriteria.values()); From 362433ee85ca70317f3690059848f0af517231cd Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 11 Dec 2024 11:46:58 -0800 Subject: [PATCH 16/37] More validation --- .../api/assay/plate/FilterCriteria.java | 9 ++++---- .../src/org/labkey/assay/AssayController.java | 21 +++++++++++++++++-- .../org/labkey/assay/TsvAssayProvider.java | 14 +++++++++---- .../plate/AssayPlateMetadataServiceImpl.java | 16 ++++++++------ 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/api/src/org/labkey/api/assay/plate/FilterCriteria.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java index e56021524b3..e127175afb6 100644 --- a/api/src/org/labkey/api/assay/plate/FilterCriteria.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -58,16 +58,17 @@ public record FilterCriteria( if (replicateStatsDomain != null) { var property = replicateStatsDomain.getPropertyByName(name); - if (property == null) - throw new ValidationException(errorMessage(referencePropertyName, i, String.format("Unable to resolve field from name \"%s\".", name))); - - propertyId = property.getPropertyId(); + if (property != null) + propertyId = property.getPropertyId(); } else if (name.equalsIgnoreCase(referencePropertyName)) { propertyId = referencePropertyId; name = referencePropertyName; } + + if (propertyId == null) + throw new ValidationException(errorMessage(referencePropertyName, i, String.format("Unable to resolve field from name \"%s\".", name))); } else if (propertyId != null && propertyId != referencePropertyId) throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value. Cannot specify criteria against other fields.")); diff --git a/assay/src/org/labkey/assay/AssayController.java b/assay/src/org/labkey/assay/AssayController.java index 4165daee3dc..26c5d83310d 100644 --- a/assay/src/org/labkey/assay/AssayController.java +++ b/assay/src/org/labkey/assay/AssayController.java @@ -173,6 +173,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -1908,6 +1909,8 @@ public void setProtocolId(Integer protocolId) @RequiresPermission(ReadPermission.class) public static class FilterCriteriaColumnsAction extends MutatingApiAction { + private List columnNames; + @Override public void validateForm(FilterCriteriaColumnsForm form, Errors errors) { @@ -1915,14 +1918,28 @@ public void validateForm(FilterCriteriaColumnsForm form, Errors errors) errors.reject(ERROR_REQUIRED, "A valid \"protocolId\" is required."); else if (form.getColumnNames() == null || form.getColumnNames().isEmpty()) errors.reject(ERROR_REQUIRED, "At least one \"columnNames\" must be specified."); - // TODO: Sanitize, validate column names? Need to ensure mapping back to user provided values. + + var columnNameSet = new LinkedHashSet(); + for (String columnName : form.getColumnNames()) + { + var name = StringUtils.trimToNull(columnName); + if (name == null) + { + errors.reject(ERROR_REQUIRED, String.format("A column name of \"%s\" is not supported.", columnName)); + return; + } + + columnNameSet.add(name); + } + + columnNames = new ArrayList<>(columnNameSet); } @Override public Object execute(FilterCriteriaColumnsForm form, BindException errors) throws Exception { if (form.getProtocolId() == null) - return AssayPlateMetadataService.get().previewFilterCriteriaColumns(getContainer(), "FilterCriteriaColumnsAction", form.getColumnNames()); + return AssayPlateMetadataService.get().previewFilterCriteriaColumns(getContainer(), "FilterCriteriaColumnsAction", columnNames); var protocol = ExperimentService.get().getExpProtocol(form.getProtocolId()); if (protocol == null || !protocol.getContainer().hasPermission(getUser(), ReadPermission.class) || AssayService.get().getProvider(protocol) == null) diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 98b645d3cf4..287e38ffd06 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -18,6 +18,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; +import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jmock.Expectations; @@ -88,6 +89,7 @@ import org.labkey.api.study.assay.ThawListResolverType; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; +import org.labkey.api.util.logging.LogHelper; import org.labkey.api.view.HttpView; import org.labkey.api.view.JspView; import org.labkey.assay.plate.query.PlateSchema; @@ -104,6 +106,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -113,6 +116,8 @@ public class TsvAssayProvider extends AbstractTsvAssayProvider { + private static final Logger LOG = LogHelper.getLogger(TsvAssayProvider.class, "General Assay Provider"); + public static final String NAME = "General"; public static final String PLATE_TEMPLATE_PROPERTY_NAME = "PlateTemplate"; public static final String PLATE_TEMPLATE_PROPERTY_CAPTION = "Plate Template"; @@ -579,6 +584,7 @@ public boolean supportsSampleLookupsAsMaterialInputs() while (results.next()) { var propertyId = results.getInt("PropertyId"); + var rowId = results.getInt("RowId"); var property = domain.getProperty(propertyId); @@ -597,7 +603,7 @@ public boolean supportsSampleLookupsAsMaterialInputs() if (property == null) { - // TODO: Log a warning + LOG.warn("Failed to resolve filter criteria property for propertyId ({}). See rowId ({}).", propertyId, rowId); continue; } @@ -610,7 +616,7 @@ public boolean supportsSampleLookupsAsMaterialInputs() results.getInt("DomainId") ); - criteria.put(results.getInt("RowId"), criterion); + criteria.put(rowId, criterion); } } catch (SQLException e) @@ -649,7 +655,7 @@ private void updateFilterCriteria( Domain replicateStatsDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); GWTDomain savedDomain = null; - Set newCriteria = new HashSet<>(); // TODO: Maintain declaration order + Set newCriteria = new LinkedHashSet<>(); for (GWTPropertyDescriptor prop : update.getFields()) { List filterCriteria = prop.getFilterCriteria(); @@ -689,7 +695,7 @@ private void updateFilterCriteria( Map keyedCriteria = getFilterCriteriaMap(protocol, getResultsDomain(protocol)); Set oldCriteria = new HashSet<>(keyedCriteria.values()); - Set toAdd = new HashSet<>(newCriteria); + Set toAdd = new LinkedHashSet<>(newCriteria); Set toRemove = new HashSet<>(); for (var criterion : newCriteria) diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index ce182cb5d13..c4d7fc45d7b 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -863,14 +863,14 @@ public OntologyManager.UpdateableTableImportHelper getImportHelper( return new PlateMetadataImportHelper(data, container, user, run, protocol, provider, context); } - private @NotNull DomainProperty addField(Domain replicateDomain, String fieldName, @Nullable String format) + private @NotNull DomainProperty addField(Domain replicateDomain, String fieldName) { // create the property and copy the format PropertyStorageSpec spec = new PropertyStorageSpec(fieldName, JdbcType.DOUBLE); // Default formatting is 4 decimal places DomainProperty domainProperty = replicateDomain.addProperty(spec); - domainProperty.setFormat(format == null ? "#.####" : format); + domainProperty.setFormat("#.####"); return domainProperty; } @@ -903,8 +903,12 @@ public Map> previewFilterCriteriaColumns(@No var existingFields = getExistingFields(replicateDomain); var columnMap = new HashMap>(); - for (var columnName : columnNames) + for (var rawName : columnNames) { + var columnName = StringUtils.trimToNull(rawName); + if (columnName == null) + continue; + var properties = new ArrayList(); for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(columnName)) @@ -913,7 +917,7 @@ public Map> previewFilterCriteriaColumns(@No if (existingFields.containsKey(name)) dp = existingFields.get(name); else - dp = addField(replicateDomain, name, null); + dp = addField(replicateDomain, name); properties.add(DomainUtil.getPropertyDescriptor(dp)); } @@ -956,7 +960,7 @@ public void updateReplicateStatsDomain( { for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(updateField.getName())) { - addField(replicateDomain, name, null); + addField(replicateDomain, name); domainDirty = true; } } @@ -994,7 +998,7 @@ public void updateReplicateStatsDomain( // something else to numeric measure for (var name : PlateReplicateStatsDomainKind.getStatsFieldNames(updateField.getName())) { - addField(replicateDomain, name, null); + addField(replicateDomain, name); domainDirty = true; } } From 07f53fceb70df8a4fe7f57b756c40e7dd4b3ebcd Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 11 Dec 2024 13:28:39 -0800 Subject: [PATCH 17/37] Add metrics --- assay/src/org/labkey/assay/AssayModule.java | 2 +- .../assay/plate/PlateMetricsProvider.java | 57 ++++++++++--------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/assay/src/org/labkey/assay/AssayModule.java b/assay/src/org/labkey/assay/AssayModule.java index 2d378547c65..ded8dbba4d6 100644 --- a/assay/src/org/labkey/assay/AssayModule.java +++ b/assay/src/org/labkey/assay/AssayModule.java @@ -118,7 +118,7 @@ public String getName() @Override public Double getSchemaVersion() { - return 24.016; + return 24.015; } @Override diff --git a/assay/src/org/labkey/assay/plate/PlateMetricsProvider.java b/assay/src/org/labkey/assay/plate/PlateMetricsProvider.java index ff2427499da..139d332bc39 100644 --- a/assay/src/org/labkey/assay/plate/PlateMetricsProvider.java +++ b/assay/src/org/labkey/assay/plate/PlateMetricsProvider.java @@ -28,10 +28,10 @@ public class PlateMetricsProvider implements UsageMetricsProvider { private SQLFragment plateSetPlatesSQL(TableInfo plateSetTable, TableInfo plateTable) { - return new SQLFragment("SELECT ps.rowId, COUNT(p.rowid) AS plateCount FROM ") + return new SQLFragment("SELECT ps.rowId, COUNT(p.rowId) AS plateCount FROM ") .append(plateSetTable, "ps") .append(" LEFT OUTER JOIN ").append(plateTable, "p") - .append(" ON ps.rowid = p.plateset") + .append(" ON ps.rowId = p.plateSet") .append(" WHERE ps.template = ? AND ps.archived = ?") .append(" GROUP BY ps.rowId") .add(false) @@ -84,7 +84,7 @@ private Long plateTypeCount(DbSchema schema, TableInfo plateTable, TableInfo pla SQLFragment sql = new SQLFragment("SELECT COUNT(*) FROM ") .append(plateTable, "p") .append(" JOIN ").append(plateTypeTable, "pt") - .append(" ON p.platetype = pt.rowid") + .append(" ON p.plateType = pt.rowId") .append(" WHERE pt.columns = ? AND pt.rows = ?") .add(cols) .add(rows); @@ -103,11 +103,11 @@ private List getBiologicsFolders() private List getPlateEnabledAssayProtocols() { AssayProvider provider = AssayService.get().getProvider(TsvAssayProvider.NAME); - if (provider == null) return Collections.emptyList(); - var containers = getBiologicsFolders(); - List allPlateProtocols = new ArrayList<>(); + if (provider == null) + return Collections.emptyList(); - for (Container c : containers) + List allPlateProtocols = new ArrayList<>(); + for (Container c : getBiologicsFolders()) { List plateProtocols = AssayService.get().getAssayProtocols(c).stream().filter(provider::isPlateMetadataEnabled).toList(); allPlateProtocols.addAll(plateProtocols); @@ -182,14 +182,14 @@ public Map getUsageMetrics() TableInfo plateTable = schema.getTableInfoPlate(); Long plateSetCount = plateSetCount(schema.getSchema(), plateSetTable, false); Long archivedPlateSetCount = plateSetCount(schema.getSchema(), plateSetTable, true); - Long primaryPlateSetCount = new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(plateSetTable, "ps").append(" WHERE type =?").add(PlateSetType.primary)).getObject(Long.class); - Long assayPlateSetCount = new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(plateSetTable, "ps").append(" WHERE type =?").add(PlateSetType.assay)).getObject(Long.class); - Long standAlonePlateSetCount = new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(plateSetTable, "ps").append(" WHERE type =?").add(PlateSetType.assay).append(" AND rootplatesetid IS NULL")).getObject(Long.class); + Long primaryPlateSetCount = new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(plateSetTable, "ps").append(" WHERE type = ?").add(PlateSetType.primary)).getObject(Long.class); + Long assayPlateSetCount = new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(plateSetTable, "ps").append(" WHERE type = ?").add(PlateSetType.assay)).getObject(Long.class); + Long standAlonePlateSetCount = new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(plateSetTable, "ps").append(" WHERE type = ?").add(PlateSetType.assay).append(" AND rootPlateSetId IS NULL")).getObject(Long.class); Long plateSetNoPlatesCount = plateSetPlatesCount(schema.getSchema(), plateSetTable, plateTable, 0); Long plateSetOnePlateCount = plateSetPlatesCount(schema.getSchema(), plateSetTable, plateTable, 1); SQLFragment maxPlatesSql = new SQLFragment("SELECT MAX(plateCount) FROM (").append(plateSetPlatesSQL(plateSetTable, plateTable)).append(") x"); Long maxPlatesCount = new SqlSelector(schema.getSchema(), maxPlatesSql).getObject(Long.class); - // too many items to use Map.of() + Map plateSets = new HashMap<>(); plateSets.put("archivedPlateSetCount", archivedPlateSetCount); plateSets.put("plateSetCount", plateSetCount); @@ -211,30 +211,33 @@ public Map getUsageMetrics() TableInfo plateTypeTable = schema.getTableInfoPlateType(); TableInfo wellTable = schema.getTableInfoWell(); plateMetrics.put("plates", Map.of( - "platesCount", platesCount, - "archivedPlatesCount", archivedPlatesCount, - "plateTemplateCount", plateTemplateCount, - "archivedTemplatesCount", archivedPlateTemplates, - "distinctPlatedSamples", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM (SELECT DISTINCT sampleId FROM ").append(wellTable, "w").append(" WHERE sampleId IS NOT NULL) as ds")).getObject(Long.class), - "12WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 4, 3), - "24WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 6, 4), - "48WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 8, 6), - "96WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 12, 8), - "384WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 24, 16) + "platesCount", platesCount, + "archivedPlatesCount", archivedPlatesCount, + "plateTemplateCount", plateTemplateCount, + "archivedTemplatesCount", archivedPlateTemplates, + "distinctPlatedSamples", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM (SELECT DISTINCT sampleId FROM ").append(wellTable, "w").append(" WHERE sampleId IS NOT NULL) as ds")).getObject(Long.class), + "12WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 4, 3), + "24WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 6, 4), + "48WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 8, 6), + "96WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 12, 8), + "384WellCount", plateTypeCount(schema.getSchema(), plateTable, plateTypeTable, 24, 16) )); TableInfo hitTable = schema.getTableInfoHit(); + TableInfo filterCriteriaTable = schema.getTableInfoFilterCriteria(); List plateEnabledProtocols = getPlateEnabledAssayProtocols(); plateMetrics.put("assays", Map.of( - "hitCount", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(hitTable, "h")).getObject(Long.class), - "plateSetsWithHits", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(DISTINCT platesetpath) FROM ").append(hitTable, "h")).getObject(Long.class), - "assaysWithPlateMetadataEnabled", plateEnabledProtocols.size(), - "assayRunsCount", getPlateBasedAssayRunsCount(plateEnabledProtocols), - "assayResultsCount", getPlateBasedAssayResultsCount(plateEnabledProtocols) + "hitCount", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(*) FROM ").append(hitTable, "h")).getObject(Long.class), + "plateSetsWithHits", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(DISTINCT plateSetPath) FROM ").append(hitTable, "h")).getObject(Long.class), + "assaysWithPlateMetadataEnabled", plateEnabledProtocols.size(), + "assayRunsCount", getPlateBasedAssayRunsCount(plateEnabledProtocols), + "assayResultsCount", getPlateBasedAssayResultsCount(plateEnabledProtocols), + "domainsWithFilterCriteriaConfigured", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(DISTINCT domainId) FROM ").append(filterCriteriaTable, "fc")).getObject(Long.class), + "columnsWithFilterCriteria", new SqlSelector(schema.getSchema(), new SQLFragment("SELECT COUNT(DISTINCT propertyId) FROM ").append(filterCriteriaTable, "fc")).getObject(Long.class) )); plateMetrics.put("metadata", Map.of( - "fieldsCount", getMetadataFieldsCount() + "fieldsCount", getMetadataFieldsCount() )); return Map.of("plates", plateMetrics); From abf804197495ff7f80c063a3d47b537522a3b924 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 11 Dec 2024 16:21:45 -0800 Subject: [PATCH 18/37] Be more permissive --- .../api/assay/plate/FilterCriteria.java | 54 +++++++++++++------ .../plate/AssayPlateMetadataServiceImpl.java | 11 +++- 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/api/src/org/labkey/api/assay/plate/FilterCriteria.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java index e127175afb6..f9b4e2d4387 100644 --- a/api/src/org/labkey/api/assay/plate/FilterCriteria.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -45,33 +45,53 @@ public record FilterCriteria( for (int i = 0; i < filterCriteria.size(); i++) { var criterion = filterCriteria.get(i); - Integer propertyId = criterion.getPropertyId(); + var propertyId = criterion.getPropertyId(); - if (propertyId != null && propertyId <= 0) - throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value.")); + if (propertyId != null) + { + if (propertyId == 0) + throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value.")); + else if (propertyId < 0) + propertyId = null; + } String name = StringUtils.trimToNull(criterion.getName()); - // Attempt to resolve the field by name - if (propertyId == null && name != null) + if (propertyId == null) { - if (replicateStatsDomain != null) + // Attempt to resolve the field by name + if (name != null) { - var property = replicateStatsDomain.getPropertyByName(name); - if (property != null) - propertyId = property.getPropertyId(); + if (replicateStatsDomain != null) + { + var property = replicateStatsDomain.getPropertyByName(name); + if (property != null) + { + propertyId = property.getPropertyId(); + name = property.getName(); + } + } + else if (name.equalsIgnoreCase(referencePropertyName)) + { + propertyId = referencePropertyId; + name = referencePropertyName; + } + + if (propertyId == null) + throw new ValidationException(errorMessage(referencePropertyName, i, String.format("Unable to resolve field from name \"%s\".", name))); } - else if (name.equalsIgnoreCase(referencePropertyName)) - { - propertyId = referencePropertyId; + } + else + { + if (propertyId == referencePropertyId) name = referencePropertyName; + else if (replicateStatsDomain != null) + { + var property = replicateStatsDomain.getProperty(propertyId); + if (property == null) + throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value. Cannot specify criteria against other fields.")); } - - if (propertyId == null) - throw new ValidationException(errorMessage(referencePropertyName, i, String.format("Unable to resolve field from name \"%s\".", name))); } - else if (propertyId != null && propertyId != referencePropertyId) - throw new ValidationException(errorMessage(referencePropertyName, i, "Invalid \"propertyId\" value. Cannot specify criteria against other fields.")); if (propertyId == null) { diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index c4d7fc45d7b..89146978d7e 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -1344,7 +1344,7 @@ public void applyHitSelectionCriteria( var url = new ActionURL(); var replicateDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(protocol); - for (var criteria : filterCriteria) // TODO: Need to validate filterCriteria compare types coming in + for (var criteria : filterCriteria) { var domainProperty = domain.getProperty(criteria.propertyId()); boolean isReplicateProperty = false; @@ -1367,7 +1367,7 @@ public void applyHitSelectionCriteria( else fieldKey = FieldKey.fromParts(domainProperty.getName()); - CompareType ct = CompareType.getByURLKey(criteria.operation()); + var ct = CompareType.getByURLKey(criteria.operation()); if (ct == null) { LOG.error("Automatic hit selection failed. Unable to resolve filter comparison type from operation \"{}\".", criteria.operation()); @@ -1380,6 +1380,13 @@ public void applyHitSelectionCriteria( // The referenced plate well must have a sample value var filter = new SimpleFilter(FieldKey.fromParts("Well", "SampleId"), null, CompareType.NONBLANK); + // TODO: Filter out rows that are excluded and filter not in AssayResultDomainKind.STATE_COLUMN_NAME +// var states = PlateDataStateManager.get().getStates(container); +// for (var state : states) +// { +// if (PlateDataStateManager.get().isOperationPermitted(state, hitSelection)); +// } + // Applying filters via ActionURL allows for automatic type coercion of the filter value filter.addUrlFilters(url, null); From 3b0cc9dd7f27ad23ee055affc9a08d24ae0d15ac Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 11 Dec 2024 16:37:07 -0800 Subject: [PATCH 19/37] Rebump --- assay/src/org/labkey/assay/AssayModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assay/src/org/labkey/assay/AssayModule.java b/assay/src/org/labkey/assay/AssayModule.java index ded8dbba4d6..2d378547c65 100644 --- a/assay/src/org/labkey/assay/AssayModule.java +++ b/assay/src/org/labkey/assay/AssayModule.java @@ -118,7 +118,7 @@ public String getName() @Override public Double getSchemaVersion() { - return 24.015; + return 24.016; } @Override From 734d186cd76240f39067b25d284b9be78f3a520a Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 11 Dec 2024 16:55:45 -0800 Subject: [PATCH 20/37] Excluded rows --- .../plate/AssayPlateMetadataServiceImpl.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java index 89146978d7e..bb3b3089b96 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateMetadataServiceImpl.java @@ -1380,12 +1380,18 @@ public void applyHitSelectionCriteria( // The referenced plate well must have a sample value var filter = new SimpleFilter(FieldKey.fromParts("Well", "SampleId"), null, CompareType.NONBLANK); - // TODO: Filter out rows that are excluded and filter not in AssayResultDomainKind.STATE_COLUMN_NAME -// var states = PlateDataStateManager.get().getStates(container); -// for (var state : states) -// { -// if (PlateDataStateManager.get().isOperationPermitted(state, hitSelection)); -// } + // Filter out result rows that are excluded + { + PlateDataStateManager stateManager = PlateDataStateManager.get(); + var exclusionStateRowIds = stateManager.getStates(container) + .stream() + .filter(state -> !stateManager.isOperationPermitted(state, PlateDataStateManager.DataOperation.hitSelection)) + .map(DataState::getRowId) + .toList(); + + if (!exclusionStateRowIds.isEmpty()) + filter.addCondition(table.getColumn(AssayResultDomainKind.STATE_COLUMN_NAME), exclusionStateRowIds, CompareType.NOT_IN); + } // Applying filters via ActionURL allows for automatic type coercion of the filter value filter.addUrlFilters(url, null); From 55339de8978ce8a23dac2a43c17f8172c3d21e8b Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Thu, 12 Dec 2024 13:45:46 -0800 Subject: [PATCH 21/37] Add "Hit Selection Criteria" column for plate-based assay runs --- .../plate/AssayPlateMetadataService.java | 1 + api/src/org/labkey/api/data/CompareType.java | 6 +- api/src/org/labkey/api/data/SimpleFilter.java | 8 +- .../labkey/api/assay/AssayRunDomainKind.java | 5 +- .../postgresql/assay-24.015-24.016.sql | 2 + .../sqlserver/assay-24.015-24.016.sql | 2 + .../org/labkey/assay/AssayUpgradeCode.java | 43 +++++++++ .../org/labkey/assay/TsvAssayProvider.java | 9 ++ .../plate/AssayPlateMetadataServiceImpl.java | 87 ++++++++++++++----- .../experiment/api/data/LineageClause.java | 2 +- .../org/labkey/query/QueryServiceImpl.java | 2 +- 11 files changed, 134 insertions(+), 33 deletions(-) diff --git a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java index d35aa0fea66..535e53a2d66 100644 --- a/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java +++ b/api/src/org/labkey/api/assay/plate/AssayPlateMetadataService.java @@ -29,6 +29,7 @@ public interface AssayPlateMetadataService { String PLATE_SET_COLUMN_NAME = "PlateSet"; + String HIT_SELECTION_CRITERIA_COLUMN_NAME = "HitSelectionCriteria"; static void setInstance(AssayPlateMetadataService serviceImpl) { diff --git a/api/src/org/labkey/api/data/CompareType.java b/api/src/org/labkey/api/data/CompareType.java index 11568942838..1b0187eeac8 100644 --- a/api/src/org/labkey/api/data/CompareType.java +++ b/api/src/org/labkey/api/data/CompareType.java @@ -818,7 +818,7 @@ private static class QClause extends CompareType.CompareClause } @Override - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { sb.append("Search for \""); sb.append(getParamVals()[0]); @@ -1667,7 +1667,7 @@ String toWhereClause(SqlDialect dialect, String alias) } @Override - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { sb.append("DATE("); appendColumnName(sb, formatter); @@ -2229,7 +2229,7 @@ public String getLabKeySQLWhereClause(Map column } @Override - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { // Try to resolve the parameter value to a Group or User object diff --git a/api/src/org/labkey/api/data/SimpleFilter.java b/api/src/org/labkey/api/data/SimpleFilter.java index 4d8f27febfa..5a2112d0354 100644 --- a/api/src/org/labkey/api/data/SimpleFilter.java +++ b/api/src/org/labkey/api/data/SimpleFilter.java @@ -163,7 +163,7 @@ public Object[] getParamVals() return _paramVals; } - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { int fromIndex = appendFilterValueText(sb, formatter); replaceParamValues(sb, fromIndex); @@ -458,7 +458,7 @@ public String getLabKeySQLWhereClause(Map column } @Override - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { String sep = ""; for (FilterClause clause : _clauses) @@ -661,7 +661,7 @@ public InClause(FieldKey fieldKey, String namedSet, boolean urlClause) } @Override - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { sb.append(formatter.format(getFieldKey())); @@ -848,7 +848,7 @@ public ContainsOneOfClause(FieldKey fieldKey, Collection params, boolean urlC } @Override - protected void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, ColumnNameFormatter formatter) { sb.append(formatter.format(getFieldKey())); sb.append(" ").append(isNegated() ? "DOES NOT CONTAIN ANY OF " : "CONTAINS ONE OF "); diff --git a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java index 00a6fa11a5f..1af89502bda 100644 --- a/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayRunDomainKind.java @@ -24,10 +24,6 @@ import java.util.Set; -/** - * User: jeckels - * Date: Jan 27, 2012 - */ public class AssayRunDomainKind extends AssayDomainKind { public AssayRunDomainKind() @@ -69,6 +65,7 @@ public Set getMandatoryPropertyNames(Domain domain) if (provider.isPlateMetadataEnabled(protocol)) { mandatoryNames.add(AssayPlateMetadataService.PLATE_SET_COLUMN_NAME); + mandatoryNames.add(AssayPlateMetadataService.HIT_SELECTION_CRITERIA_COLUMN_NAME); } } } diff --git a/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql b/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql index 0659b6607eb..fa1a4ccd8a3 100644 --- a/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql +++ b/assay/resources/schemas/dbscripts/postgresql/assay-24.015-24.016.sql @@ -12,3 +12,5 @@ CREATE TABLE assay.FilterCriteria CONSTRAINT FK_FilterCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, CONSTRAINT FK_FilterCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE ); + +SELECT core.executeJavaUpgradeCode('initializeHitSelectionCriteria'); diff --git a/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql index b693bc2cf2e..74837546678 100644 --- a/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql +++ b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql @@ -16,3 +16,5 @@ CREATE TABLE assay.FilterCriteria CONSTRAINT FK_FilterCriteria_PropertyDescriptor FOREIGN KEY (PropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, CONSTRAINT FK_FilterCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE NO ACTION, ); + +EXEC core.executeJavaUpgradeCode 'initializeHitSelectionCriteria'; diff --git a/assay/src/org/labkey/assay/AssayUpgradeCode.java b/assay/src/org/labkey/assay/AssayUpgradeCode.java index bc360e2102a..b0a7cd716ad 100644 --- a/assay/src/org/labkey/assay/AssayUpgradeCode.java +++ b/assay/src/org/labkey/assay/AssayUpgradeCode.java @@ -74,6 +74,7 @@ import java.util.Map; import java.util.Set; +import static org.labkey.api.assay.plate.AssayPlateMetadataService.HIT_SELECTION_CRITERIA_COLUMN_NAME; import static org.labkey.api.data.Table.CREATED_BY_COLUMN_NAME; import static org.labkey.api.data.Table.CREATED_COLUMN_NAME; import static org.labkey.api.data.Table.MODIFIED_BY_COLUMN_NAME; @@ -848,4 +849,46 @@ public static void initializeWellExclusions(ModuleContext ctx) throws Exception tx.commit(); } } + + /** + * Called from assay-24.015-24.016.sql, in order to support hit selection criteria for plate enabled assays. + * The upgrade creates the run domain hit selection criteria field. + */ + @DeferredUpgrade + public static void initializeHitSelectionCriteria(ModuleContext ctx) throws Exception + { + if (ctx.isNewInstall()) + return; + + try (DbScope.Transaction tx = AssayDbSchema.getInstance().getSchema().getScope().ensureTransaction()) + { + Set protocols = new HashSet<>(); + for (Container container : ContainerManager.getAllChildren(ContainerManager.getRoot())) + { + if (isBiologicsFolder(container)) + protocols.addAll(AssayService.get().getAssayProtocols(container)); + } + + for (ExpProtocol protocol : protocols) + { + AssayProvider provider = AssayService.get().getProvider(protocol); + if (provider != null && provider.isPlateMetadataEnabled(protocol)) + { + // ensure the QC state column exists in the result domain + Domain runDomain = provider.getRunDomain(protocol); + if (runDomain != null && runDomain.getPropertyByName(HIT_SELECTION_CRITERIA_COLUMN_NAME) == null) + { + _log.info("Adding the \"{}\" field to the run domain for assay : {}", HIT_SELECTION_CRITERIA_COLUMN_NAME, protocol.getName()); + DomainProperty dp = runDomain.addProperty(new PropertyStorageSpec(HIT_SELECTION_CRITERIA_COLUMN_NAME, JdbcType.VARCHAR)); + dp.setShownInInsertView(false); + dp.setShownInUpdateView(false); + + runDomain.save(User.getAdminServiceUser()); + } + } + } + + tx.commit(); + } + } } diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 287e38ffd06..70f5b68512a 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -438,6 +438,15 @@ public void beforeDomainChange(User user, ExpProtocol protocol, GWTDomain !stateManager.isOperationPermitted(state, PlateDataStateManager.DataOperation.hitSelection)) - .map(DataState::getRowId) - .toList(); - - if (!exclusionStateRowIds.isEmpty()) - filter.addCondition(table.getColumn(AssayResultDomainKind.STATE_COLUMN_NAME), exclusionStateRowIds, CompareType.NOT_IN); - } + var filter = new SimpleFilter(); // Applying filters via ActionURL allows for automatic type coercion of the filter value filter.addUrlFilters(url, null); - var selector = new TableSelector(table, Collections.singleton(table.getColumn(FieldKey.fromParts("RowId"))), filter, null); - var matchingResults = selector.getArrayList(Integer.class); + // Generate the description for the applied filter criteria prior to incorporating additional clauses + var criteriaDescription = generateFilterCriteriaDescription(filter); + + // The referenced plate well must have a sample value + filter.addCondition(FieldKey.fromParts("Well", "SampleId"), null, CompareType.NONBLANK); + + // Filter out result rows that are excluded + filterOutExcludedRows(container, table, filter); // Remove previous hits against the runs that have been modified PlateManager.get().deleteHitsForRuns(runIds); - if (matchingResults.isEmpty()) - return; + var matchingResults = new TableSelector(table, Collections.singleton(table.getColumn(FieldKey.fromParts("RowId"))), filter, null).getArrayList(Integer.class); try { - PlateManager.get().markHits(container, user, protocol.getRowId(), true, matchingResults, null); + if (!matchingResults.isEmpty()) + PlateManager.get().markHits(container, user, protocol.getRowId(), true, matchingResults, null); } catch (SQLException e) { throw new RuntimeSQLException(e); } + + var runDomain = provider.getRunDomain(protocol); + if (runDomain != null) + { + var property = runDomain.getPropertyByName(HIT_SELECTION_CRITERIA_COLUMN_NAME); + if (property != null) + { + var pd = property.getPropertyDescriptor(); + for (var run : ExperimentService.get().getExpRuns(runIds)) + { + var value = run.getProperty(pd); + if (!criteriaDescription.equals(value)) + run.setProperty(user, pd, criteriaDescription); + } + } + } + } + + private static void filterOutExcludedRows(Container container, TableInfo table, SimpleFilter filter) + { + PlateDataStateManager stateManager = PlateDataStateManager.get(); + var exclusionStateRowIds = stateManager.getStates(container) + .stream() + .filter(state -> !stateManager.isOperationPermitted(state, PlateDataStateManager.DataOperation.hitSelection)) + .map(DataState::getRowId) + .toList(); + + if (!exclusionStateRowIds.isEmpty()) + filter.addCondition(table.getColumn(AssayResultDomainKind.STATE_COLUMN_NAME), exclusionStateRowIds, CompareType.NOT_IN); + } + + private static String generateFilterCriteriaDescription(SimpleFilter filter) + { + var formatter = new SimpleFilter.ColumnNameFormatter() + { + @Override + public String format(FieldKey fieldKey) + { + var formatted = super.format(fieldKey); + var dotIndex = formatted.lastIndexOf('.'); + if (dotIndex >= 0) + formatted = formatted.substring(dotIndex + 1); + return formatted; + } + }; + + var parts = new ArrayList(); + for (var clause : filter.getClauses()) + { + var sub = new StringBuilder(); + clause.appendFilterText(sub, formatter); + parts.add(sub.toString()); + } + + return StringUtils.join(parts, " and "); } private static class PlateMetadataImportHelper extends SimpleAssayDataImportHelper diff --git a/experiment/src/org/labkey/experiment/api/data/LineageClause.java b/experiment/src/org/labkey/experiment/api/data/LineageClause.java index 737a09bf4f0..19721739484 100644 --- a/experiment/src/org/labkey/experiment/api/data/LineageClause.java +++ b/experiment/src/org/labkey/experiment/api/data/LineageClause.java @@ -116,7 +116,7 @@ protected String filterTextType() } @Override - protected void appendFilterText(StringBuilder sb, SimpleFilter.ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, SimpleFilter.ColumnNameFormatter formatter) { ExpRunItem start = getStart(); if (start == null) diff --git a/query/src/org/labkey/query/QueryServiceImpl.java b/query/src/org/labkey/query/QueryServiceImpl.java index de86a59fd3e..e0366cdb327 100644 --- a/query/src/org/labkey/query/QueryServiceImpl.java +++ b/query/src/org/labkey/query/QueryServiceImpl.java @@ -489,7 +489,7 @@ private static class WhereClause extends QueryCompareClause } @Override - protected void appendFilterText(StringBuilder sb, SimpleFilter.ColumnNameFormatter formatter) + public void appendFilterText(StringBuilder sb, SimpleFilter.ColumnNameFormatter formatter) { sb.append(getParamVals()[0]); } From e2a5eba457979e7e57ff1302955271794231d59a Mon Sep 17 00:00:00 2001 From: alanv Date: Mon, 16 Dec 2024 14:29:58 -0600 Subject: [PATCH 22/37] Bump components --- assay/package-lock.json | 16 ++++++++-------- assay/package.json | 2 +- core/package-lock.json | 16 ++++++++-------- core/package.json | 2 +- experiment/package-lock.json | 16 ++++++++-------- experiment/package.json | 2 +- pipeline/package-lock.json | 16 ++++++++-------- pipeline/package.json | 2 +- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index e803ee908ac..590b960a972 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2211,9 +2211,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0.tgz", - "integrity": "sha512-cWQd1Umwkg7H/KLWpQ0I3p7GfLHw8kwFVAAtJZDeaykd21lyIypyOgQq+gLvmQJTAi9vRP4eaJ85L+b4o4x9Gw==" + "version": "1.36.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", + "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2252,12 +2252,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", - "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", + "version": "6.5.3-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", + "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0", + "@labkey/api": "1.36.0-fb-auto-hits.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/assay/package.json b/assay/package.json index 0873015557c..fc018adc612 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 246f3d9821b..6eab0a6c554 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1", + "@labkey/components": "6.5.3-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3017,9 +3017,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0.tgz", - "integrity": "sha512-cWQd1Umwkg7H/KLWpQ0I3p7GfLHw8kwFVAAtJZDeaykd21lyIypyOgQq+gLvmQJTAi9vRP4eaJ85L+b4o4x9Gw==" + "version": "1.36.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", + "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -3058,12 +3058,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", - "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", + "version": "6.5.3-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", + "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0", + "@labkey/api": "1.36.0-fb-auto-hits.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/core/package.json b/core/package.json index ce2ce0ff86b..a24fef61bec 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1", + "@labkey/components": "6.5.3-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 37b4ac545a7..ff5b494bc8d 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2823,9 +2823,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0.tgz", - "integrity": "sha512-cWQd1Umwkg7H/KLWpQ0I3p7GfLHw8kwFVAAtJZDeaykd21lyIypyOgQq+gLvmQJTAi9vRP4eaJ85L+b4o4x9Gw==" + "version": "1.36.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", + "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2864,12 +2864,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", - "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", + "version": "6.5.3-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", + "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0", + "@labkey/api": "1.36.0-fb-auto-hits.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/experiment/package.json b/experiment/package.json index 876cccfa784..64931cf0661 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 4255c7f9d73..ead04ea0096 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2387,9 +2387,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0.tgz", - "integrity": "sha512-cWQd1Umwkg7H/KLWpQ0I3p7GfLHw8kwFVAAtJZDeaykd21lyIypyOgQq+gLvmQJTAi9vRP4eaJ85L+b4o4x9Gw==" + "version": "1.36.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", + "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2428,12 +2428,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.4.1-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.4.1-fb-auto-hits.1.tgz", - "integrity": "sha512-Q3H2qiweKNgeyosaorspcV7Bcwb7UI9n4n7Nc6HytlLoqP2YMOqGaONKARjpIZfIwUJmNWClSxfunWA5FyBqhw==", + "version": "6.5.3-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", + "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0", + "@labkey/api": "1.36.0-fb-auto-hits.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/pipeline/package.json b/pipeline/package.json index a00e3a12246..91c923cc865 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.4.1-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", From d2e5bf8fc36d67090dd2715e84e549ea3c8e73b9 Mon Sep 17 00:00:00 2001 From: alanv Date: Mon, 16 Dec 2024 16:32:28 -0600 Subject: [PATCH 23/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 590b960a972..9df065bb3f3 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0" + "@labkey/components": "6.5.3-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", - "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", + "version": "6.5.3-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", + "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/assay/package.json b/assay/package.json index fc018adc612..e6be6c49641 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0" + "@labkey/components": "6.5.3-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 6eab0a6c554..3682e57cdc5 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0", + "@labkey/components": "6.5.3-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", - "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", + "version": "6.5.3-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", + "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/core/package.json b/core/package.json index a24fef61bec..9cce817dfe7 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0", + "@labkey/components": "6.5.3-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index ff5b494bc8d..1e83e072c08 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0" + "@labkey/components": "6.5.3-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", - "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", + "version": "6.5.3-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", + "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/experiment/package.json b/experiment/package.json index 64931cf0661..8cc127f03c9 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0" + "@labkey/components": "6.5.3-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index ead04ea0096..72596e4c213 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0" + "@labkey/components": "6.5.3-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.0.tgz", - "integrity": "sha512-2n1kiP7EiDZDnx4G9jw4lLgQZgaeShEQ03ZBDxmGTjPYwEF3KPyalSlL68LriXDsh/MXTCYiyTYQOtgi/f6Z5g==", + "version": "6.5.3-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", + "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/pipeline/package.json b/pipeline/package.json index 91c923cc865..19f799d1d3d 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.0" + "@labkey/components": "6.5.3-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", From c983ca3fb032543ed9e3ab22481364928ac5eddd Mon Sep 17 00:00:00 2001 From: alanv Date: Mon, 16 Dec 2024 17:30:20 -0600 Subject: [PATCH 24/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 9df065bb3f3..5b61de8a5a1 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", - "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", + "version": "6.5.3-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", + "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/assay/package.json b/assay/package.json index e6be6c49641..299acffa91f 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 3682e57cdc5..8b4dd370d97 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1", + "@labkey/components": "6.5.3-fb-auto-hits.2", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", - "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", + "version": "6.5.3-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", + "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/core/package.json b/core/package.json index 9cce817dfe7..1ce3f574696 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1", + "@labkey/components": "6.5.3-fb-auto-hits.2", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 1e83e072c08..746ce3c312a 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", - "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", + "version": "6.5.3-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", + "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/experiment/package.json b/experiment/package.json index 8cc127f03c9..5e964996853 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 72596e4c213..5454479600c 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.1.tgz", - "integrity": "sha512-14mNpav000UJjvNC7b+L0LXHXsAfVy3sDOAWVF3hFCTt5i8j+42SYSgJ4ea/AJadKsupTmMqrUHm5cQNPNgcXA==", + "version": "6.5.3-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", + "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/pipeline/package.json b/pipeline/package.json index 19f799d1d3d..c1a01510137 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.1" + "@labkey/components": "6.5.3-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", From cb356dda4c1a05a84fe8fa76c6a5c5ba03f7f5ca Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 17 Dec 2024 14:44:38 -0600 Subject: [PATCH 25/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 5b61de8a5a1..6a540e4b908 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2" + "@labkey/components": "6.6.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", - "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", + "version": "6.6.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", + "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/assay/package.json b/assay/package.json index 299acffa91f..89587cc327e 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2" + "@labkey/components": "6.6.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 8b4dd370d97..fdaab55753d 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2", + "@labkey/components": "6.6.0-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", - "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", + "version": "6.6.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", + "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/core/package.json b/core/package.json index 1ce3f574696..fd688730b54 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2", + "@labkey/components": "6.6.0-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 746ce3c312a..d5c9cf9e481 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2" + "@labkey/components": "6.6.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", - "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", + "version": "6.6.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", + "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/experiment/package.json b/experiment/package.json index 5e964996853..fca6222e683 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2" + "@labkey/components": "6.6.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 5454479600c..d5e345e6cbf 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2" + "@labkey/components": "6.6.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.5.3-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.5.3-fb-auto-hits.2.tgz", - "integrity": "sha512-tKeX/r6ByxEolZzckqJ8E65VaSmrKwZgCSokfYCZ5lRf8S7zp2bAFQfKExqDtLmzq4nIzaMzo6Zd8ux6GNjW+w==", + "version": "6.6.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", + "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/pipeline/package.json b/pipeline/package.json index c1a01510137..9abc1c3602d 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.5.3-fb-auto-hits.2" + "@labkey/components": "6.6.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", From 7cf3d48f9c2291199737c39d4e40253c26fb0244 Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 17 Dec 2024 14:00:15 -0800 Subject: [PATCH 26/37] Negative propertyId, check name against self first --- .../org/labkey/api/assay/plate/FilterCriteria.java | 12 ++++++------ assay/src/org/labkey/assay/TsvAssayProvider.java | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api/src/org/labkey/api/assay/plate/FilterCriteria.java b/api/src/org/labkey/api/assay/plate/FilterCriteria.java index f9b4e2d4387..686c882bcac 100644 --- a/api/src/org/labkey/api/assay/plate/FilterCriteria.java +++ b/api/src/org/labkey/api/assay/plate/FilterCriteria.java @@ -62,7 +62,12 @@ else if (propertyId < 0) // Attempt to resolve the field by name if (name != null) { - if (replicateStatsDomain != null) + if (name.equalsIgnoreCase(referencePropertyName)) + { + propertyId = referencePropertyId; + name = referencePropertyName; + } + else if (replicateStatsDomain != null) { var property = replicateStatsDomain.getPropertyByName(name); if (property != null) @@ -71,11 +76,6 @@ else if (propertyId < 0) name = property.getName(); } } - else if (name.equalsIgnoreCase(referencePropertyName)) - { - propertyId = referencePropertyId; - name = referencePropertyName; - } if (propertyId == null) throw new ValidationException(errorMessage(referencePropertyName, i, String.format("Unable to resolve field from name \"%s\".", name))); diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 70f5b68512a..41b633b19f5 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -672,7 +672,7 @@ private void updateFilterCriteria( continue; int referencePropertyId = prop.getPropertyId(); - if (referencePropertyId == 0) + if (referencePropertyId <= 0) { if (savedDomain == null) savedDomain = getSavedDomain(user, protocol, update); @@ -686,7 +686,7 @@ private void updateFilterCriteria( } } - if (referencePropertyId == 0) + if (referencePropertyId <= 0) throw new ValidationException(String.format("Failed to resolve \"referencePropertyId\" for field \"%s\"", prop.getName())); } From 2091df7da1c86f9a5a4d93707c4b51ab83184047 Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 17 Dec 2024 19:19:17 -0600 Subject: [PATCH 27/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 6a540e4b908..62ce4aba8fe 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0" + "@labkey/components": "6.6.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", - "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", + "version": "6.6.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", + "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/assay/package.json b/assay/package.json index 89587cc327e..e4ae471b92d 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0" + "@labkey/components": "6.6.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index fdaab55753d..999810ebb59 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0", + "@labkey/components": "6.6.0-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", - "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", + "version": "6.6.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", + "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/core/package.json b/core/package.json index fd688730b54..38f05ea0af5 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0", + "@labkey/components": "6.6.0-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index d5c9cf9e481..e21e97e0ea1 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0" + "@labkey/components": "6.6.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", - "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", + "version": "6.6.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", + "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/experiment/package.json b/experiment/package.json index fca6222e683..337662acc4e 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0" + "@labkey/components": "6.6.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index d5e345e6cbf..9362ab63c11 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0" + "@labkey/components": "6.6.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.0.tgz", - "integrity": "sha512-IEJ62Je9cROzLWCPtAwoQ5hwynaktIDZ0bJlz87tPJlyW0f2JejMnocjX+lz9MQUJQNYUYx8xBa/pR+teX4wuQ==", + "version": "6.6.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", + "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/pipeline/package.json b/pipeline/package.json index 9abc1c3602d..39c03bd6d33 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.0" + "@labkey/components": "6.6.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", From 6c16e90a6e234968cd17c5f151683458e57c01bf Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Tue, 17 Dec 2024 17:21:02 -0800 Subject: [PATCH 28/37] Code review feedback --- .../api/assay/AssayResultDomainKind.java | 30 +++++--- .../org/labkey/assay/AssayUpgradeCode.java | 6 +- .../org/labkey/assay/TSVProtocolSchema.java | 8 +- .../org/labkey/assay/TsvAssayProvider.java | 22 +++--- .../plate/AssayPlateMetadataServiceImpl.java | 74 +++++++++---------- .../assay/plate/AssayPlateTriggerFactory.java | 6 +- 6 files changed, 77 insertions(+), 69 deletions(-) diff --git a/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java b/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java index 3c351a4bd2a..d7f864bad44 100644 --- a/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java +++ b/assay/api-src/org/labkey/api/assay/AssayResultDomainKind.java @@ -26,6 +26,7 @@ import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.api.ExpProtocol; import org.labkey.api.exp.property.Domain; +import org.labkey.api.query.FieldKey; import org.labkey.api.security.User; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; @@ -41,11 +42,20 @@ public class AssayResultDomainKind extends AssayDomainKind { - public static final String PLATE_COLUMN_NAME = "Plate"; - public static final String WELL_LOCATION_COLUMN_NAME = "WellLocation"; - public static final String WELL_LSID_COLUMN_NAME = "WellLsid"; - public static final String REPLICATE_LSID_COLUMN_NAME = "ReplicateLsid"; - public static final String STATE_COLUMN_NAME = "State"; + public enum Column + { + Plate, + Replicate, + ReplicateLsid, + State, + WellLocation, + WellLsid; + + public FieldKey fieldKey() + { + return FieldKey.fromParts(name()); + } + } public AssayResultDomainKind() { @@ -137,11 +147,11 @@ public Set getMandatoryPropertyNames(Domain domain) { if (provider.isPlateMetadataEnabled(protocol)) { - mandatoryNames.add(PLATE_COLUMN_NAME); - mandatoryNames.add(WELL_LOCATION_COLUMN_NAME); - mandatoryNames.add(WELL_LSID_COLUMN_NAME); - mandatoryNames.add(REPLICATE_LSID_COLUMN_NAME); - mandatoryNames.add(STATE_COLUMN_NAME); + mandatoryNames.add(Column.Plate.name()); + mandatoryNames.add(Column.WellLocation.name()); + mandatoryNames.add(Column.WellLsid.name()); + mandatoryNames.add(Column.ReplicateLsid.name()); + mandatoryNames.add(Column.State.name()); } } } diff --git a/assay/src/org/labkey/assay/AssayUpgradeCode.java b/assay/src/org/labkey/assay/AssayUpgradeCode.java index b0a7cd716ad..62fed385ea1 100644 --- a/assay/src/org/labkey/assay/AssayUpgradeCode.java +++ b/assay/src/org/labkey/assay/AssayUpgradeCode.java @@ -831,10 +831,10 @@ public static void initializeWellExclusions(ModuleContext ctx) throws Exception { // ensure the QC state column exists in the result domain Domain resultDomain = provider.getResultsDomain(protocol); - if (resultDomain.getPropertyByName(AssayResultDomainKind.STATE_COLUMN_NAME) == null) + if (resultDomain.getPropertyByName(AssayResultDomainKind.Column.State.name()) == null) { - _log.info(String.format("Adding the %s field to the results domain for assay : %s", AssayResultDomainKind.STATE_COLUMN_NAME, protocol.getName())); - DomainProperty dp = resultDomain.addProperty(new PropertyStorageSpec(AssayResultDomainKind.STATE_COLUMN_NAME, JdbcType.INTEGER)); + _log.info(String.format("Adding the %s field to the results domain for assay : %s", AssayResultDomainKind.Column.State.name(), protocol.getName())); + DomainProperty dp = resultDomain.addProperty(new PropertyStorageSpec(AssayResultDomainKind.Column.State.name(), JdbcType.INTEGER)); dp.setLabel("QC State"); dp.setImportAliasSet(Set.of("QCState", "QC State")); dp.setLookup(new Lookup(null, SchemaKey.fromParts(CoreSchema.getInstance().getSchemaName()), CoreSchema.DATA_STATES_TABLE_NAME)); diff --git a/assay/src/org/labkey/assay/TSVProtocolSchema.java b/assay/src/org/labkey/assay/TSVProtocolSchema.java index fc1ff8a2790..096414d2270 100644 --- a/assay/src/org/labkey/assay/TSVProtocolSchema.java +++ b/assay/src/org/labkey/assay/TSVProtocolSchema.java @@ -157,7 +157,7 @@ private class _AssayResultTable extends AssayResultTable addTriggerFactory(new AssayPlateTriggerFactory(getProvider(), getProtocol())); // join to the well table which may have plate metadata - ColumnInfo wellLsidCol = getColumn(AssayResultDomainKind.WELL_LSID_COLUMN_NAME); + ColumnInfo wellLsidCol = getColumn(AssayResultDomainKind.Column.WellLsid.name()); if (wellLsidCol != null) { BaseColumnInfo col = new AliasedColumn("Well", wellLsidCol); @@ -194,10 +194,10 @@ private class _AssayResultTable extends AssayResultTable Domain replicateDomain = AssayPlateMetadataService.get().getPlateReplicateStatsDomain(getProtocol()); if (replicateDomain != null) { - ColumnInfo replicateLsidCol = getColumn(AssayResultDomainKind.REPLICATE_LSID_COLUMN_NAME); + ColumnInfo replicateLsidCol = getColumn(AssayResultDomainKind.Column.ReplicateLsid.name()); if (replicateLsidCol != null) { - BaseColumnInfo replicateCol = new AliasedColumn("Replicate", replicateLsidCol); + BaseColumnInfo replicateCol = new AliasedColumn(AssayResultDomainKind.Column.Replicate.name(), replicateLsidCol); replicateCol.setFk(QueryForeignKey .from(getUserSchema(), getContainerFilter()) .to(PLATE_REPLICATE_STATS_TABLE, PlateReplicateStatsDomainKind.Column.Lsid.name(), null) @@ -209,7 +209,7 @@ private class _AssayResultTable extends AssayResultTable // adjust the default columns to position the replicate columns adjacent to the measures they track Map replicateFields = new HashMap<>(); for (DomainProperty prop : replicateDomain.getProperties()) - replicateFields.put(prop.getName(), FieldKey.fromParts("Replicate", prop.getName())); + replicateFields.put(prop.getName(), FieldKey.fromParts(AssayResultDomainKind.Column.Replicate.name(), prop.getName())); List newDefaultColumns = new ArrayList<>(); for (FieldKey fk : defaultColumns) diff --git a/assay/src/org/labkey/assay/TsvAssayProvider.java b/assay/src/org/labkey/assay/TsvAssayProvider.java index 41b633b19f5..21618259292 100644 --- a/assay/src/org/labkey/assay/TsvAssayProvider.java +++ b/assay/src/org/labkey/assay/TsvAssayProvider.java @@ -458,9 +458,9 @@ public void beforeDomainChange(User user, ExpProtocol protocol, GWTDomain newFields = new ArrayList<>(); - if (!existingFields.contains(AssayResultDomainKind.PLATE_COLUMN_NAME)) + if (!existingFields.contains(AssayResultDomainKind.Column.Plate.name())) { - GWTPropertyDescriptor plate = new GWTPropertyDescriptor(AssayResultDomainKind.PLATE_COLUMN_NAME, PropertyType.INTEGER.getTypeUri()); + GWTPropertyDescriptor plate = new GWTPropertyDescriptor(AssayResultDomainKind.Column.Plate.name(), PropertyType.INTEGER.getTypeUri()); plate.setLookupSchema(PlateSchema.SCHEMA_NAME); plate.setLookupQuery(PlateTable.NAME); plate.setLookupContainer(null); @@ -472,18 +472,18 @@ public void beforeDomainChange(User user, ExpProtocol protocol, GWTDomain { @@ -207,22 +205,20 @@ public Map apply(Map row) // need to adjust the column value to be 0 based to match the template locations well.setColumn(well.getColumn() - 1); - if (positionToWell.containsKey(well)) - { - WellBean wellBean = positionToWell.get(well); - for (WellCustomField customField : PlateManager.get().getWellCustomFields(user, plate, wellBean.getRowId())) - row.put(customField.getName(), customField.getValue()); + if (!positionToWell.containsKey(well)) + throw new RuntimeValidationException("Unable to resolve well \"" + wellLocation + "\" for plate \"" + plate.getName() + "\"."); - // include the sample information from the well (Issue 50276) - if (!sampleMap.isEmpty()) - { - ExpMaterial sample = sampleMap.get(wellBean.getSampleId()); - row.put("SampleID", sample != null ? sample.getRowId() : null); - row.put("SampleName", sample != null ? sample.getName() : null); - } + WellBean wellBean = positionToWell.get(well); + for (WellCustomField customField : PlateManager.get().getWellCustomFields(user, plate, wellBean.getRowId())) + row.put(customField.getName(), customField.getValue()); + + // Issue 50276: include the sample information from the well + if (!sampleMap.isEmpty()) + { + ExpMaterial sample = sampleMap.get(wellBean.getSampleId()); + row.put("SampleID", sample != null ? sample.getRowId() : null); + row.put("SampleName", sample != null ? sample.getName() : null); } - else - throw new RuntimeValidationException("Unable to resolve well \"" + wellLocation + "\" for plate \"" + plate.getName() + "\"."); return row; } @@ -353,7 +349,7 @@ private List> mergeReRunData( Set incomingPlates = new HashSet<>(); // incoming plates may be either row IDs or plate IDs for (var row : rows) { - var plateId = row.get(AssayResultDomainKind.PLATE_COLUMN_NAME); + var plateId = row.get(AssayResultDomainKind.Column.Plate.name()); if (plateId != null) incomingPlates.add(plateId); } @@ -365,20 +361,20 @@ private List> mergeReRunData( throw new ExperimentException(String.format("Unable to query the assay results for protocol : %s", protocol.getName())); // The plate identifier is either a row ID or plate ID on incoming data, need to match that when merging existing data. - FieldKey plateFieldKey = FieldKey.fromParts(AssayResultDomainKind.PLATE_COLUMN_NAME); + FieldKey plateFieldKey = FieldKey.fromParts(AssayResultDomainKind.Column.Plate.name()); // Note that in the case where there is a transform script on the assay design, the LK data parsing might not have // found any rows and we might be deferring to the transform script to do that parsing. This block of code should // be able to proceed in that case by just passing through all run results to the transform script for the run being replaced. if (!rows.isEmpty()) { - Object plateObj = rows.get(0).get(AssayResultDomainKind.PLATE_COLUMN_NAME); + Object plateObj = rows.get(0).get(AssayResultDomainKind.Column.Plate.name()); if (plateObj instanceof String) - plateFieldKey = FieldKey.fromParts(AssayResultDomainKind.PLATE_COLUMN_NAME, PlateTable.Column.PlateId.name()); + plateFieldKey = FieldKey.fromParts(AssayResultDomainKind.Column.Plate.name(), PlateTable.Column.PlateId.name()); } FieldKey finalPlateFieldKey = plateFieldKey; List columns = resultsTable.getDomain().getProperties().stream().map(dp -> { - if (dp.getName().equalsIgnoreCase(AssayResultDomainKind.PLATE_COLUMN_NAME)) + if (dp.getName().equalsIgnoreCase(AssayResultDomainKind.Column.Plate.name())) return finalPlateFieldKey; return FieldKey.fromParts(dp.getName()); }).toList(); @@ -404,7 +400,7 @@ private List> mergeReRunData( if (rowMap.containsKey(entry.getKey())) row.put(entry.getValue().getName(), rowMap.get(entry.getKey())); } - row.put(AssayResultDomainKind.PLATE_COLUMN_NAME, plate); + row.put(AssayResultDomainKind.Column.Plate.name(), plate); newRows.add(row); prevPlateRowIDs.add(plateMap.get(plate).getRowId()); } @@ -503,7 +499,7 @@ private boolean isGridFormat(List> data) return true; // only the tabular formats will have the well location field - return !data.get(0).containsKey(AssayResultDomainKind.WELL_LOCATION_COLUMN_NAME) && !data.get(0).containsKey("Well Location"); + return !data.get(0).containsKey(AssayResultDomainKind.Column.WellLocation.name()) && !data.get(0).containsKey("Well Location"); } private List> parsePlateRows( @@ -513,9 +509,9 @@ private List> parsePlateRows( List> data ) throws ExperimentException { - DomainProperty plateProp = provider.getResultsDomain(protocol).getPropertyByName(AssayResultDomainKind.PLATE_COLUMN_NAME); + DomainProperty plateProp = provider.getResultsDomain(protocol).getPropertyByName(AssayResultDomainKind.Column.Plate.name()); Set importAliases = new CaseInsensitiveHashSet(plateProp.getImportAliasSet()); - importAliases.add(AssayResultDomainKind.PLATE_COLUMN_NAME); + importAliases.add(AssayResultDomainKind.Column.Plate.name()); // check whether the data rows have plate identifiers String plateIdField = data.get(0).keySet().stream().filter(importAliases::contains).findFirst().orElse(null); @@ -547,7 +543,7 @@ private List> parsePlateRows( for (Map row : data) { // well location field is required, return if not provided or it will fail downstream - String well = String.valueOf(row.get(AssayResultDomainKind.WELL_LOCATION_COLUMN_NAME)); + String well = String.valueOf(row.get(AssayResultDomainKind.Column.WellLocation.name())); if (well == null) return data; @@ -557,7 +553,7 @@ private List> parsePlateRows( positions.add(position); Map newRow = new HashMap<>(row); - newRow.put(AssayResultDomainKind.PLATE_COLUMN_NAME, plates.get(curPlate).getRowId()); + newRow.put(AssayResultDomainKind.Column.Plate.name(), plates.get(curPlate).getRowId()); newData.add(newRow); if (++rowCount >= plateSize) @@ -598,7 +594,7 @@ else if (k instanceof String s && (plate.getPlateId().equalsIgnoreCase(s) || pla }); if (plateRowId != null) - newRow.put(AssayResultDomainKind.PLATE_COLUMN_NAME, plateRowId); + newRow.put(AssayResultDomainKind.Column.Plate.name(), plateRowId); } newData.add(newRow); @@ -835,8 +831,8 @@ else if (plateTypeGrids.keySet().size() > 1) private Map getDataRowFromWell(String plateId, Well well, String measure) { Map row = new CaseInsensitiveHashMap<>(); - row.put(AssayResultDomainKind.PLATE_COLUMN_NAME, plateId); - row.put(AssayResultDomainKind.WELL_LOCATION_COLUMN_NAME, well.getDescription()); + row.put(AssayResultDomainKind.Column.Plate.name(), plateId); + row.put(AssayResultDomainKind.Column.WellLocation.name(), well.getDescription()); row.put(measure, getWellValue(well)); return row; } @@ -1240,7 +1236,7 @@ public static DomainProperty getAssayStateProp(Domain resultDomain) if (resultDomain == null) return null; - return resultDomain.getProperties().stream().filter(dp -> AssayResultDomainKind.STATE_COLUMN_NAME.equalsIgnoreCase(dp.getName())) + return resultDomain.getProperties().stream().filter(dp -> AssayResultDomainKind.Column.State.name().equalsIgnoreCase(dp.getName())) .findFirst().orElse(null); } @@ -1363,7 +1359,7 @@ public void applyHitSelectionCriteria( FieldKey fieldKey; if (isReplicateProperty) - fieldKey = FieldKey.fromParts("Replicate", domainProperty.getName()); + fieldKey = FieldKey.fromParts(AssayResultDomainKind.Column.Replicate.name(), domainProperty.getName()); else fieldKey = FieldKey.fromParts(domainProperty.getName()); @@ -1433,7 +1429,7 @@ private static void filterOutExcludedRows(Container container, TableInfo table, .toList(); if (!exclusionStateRowIds.isEmpty()) - filter.addCondition(table.getColumn(AssayResultDomainKind.STATE_COLUMN_NAME), exclusionStateRowIds, CompareType.NOT_IN); + filter.addCondition(table.getColumn(AssayResultDomainKind.Column.State.name()), exclusionStateRowIds, CompareType.NOT_IN); } private static String generateFilterCriteriaDescription(SimpleFilter filter) @@ -1508,8 +1504,8 @@ public void bindAdditionalParameters(Map map, ParameterMapStatem Domain resultDomain = _provider.getResultsDomain(_protocol); _stateProp = AssayPlateMetadataServiceImpl.getAssayStateProp(resultDomain); DomainProperty plateSetProperty = runDomain.getPropertyByName(AssayPlateMetadataService.PLATE_SET_COLUMN_NAME); - DomainProperty plateProperty = resultDomain.getPropertyByName(AssayResultDomainKind.PLATE_COLUMN_NAME); - DomainProperty wellLocationProperty = resultDomain.getPropertyByName(AssayResultDomainKind.WELL_LOCATION_COLUMN_NAME); + DomainProperty plateProperty = resultDomain.getPropertyByName(AssayResultDomainKind.Column.Plate.name()); + DomainProperty wellLocationProperty = resultDomain.getPropertyByName(AssayResultDomainKind.Column.WellLocation.name()); // get the plate associated with this row (checking the results domain field first) Object plateIdentifier = PropertyService.get().getDomainPropertyValueFromRow(plateProperty, map); @@ -1565,13 +1561,13 @@ public void bindAdditionalParameters(Map map, ParameterMapStatem // need to adjust the column value to be 0 based to match the template locations pos.setCol(pos.getColumn() - 1); if (positionToWellLsid.containsKey(pos)) - target.put(WELL_LSID_COLUMN_NAME, positionToWellLsid.get(pos)); + target.put(AssayResultDomainKind.Column.WellLsid.name(), positionToWellLsid.get(pos)); // find the associated replicate well group for this position (if any) if (positionToReplicateLsid.containsKey(pos)) { Lsid lsid = positionToReplicateLsid.get(pos); - target.put(REPLICATE_LSID_COLUMN_NAME, lsid); + target.put(AssayResultDomainKind.Column.ReplicateLsid.name(), lsid); _replicateRows.computeIfAbsent(lsid, k -> new ArrayList<>()).add(map); } } diff --git a/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java b/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java index ad5b270e57b..b4893796ff9 100644 --- a/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java +++ b/assay/src/org/labkey/assay/plate/AssayPlateTriggerFactory.java @@ -70,7 +70,7 @@ private void checkForChanges(@Nullable Map oldRow, boolean isUpd if (oldRow != null) { // check if the change is to a replicate well row - Object replicateLsid = oldRow.get(AssayResultDomainKind.REPLICATE_LSID_COLUMN_NAME); + Object replicateLsid = oldRow.get(AssayResultDomainKind.Column.ReplicateLsid.name()); if (replicateLsid != null) _replicateLsid.put(String.valueOf(replicateLsid), isUpdate); } @@ -100,7 +100,7 @@ public void complete(TableInfo table, Container c, User user, TableInfo.TriggerT if (_replicateLsid.isEmpty() || errors.hasErrors()) return; - var filter = new SimpleFilter(FieldKey.fromParts(AssayResultDomainKind.REPLICATE_LSID_COLUMN_NAME), _replicateLsid.keySet(), CompareType.IN); + var filter = new SimpleFilter(FieldKey.fromParts(AssayResultDomainKind.Column.ReplicateLsid.name()), _replicateLsid.keySet(), CompareType.IN); try (TableResultSet rs = new TableSelector(table, filter, null).getResultSet()) { @@ -108,7 +108,7 @@ public void complete(TableInfo table, Container c, User user, TableInfo.TriggerT while (rs.next()) { - var lsid = rs.getString(AssayResultDomainKind.REPLICATE_LSID_COLUMN_NAME); + var lsid = rs.getString(AssayResultDomainKind.Column.ReplicateLsid.name()); replicates.computeIfAbsent(Lsid.parse(String.valueOf(lsid)), m -> new ArrayList<>()).add(rs.getRowMap()); _replicateLsid.remove(lsid); } From 4723d68eacf616cb56948f61e103f34bfbc1cb04 Mon Sep 17 00:00:00 2001 From: alanv Date: Tue, 17 Dec 2024 19:35:44 -0600 Subject: [PATCH 29/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 62ce4aba8fe..24d71e3ebe6 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1" + "@labkey/components": "6.6.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", - "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", + "version": "6.6.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", + "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/assay/package.json b/assay/package.json index e4ae471b92d..1f0e03ac13a 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1" + "@labkey/components": "6.6.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 999810ebb59..f75bb1f8cdb 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1", + "@labkey/components": "6.6.0-fb-auto-hits.2", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", - "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", + "version": "6.6.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", + "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/core/package.json b/core/package.json index 38f05ea0af5..2a2185a6c59 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1", + "@labkey/components": "6.6.0-fb-auto-hits.2", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index e21e97e0ea1..9b5eb6e87bb 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1" + "@labkey/components": "6.6.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", - "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", + "version": "6.6.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", + "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/experiment/package.json b/experiment/package.json index 337662acc4e..2cd2cdf3422 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1" + "@labkey/components": "6.6.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 9362ab63c11..1ab268a6749 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1" + "@labkey/components": "6.6.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.1.tgz", - "integrity": "sha512-ogRxYew44lXNTG9f2mWBXng38sOuwOEKXjd7Y8ab9ffZtVKUI9xX9vjMNFScwk0XxY8rtHvufXcdvhPnSK1yWQ==", + "version": "6.6.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", + "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.0", diff --git a/pipeline/package.json b/pipeline/package.json index 39c03bd6d33..35144d4c04c 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.1" + "@labkey/components": "6.6.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", From d09c22b19ec123be85d1a9e870f509761c57fb53 Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 18 Dec 2024 11:17:44 -0600 Subject: [PATCH 30/37] Bump components --- assay/package-lock.json | 16 ++++++++-------- assay/package.json | 2 +- core/package-lock.json | 16 ++++++++-------- core/package.json | 2 +- experiment/package-lock.json | 16 ++++++++-------- experiment/package.json | 2 +- pipeline/package-lock.json | 16 ++++++++-------- pipeline/package.json | 2 +- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 24d71e3ebe6..e74e6c11802 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2211,9 +2211,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", - "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" + "version": "1.36.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", + "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2252,12 +2252,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", - "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", + "version": "6.7.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", + "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.0", + "@labkey/api": "1.36.0-fb-auto-hits.3", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/assay/package.json b/assay/package.json index 1f0e03ac13a..ca570509061 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index f75bb1f8cdb..df4c13e3f8d 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2", + "@labkey/components": "6.7.0-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3017,9 +3017,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", - "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" + "version": "1.36.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", + "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -3058,12 +3058,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", - "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", + "version": "6.7.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", + "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.0", + "@labkey/api": "1.36.0-fb-auto-hits.3", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/core/package.json b/core/package.json index 2a2185a6c59..249740b5609 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2", + "@labkey/components": "6.7.0-fb-auto-hits.0", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 9b5eb6e87bb..dad7ddb2e7e 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2823,9 +2823,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", - "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" + "version": "1.36.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", + "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2864,12 +2864,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", - "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", + "version": "6.7.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", + "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.0", + "@labkey/api": "1.36.0-fb-auto-hits.3", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/experiment/package.json b/experiment/package.json index 2cd2cdf3422..4c0eefe0272 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 1ab268a6749..fa4a956750d 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2387,9 +2387,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.0.tgz", - "integrity": "sha512-RCtNg7XXVvYacOw5fHGZi3VpSraUu0HlO6P9aC1fm7XqKY0bkdF57yPxmbjAwvTHzjszCjDcb6kzuE84iT37hA==" + "version": "1.36.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", + "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2428,12 +2428,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.6.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.6.0-fb-auto-hits.2.tgz", - "integrity": "sha512-+4yTx3J6Ovs+LUPAQ9TDdaEl2aPuNXgocM2g1+E7LfvVdaHTvxJVmZGf0Ss7jI3/t+L7xUugIFRI8eh4gQxHTA==", + "version": "6.7.0-fb-auto-hits.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", + "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.0", + "@labkey/api": "1.36.0-fb-auto-hits.3", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/pipeline/package.json b/pipeline/package.json index 35144d4c04c..745dca7c75a 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.6.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.0" }, "devDependencies": { "@labkey/build": "8.3.0", From b00aa474ed29245ddc071359c248a8154def1b87 Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 18 Dec 2024 12:39:10 -0600 Subject: [PATCH 31/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index e74e6c11802..760711ddabc 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0" + "@labkey/components": "6.7.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", - "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", + "version": "6.7.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", + "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/assay/package.json b/assay/package.json index ca570509061..87cbdf00c37 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0" + "@labkey/components": "6.7.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index df4c13e3f8d..ceb3913496b 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0", + "@labkey/components": "6.7.0-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", - "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", + "version": "6.7.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", + "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/core/package.json b/core/package.json index 249740b5609..99153bc8914 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0", + "@labkey/components": "6.7.0-fb-auto-hits.1", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index dad7ddb2e7e..d8b0695029b 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0" + "@labkey/components": "6.7.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", - "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", + "version": "6.7.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", + "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/experiment/package.json b/experiment/package.json index 4c0eefe0272..2abb1daf1c1 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0" + "@labkey/components": "6.7.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index fa4a956750d..99a8d344273 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0" + "@labkey/components": "6.7.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.0", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.0.tgz", - "integrity": "sha512-QlJ+dZXX1KjXzfmh9ydwOhg0TorNV/ZzMFr1pUT9XuCnFM3PBkenu9pvKJMzfG7IsI10HmqIMIGspHyTkYB81g==", + "version": "6.7.0-fb-auto-hits.1", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", + "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/pipeline/package.json b/pipeline/package.json index 745dca7c75a..43f8c23aa58 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.0" + "@labkey/components": "6.7.0-fb-auto-hits.1" }, "devDependencies": { "@labkey/build": "8.3.0", From 80c0a45dbeac5ddeab17576fc3b1d3447279d94c Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 18 Dec 2024 16:21:38 -0600 Subject: [PATCH 32/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 760711ddabc..1ca61f80f5a 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1" + "@labkey/components": "6.7.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", - "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", + "version": "6.7.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", + "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/assay/package.json b/assay/package.json index 87cbdf00c37..6d90a2ed8b9 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1" + "@labkey/components": "6.7.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index ceb3913496b..fd4c15afbba 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1", + "@labkey/components": "6.7.0-fb-auto-hits.2", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", - "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", + "version": "6.7.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", + "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/core/package.json b/core/package.json index 99153bc8914..46cd6a9b1a9 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1", + "@labkey/components": "6.7.0-fb-auto-hits.2", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index d8b0695029b..11b40deb4d2 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1" + "@labkey/components": "6.7.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", - "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", + "version": "6.7.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", + "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/experiment/package.json b/experiment/package.json index 2abb1daf1c1..582d5a2b24e 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1" + "@labkey/components": "6.7.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 99a8d344273..ff27049c380 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1" + "@labkey/components": "6.7.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.1", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.1.tgz", - "integrity": "sha512-voC8wI0utIpruatW25aRRn2K4hYs2vEUfQL83A50J3WsCCRdBEXzDxGq9cxNnJNSupZGXpVydtpiZzWje/guPQ==", + "version": "6.7.0-fb-auto-hits.2", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", + "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/pipeline/package.json b/pipeline/package.json index 43f8c23aa58..7d2fce459be 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.1" + "@labkey/components": "6.7.0-fb-auto-hits.2" }, "devDependencies": { "@labkey/build": "8.3.0", From 4aadecdb0f3a63ab4a56c27f6ae2eaef0067ec1a Mon Sep 17 00:00:00 2001 From: labkey-nicka Date: Wed, 18 Dec 2024 14:28:07 -0800 Subject: [PATCH 33/37] It is a very comma problem --- .../schemas/dbscripts/sqlserver/assay-24.015-24.016.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql index 74837546678..38564102d01 100644 --- a/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql +++ b/assay/resources/schemas/dbscripts/sqlserver/assay-24.015-24.016.sql @@ -8,13 +8,13 @@ CREATE TABLE assay.FilterCriteria Value NVARCHAR(4000) NULL, CONSTRAINT PK_FilterCriteria PRIMARY KEY (RowId), - CONSTRAINT FK_FilterCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE + CONSTRAINT FK_FilterCriteria_DomainDescriptor FOREIGN KEY (DomainId) REFERENCES exp.DomainDescriptor (DomainId) ON DELETE CASCADE, -- SQL Server does not allow for multiple foreign keys to the same table to utilize ON DELETE CASCADE as it may -- cause cycles or multiple cascade paths. The solution is to only ON DELETE CASCADE for one foreign key and -- clean up upon delete of the property for other changes. See AssayResultDomainKind.deletePropertyDescriptor(). CONSTRAINT FK_FilterCriteria_PropertyDescriptor FOREIGN KEY (PropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE CASCADE, - CONSTRAINT FK_FilterCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE NO ACTION, + CONSTRAINT FK_FilterCriteria_PropertyDescriptor_Reference FOREIGN KEY (ReferencePropertyId) REFERENCES exp.PropertyDescriptor (PropertyId) ON DELETE NO ACTION ); EXEC core.executeJavaUpgradeCode 'initializeHitSelectionCriteria'; From bd147c422880e5fd78e5411f2341f23cf91f7d90 Mon Sep 17 00:00:00 2001 From: alanv Date: Wed, 18 Dec 2024 18:11:59 -0600 Subject: [PATCH 34/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 1ca61f80f5a..2ee5f6f3e4a 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.3" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", - "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", + "version": "6.7.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", + "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/assay/package.json b/assay/package.json index 6d90a2ed8b9..d948a31438f 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.3" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index fd4c15afbba..e0fa174656a 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2", + "@labkey/components": "6.7.0-fb-auto-hits.3", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", - "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", + "version": "6.7.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", + "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/core/package.json b/core/package.json index 46cd6a9b1a9..970819ffc7d 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2", + "@labkey/components": "6.7.0-fb-auto-hits.3", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 11b40deb4d2..755da8566c0 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.3" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", - "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", + "version": "6.7.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", + "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/experiment/package.json b/experiment/package.json index 582d5a2b24e..919c285fbb0 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.3" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index ff27049c380..38ac002e816 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.3" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.2", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.2.tgz", - "integrity": "sha512-POkZcpaCrVgT6LPI1xrJ+W0ZXUWu+ZDE4TYGfxgpDj3KjFT5wzhodwQm7tnNWJ8FEhIIcIGX2sR80WlNBe82CQ==", + "version": "6.7.0-fb-auto-hits.3", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", + "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/pipeline/package.json b/pipeline/package.json index 7d2fce459be..4421e05fb5d 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.2" + "@labkey/components": "6.7.0-fb-auto-hits.3" }, "devDependencies": { "@labkey/build": "8.3.0", From 2934e20ca7b888d0cf00e794b0a4e12aaf27471f Mon Sep 17 00:00:00 2001 From: alanv Date: Thu, 19 Dec 2024 14:46:41 -0600 Subject: [PATCH 35/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 2ee5f6f3e4a..f03b22e9b73 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3" + "@labkey/components": "6.7.0-fb-auto-hits.4" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", - "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", + "version": "6.7.0-fb-auto-hits.4", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", + "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/assay/package.json b/assay/package.json index d948a31438f..9e7f7345ada 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3" + "@labkey/components": "6.7.0-fb-auto-hits.4" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index e0fa174656a..bb0288d1d3f 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3", + "@labkey/components": "6.7.0-fb-auto-hits.4", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", - "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", + "version": "6.7.0-fb-auto-hits.4", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", + "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/core/package.json b/core/package.json index 970819ffc7d..be0af2aff50 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3", + "@labkey/components": "6.7.0-fb-auto-hits.4", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 755da8566c0..566b4928405 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3" + "@labkey/components": "6.7.0-fb-auto-hits.4" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", - "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", + "version": "6.7.0-fb-auto-hits.4", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", + "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/experiment/package.json b/experiment/package.json index 919c285fbb0..9bb8d9a55d0 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3" + "@labkey/components": "6.7.0-fb-auto-hits.4" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 38ac002e816..9bdf3d49365 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3" + "@labkey/components": "6.7.0-fb-auto-hits.4" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.3.tgz", - "integrity": "sha512-/OfFur9zgKkv3Gk5OmRVbC9SZDAbah6Mlof6ZNMI24d1NyD8DQ56xJXuzmBp+0Bl/GqsKqlPfq/hy5JBflQLcA==", + "version": "6.7.0-fb-auto-hits.4", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", + "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/pipeline/package.json b/pipeline/package.json index 4421e05fb5d..01cbb92f383 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.3" + "@labkey/components": "6.7.0-fb-auto-hits.4" }, "devDependencies": { "@labkey/build": "8.3.0", From 6b75c38ddb4ab1bd706ded8c2c208b192ff32ac6 Mon Sep 17 00:00:00 2001 From: alanv Date: Thu, 19 Dec 2024 17:09:18 -0600 Subject: [PATCH 36/37] Bump components --- assay/package-lock.json | 8 ++++---- assay/package.json | 2 +- core/package-lock.json | 8 ++++---- core/package.json | 2 +- experiment/package-lock.json | 8 ++++---- experiment/package.json | 2 +- pipeline/package-lock.json | 8 ++++---- pipeline/package.json | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index f03b22e9b73..3e1ddb9d85b 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4" + "@labkey/components": "6.7.0-fb-auto-hits.5" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2252,9 +2252,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.4", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", - "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", + "version": "6.7.0-fb-auto-hits.5", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", + "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/assay/package.json b/assay/package.json index 9e7f7345ada..6210ca078a0 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4" + "@labkey/components": "6.7.0-fb-auto-hits.5" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index bb0288d1d3f..7768e913352 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4", + "@labkey/components": "6.7.0-fb-auto-hits.5", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3058,9 +3058,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.4", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", - "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", + "version": "6.7.0-fb-auto-hits.5", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", + "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/core/package.json b/core/package.json index be0af2aff50..4d4c8991679 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4", + "@labkey/components": "6.7.0-fb-auto-hits.5", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index 566b4928405..d50404f76cc 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4" + "@labkey/components": "6.7.0-fb-auto-hits.5" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2864,9 +2864,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.4", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", - "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", + "version": "6.7.0-fb-auto-hits.5", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", + "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/experiment/package.json b/experiment/package.json index 9bb8d9a55d0..53719deffeb 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4" + "@labkey/components": "6.7.0-fb-auto-hits.5" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 9bdf3d49365..4b26a31a000 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4" + "@labkey/components": "6.7.0-fb-auto-hits.5" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2428,9 +2428,9 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.4", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.4.tgz", - "integrity": "sha512-W2lyrPt1OiY0u1vge8mGyWmUZCkxOm1IbftHMQDz3XEKWDpnGV+3iePWEKgmctk8aCmjeOj4/ZUNo6ZIABDMqQ==", + "version": "6.7.0-fb-auto-hits.5", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", + "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", "dependencies": { "@hello-pangea/dnd": "17.0.0", "@labkey/api": "1.36.0-fb-auto-hits.3", diff --git a/pipeline/package.json b/pipeline/package.json index 01cbb92f383..bfcc9049e87 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.4" + "@labkey/components": "6.7.0-fb-auto-hits.5" }, "devDependencies": { "@labkey/build": "8.3.0", From 044369ff7f53290a8a43b56032fa2b7d22d9d26c Mon Sep 17 00:00:00 2001 From: alanv Date: Thu, 19 Dec 2024 18:20:39 -0600 Subject: [PATCH 37/37] Bump components --- assay/package-lock.json | 16 ++++++++-------- assay/package.json | 2 +- core/package-lock.json | 16 ++++++++-------- core/package.json | 2 +- experiment/package-lock.json | 16 ++++++++-------- experiment/package.json | 2 +- pipeline/package-lock.json | 16 ++++++++-------- pipeline/package.json | 2 +- 8 files changed, 36 insertions(+), 36 deletions(-) diff --git a/assay/package-lock.json b/assay/package-lock.json index 3e1ddb9d85b..f728924bd3c 100644 --- a/assay/package-lock.json +++ b/assay/package-lock.json @@ -8,7 +8,7 @@ "name": "assay", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5" + "@labkey/components": "6.8.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2211,9 +2211,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", - "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" + "version": "1.37.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.37.0.tgz", + "integrity": "sha512-PIuzYGEm0O6ydWoXWEqCV+hHGqzDsVZ5Q3JD6i/d/bvp6On0jML9lnmz45hw4ZAXiwLSpd09whaTeSPVxnDxig==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2252,12 +2252,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.5", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", - "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", + "version": "6.8.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.8.0.tgz", + "integrity": "sha512-wHErvhP7+d0K6rrXUREgpzj5HjMJTfgQO3iJrg/wW9B9408mjMgtW76MGfjdn1haqepnbEIvUlA7u1Y5qS2X5A==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.3", + "@labkey/api": "1.37.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/assay/package.json b/assay/package.json index 6210ca078a0..5742df27a46 100644 --- a/assay/package.json +++ b/assay/package.json @@ -12,7 +12,7 @@ "clean": "rimraf resources/web/assay/gen && rimraf resources/views/gen && rimraf resources/web/gen" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5" + "@labkey/components": "6.8.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/core/package-lock.json b/core/package-lock.json index 7768e913352..ea8d7139df8 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -8,7 +8,7 @@ "name": "labkey-core", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5", + "@labkey/components": "6.8.0", "@labkey/themes": "1.4.0" }, "devDependencies": { @@ -3017,9 +3017,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", - "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" + "version": "1.37.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.37.0.tgz", + "integrity": "sha512-PIuzYGEm0O6ydWoXWEqCV+hHGqzDsVZ5Q3JD6i/d/bvp6On0jML9lnmz45hw4ZAXiwLSpd09whaTeSPVxnDxig==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -3058,12 +3058,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.5", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", - "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", + "version": "6.8.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.8.0.tgz", + "integrity": "sha512-wHErvhP7+d0K6rrXUREgpzj5HjMJTfgQO3iJrg/wW9B9408mjMgtW76MGfjdn1haqepnbEIvUlA7u1Y5qS2X5A==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.3", + "@labkey/api": "1.37.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/core/package.json b/core/package.json index 4d4c8991679..c9ae5452bf7 100644 --- a/core/package.json +++ b/core/package.json @@ -54,7 +54,7 @@ } }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5", + "@labkey/components": "6.8.0", "@labkey/themes": "1.4.0" }, "devDependencies": { diff --git a/experiment/package-lock.json b/experiment/package-lock.json index d50404f76cc..330c2308853 100644 --- a/experiment/package-lock.json +++ b/experiment/package-lock.json @@ -8,7 +8,7 @@ "name": "experiment", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5" + "@labkey/components": "6.8.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2823,9 +2823,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", - "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" + "version": "1.37.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.37.0.tgz", + "integrity": "sha512-PIuzYGEm0O6ydWoXWEqCV+hHGqzDsVZ5Q3JD6i/d/bvp6On0jML9lnmz45hw4ZAXiwLSpd09whaTeSPVxnDxig==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2864,12 +2864,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.5", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", - "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", + "version": "6.8.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.8.0.tgz", + "integrity": "sha512-wHErvhP7+d0K6rrXUREgpzj5HjMJTfgQO3iJrg/wW9B9408mjMgtW76MGfjdn1haqepnbEIvUlA7u1Y5qS2X5A==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.3", + "@labkey/api": "1.37.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/experiment/package.json b/experiment/package.json index 53719deffeb..601fc85cb3b 100644 --- a/experiment/package.json +++ b/experiment/package.json @@ -13,7 +13,7 @@ "test-integration": "cross-env NODE_ENV=test jest --ci --runInBand -c test/js/jest.config.integration.js" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5" + "@labkey/components": "6.8.0" }, "devDependencies": { "@labkey/build": "8.3.0", diff --git a/pipeline/package-lock.json b/pipeline/package-lock.json index 4b26a31a000..762172a0f62 100644 --- a/pipeline/package-lock.json +++ b/pipeline/package-lock.json @@ -8,7 +8,7 @@ "name": "pipeline", "version": "0.0.0", "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5" + "@labkey/components": "6.8.0" }, "devDependencies": { "@labkey/build": "8.3.0", @@ -2387,9 +2387,9 @@ } }, "node_modules/@labkey/api": { - "version": "1.36.0-fb-auto-hits.3", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.36.0-fb-auto-hits.3.tgz", - "integrity": "sha512-jzFxoLbyytRRqYNYe1lxAn+CwZYabQlKcvbme0qmvFyKh1BNxFi9nPEGrZtQaoGf2O9zNxf9L2ZACNZKj54oYQ==" + "version": "1.37.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/api/-/@labkey/api-1.37.0.tgz", + "integrity": "sha512-PIuzYGEm0O6ydWoXWEqCV+hHGqzDsVZ5Q3JD6i/d/bvp6On0jML9lnmz45hw4ZAXiwLSpd09whaTeSPVxnDxig==" }, "node_modules/@labkey/build": { "version": "8.3.0", @@ -2428,12 +2428,12 @@ } }, "node_modules/@labkey/components": { - "version": "6.7.0-fb-auto-hits.5", - "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.7.0-fb-auto-hits.5.tgz", - "integrity": "sha512-DiAenxzvOe5CwxE1/VvfMufD1iQoGhH/F5fjdDxTxRpJtRBrQLNFyRqiex2w2gMgj3aj07JBLBY/W8XwLh9nzQ==", + "version": "6.8.0", + "resolved": "https://labkey.jfrog.io/artifactory/api/npm/libs-client/@labkey/components/-/@labkey/components-6.8.0.tgz", + "integrity": "sha512-wHErvhP7+d0K6rrXUREgpzj5HjMJTfgQO3iJrg/wW9B9408mjMgtW76MGfjdn1haqepnbEIvUlA7u1Y5qS2X5A==", "dependencies": { "@hello-pangea/dnd": "17.0.0", - "@labkey/api": "1.36.0-fb-auto-hits.3", + "@labkey/api": "1.37.0", "@testing-library/dom": "~10.4.0", "@testing-library/jest-dom": "~6.6.3", "@testing-library/react": "~16.0.1", diff --git a/pipeline/package.json b/pipeline/package.json index bfcc9049e87..54d75781b26 100644 --- a/pipeline/package.json +++ b/pipeline/package.json @@ -14,7 +14,7 @@ "build-prod": "npm run clean && cross-env NODE_ENV=production PROD_SOURCE_MAP=source-map webpack --config node_modules/@labkey/build/webpack/prod.config.js --color --progress --profile" }, "dependencies": { - "@labkey/components": "6.7.0-fb-auto-hits.5" + "@labkey/components": "6.8.0" }, "devDependencies": { "@labkey/build": "8.3.0",