diff --git a/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java b/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java index 864eae8bf50..2356cc65f8b 100644 --- a/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java +++ b/experiment/src/org/labkey/experiment/api/ExpMaterialTableImpl.java @@ -18,6 +18,7 @@ import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.math3.util.Precision; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.labkey.api.assay.plate.AssayPlateMetadataService; @@ -309,9 +310,8 @@ public StringExpression getURL(ColumnInfo parent) case RawAmount -> { var columnInfo = wrapColumn(alias, _rootTable.getColumn(Column.StoredAmount.name())); + columnInfo.setDisplayColumnFactory(colInfo -> new SampleTypeAmountPrecisionDisplayColumn(colInfo, null)); columnInfo.setDescription("The amount of this sample, in the base unit for the sample type's display unit (if defined), currently on hand."); - if (columnInfo.getFormat() == null) - columnInfo.setFormat(Quantity.DEFAULT_FORMAT); columnInfo.setUserEditable(false); columnInfo.setReadOnly(true); return columnInfo; @@ -324,6 +324,7 @@ public StringExpression getURL(ColumnInfo parent) if (typeUnit != null) { SampleTypeAmountDisplayColumn columnInfo = new SampleTypeAmountDisplayColumn(this, Column.StoredAmount.name(), Column.Units.name(), label, importAliases, typeUnit); + columnInfo.setDisplayColumnFactory(colInfo -> new SampleTypeAmountPrecisionDisplayColumn(colInfo, typeUnit)); columnInfo.setDescription("The amount of this sample, in the display unit for the sample type, currently on hand."); columnInfo.setShownInUpdateView(true); columnInfo.setShownInInsertView(true); @@ -334,8 +335,7 @@ public StringExpression getURL(ColumnInfo parent) else { var columnInfo = wrapColumn(alias, _rootTable.getColumn(Column.StoredAmount.name())); - if (columnInfo.getFormat() == null) - columnInfo.setFormat(Quantity.DEFAULT_FORMAT); + columnInfo.setDisplayColumnFactory(colInfo -> new SampleTypeAmountPrecisionDisplayColumn(colInfo, null)); columnInfo.setLabel(label); columnInfo.setImportAliasesSet(importAliases); columnInfo.setDescription("The amount of this sample currently on hand."); @@ -1576,14 +1576,13 @@ public SampleTypeAmountDisplayColumn(TableInfo parent, String amountFieldName, S super(parent, FieldKey.fromParts(amountFieldName), new SQLFragment( "(CASE WHEN ").append(ExprColumn.STR_TABLE_ALIAS + ".").append(unitFieldName) .append(" = ? AND ").append(ExprColumn.STR_TABLE_ALIAS + ".").append(amountFieldName) - .append(" IS NOT NULL THEN ROUND(CAST(").append(ExprColumn.STR_TABLE_ALIAS + ".").append(amountFieldName) + .append(" IS NOT NULL THEN CAST(").append(ExprColumn.STR_TABLE_ALIAS + ".").append(amountFieldName) .append(" / ? AS ") .append(parent.getSqlDialect().isPostgreSQL() ? "DECIMAL" : "DOUBLE PRECISION") - .append("), ?) ELSE ").append(ExprColumn.STR_TABLE_ALIAS + ".").append(amountFieldName) + .append(") ELSE ").append(ExprColumn.STR_TABLE_ALIAS + ".").append(amountFieldName) .append(" END)") .add(typeUnit.getBase().toString()) - .add(typeUnit.getValue()) - .add(typeUnit.getPrecisionScale()), + .add(typeUnit.getValue()), JdbcType.DOUBLE); setLabel(label); @@ -1830,4 +1829,28 @@ public void overlayMetadata(String tableName, UserSchema schema, Collection