This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit a029082e446bf3fd9f83709e567dbd58fbc826e2 Author: Martin Desruisseaux <[email protected]> AuthorDate: Fri Feb 22 19:52:20 2019 +0100 Variable.hasRealValues() should take in account the transfer function that may be overridden in Convention. Add a Variable.getRole() convenience method. --- .../operation/transform/TransferFunction.java | 15 +++++++++++++++ .../operation/transform/TransferFunctionTest.java | 5 +++++ .../java/org/apache/sis/internal/netcdf/Variable.java | 19 ++++++++++++++++++- .../sis/internal/netcdf/impl/ChannelDecoder.java | 2 +- .../org/apache/sis/storage/netcdf/GridResource.java | 4 ++-- .../org/apache/sis/storage/netcdf/MetadataReader.java | 2 +- .../org/apache/sis/internal/netcdf/VariableTest.java | 5 ++--- 7 files changed, 44 insertions(+), 8 deletions(-) diff --git a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java index 8852b00..1bd7676 100644 --- a/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java +++ b/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/transform/TransferFunction.java @@ -102,6 +102,8 @@ public class TransferFunction implements Cloneable, Serializable { /** * Creates a transfer function initialized to the identity transform. + * + * @see #isIdentity() */ public TransferFunction() { type = TransferFunctionType.LINEAR; @@ -110,6 +112,19 @@ public class TransferFunction implements Cloneable, Serializable { } /** + * Returns {@code true} if this transfer function is identity. The function is identity if + * its {@linkplain #getType() type} is {@linkplain TransferFunctionType#LINEAR linear}, + * its {@linkplain #getScale() scale} is 1 and its {@linkplain #getOffset() offset} is 0. + * + * @return whether this transfer function is identity. + * + * @since 1.0 + */ + public boolean isIdentity() { + return TransferFunctionType.LINEAR.equals(type) && scale == 1 && offset == 0; + } + + /** * Returns the transfer function type (linear, logarithmic or exponential). * * @return the transfer function type. diff --git a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java index af7063f..2c960f4 100644 --- a/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java +++ b/core/sis-referencing/src/test/java/org/apache/sis/referencing/operation/transform/TransferFunctionTest.java @@ -52,6 +52,7 @@ public final strictfp class TransferFunctionTest extends TestCase { assertEquals("scale", 1, f.getScale(), STRICT); assertEquals("offset", 0, f.getOffset(), STRICT); assertEquals("toString", "y = x", f.toString()); + assertTrue ("isIdentity", f.isIdentity()); f.setScale(0.15); f.setOffset(-2); @@ -69,6 +70,7 @@ public final strictfp class TransferFunctionTest extends TestCase { assertEquals("base", 1, b.getBase(), STRICT); assertEquals("scale", 0.15, b.getScale(), STRICT); assertEquals("offset", -2, b.getOffset(), STRICT); + assertFalse ("isIdentity", b.isIdentity()); } /** @@ -93,6 +95,7 @@ public final strictfp class TransferFunctionTest extends TestCase { assertEquals("base", 10, b.getBase(), STRICT); assertEquals("scale", 1, b.getScale(), STRICT); assertEquals("offset", -2, b.getOffset(), STRICT); + assertFalse ("isIdentity", b.isIdentity()); } /** @@ -117,6 +120,7 @@ public final strictfp class TransferFunctionTest extends TestCase { assertEquals("base", 10, b.getBase(), STRICT); assertEquals("scale", 0.15, b.getScale(), STRICT); assertEquals("offset", 0, b.getOffset(), STRICT); + assertFalse ("isIdentity", b.isIdentity()); } /** @@ -141,6 +145,7 @@ public final strictfp class TransferFunctionTest extends TestCase { assertEquals("base", 10, b.getBase(), STRICT); assertEquals("scale", 0.15, b.getScale(), 1E-16); assertEquals("offset", -2, b.getOffset(), 1E-16); + assertFalse ("isIdentity", b.isIdentity()); } /** diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java index a6dfaaf..fe9084c 100644 --- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java +++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/Variable.java @@ -259,6 +259,11 @@ public abstract class Variable extends NamedElement { public final boolean hasRealValues() { final int n = getDataType().number; if (n == Numbers.FLOAT | n == Numbers.DOUBLE) { + final Convention convention = decoder.convention(); + if (convention != Convention.DEFAULT) { + return convention.transferFunction(this).isIdentity(); + } + // Shortcut for common case. double c = getAttributeAsNumber(CDM.SCALE_FACTOR); if (Double.isNaN(c) || c == 1) { c = getAttributeAsNumber(CDM.ADD_OFFSET); @@ -279,6 +284,18 @@ public abstract class Variable extends NamedElement { public abstract DataType getDataType(); /** + * Returns whether this variable is used as a coordinate system axis, a coverage or something else. + * This is a shortcut for {@link Convention#roleOf(Variable)}, except that {@code this} can not be null. + * + * @return role of this variable. + * + * @see Convention#roleOf(Variable) + */ + public final VariableRole getRole() { + return decoder.convention().roleOf(this); + } + + /** * Returns whether this variable can grow. A variable is unlimited if at least one of its dimension is unlimited. * In netCDF 3 classic format, only the first dimension can be unlimited. * @@ -347,7 +364,7 @@ public abstract class Variable extends NamedElement { final List<Variable> axes = new ArrayList<>(); final Map<Object,Dimension> domain = new HashMap<>(); for (final Variable candidate : decoder.getVariables()) { - if (convention.roleOf(candidate) == VariableRole.AXIS) { + if (candidate.getRole() == VariableRole.AXIS) { axes.add(candidate); for (final Dimension dim : candidate.getGridDimensions()) { domain.put(dim, dim); diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java index 7ce2a53..e5b6abf 100644 --- a/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java +++ b/storage/sis-netcdf/src/main/java/org/apache/sis/internal/netcdf/impl/ChannelDecoder.java @@ -921,7 +921,7 @@ public final class ChannelDecoder extends Decoder { */ final Map<DimensionInfo, List<VariableInfo>> dimToAxes = new IdentityHashMap<>(); for (final VariableInfo variable : variables) { - switch (convention().roleOf(variable)) { + switch (variable.getRole()) { case COVERAGE: { // If Convention.roleOf(…) overwrote the value computed by VariableInfo, // remember the new value for avoiding to ask again in next loops. diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java index 611b534..bc17a45 100644 --- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java +++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/GridResource.java @@ -162,7 +162,7 @@ final class GridResource extends AbstractGridResource implements ResourceOnFileS final List<Resource> resources = new ArrayList<>(); for (int i=0; i<variables.length; i++) { final Variable variable = variables[i]; - if (decoder.convention().roleOf(variable) != VariableRole.COVERAGE) { + if (decoder.convention().roleOf(variable) != VariableRole.COVERAGE) { // Variable may be null. continue; // Skip variables that are not grid coverages. } final GridGeometry grid = variable.getGridGeometry(); @@ -190,7 +190,7 @@ final class GridResource extends AbstractGridResource implements ResourceOnFileS int suffixLength = name.length() - suffixStart; for (int j=i; ++j < variables.length;) { final Variable candidate = variables[j]; - if (decoder.convention().roleOf(candidate) != VariableRole.COVERAGE) { + if (decoder.convention().roleOf(candidate) != VariableRole.COVERAGE) { // Variable may be null. variables[j] = null; // For avoiding to revisit that variable again. continue; } diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java index ca8f55a..4b43741 100644 --- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java +++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/MetadataReader.java @@ -895,7 +895,7 @@ split: while ((start = CharSequences.skipLeadingWhitespaces(value, start, lengt private void addContentInfo() { final Map<List<String>, List<Variable>> contents = new HashMap<>(4); for (final Variable variable : decoder.getVariables()) { - if (decoder.convention().roleOf(variable) == VariableRole.COVERAGE) { + if (variable.getRole() == VariableRole.COVERAGE) { final List<org.apache.sis.internal.netcdf.Dimension> dimensions = variable.getGridDimensions(); final String[] names = new String[dimensions.size()]; for (int i=0; i<names.length; i++) { diff --git a/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java b/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java index b7710b8..e200ff0 100644 --- a/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java +++ b/storage/sis-netcdf/src/test/java/org/apache/sis/internal/netcdf/VariableTest.java @@ -93,7 +93,7 @@ public strictfp class VariableTest extends TestCase { * <li>{@link Variable#getDescription()}</li> * <li>{@link Variable#getDataType()}</li> * <li>{@link Variable#getGridDimensions()} length</li> - * <li>{@link Convention#roleOf(Variable)}</li> + * <li>{@link Variable#getRole()}</li> * </ul> * * @throws IOException if an I/O error occurred while opening the file. @@ -120,7 +120,6 @@ public strictfp class VariableTest extends TestCase { * @param variables the variable for which to test properties. */ private static void assertBasicPropertiesEqual(final Object[] expected, final Variable[] variables) { - final Convention convention = new Convention(); int propertyIndex = 0; for (final Variable variable : variables) { final String name = variable.getName(); @@ -130,7 +129,7 @@ public strictfp class VariableTest extends TestCase { assertEquals(name, expected[propertyIndex++], variable.getDescription()); assertEquals(name, expected[propertyIndex++], dataType); assertEquals(name, expected[propertyIndex++], variable.getGridDimensions().size()); - assertEquals(name, expected[propertyIndex++], convention.roleOf(variable)); + assertEquals(name, expected[propertyIndex++], variable.getRole()); assertEquals(0, propertyIndex % NUM_BASIC_PROPERTY_COLUMNS); // Sanity check for VariableTest itself. } assertEquals("Expected more variables.",
