presto-main/src/main/java/io/prestosql/cost/SymbolStatsEstimate.java/SymbolStatsEstimate/SymbolStatsEstimate
class SymbolStatsEstimate:    @JsonCreator
    public SymbolStatsEstimate(
            @JsonProperty("lowValue") double lowValue,
            @JsonProperty("highValue") double highValue,
            @JsonProperty("nullsFraction") double nullsFraction,
            @JsonProperty("averageRowSize") double averageRowSize,
            @JsonProperty("distinctValuesCount") double distinctValuesCount)
    {
        checkArgument(
                lowValue <= highValue || (isNaN(lowValue) && isNaN(highValue)),
                "low value must be less than or equal to high value or both values have to be NaN, got %s and %s respectively",
                lowValue,
                highValue);
        this.lowValue = lowValue;
        this.highValue = highValue;

        checkArgument(
                (0 <= nullsFraction && nullsFraction <= 1.) || isNaN(nullsFraction),
                "Nulls fraction should be within [0, 1] or NaN, got: %s",
                nullsFraction);
        boolean isEmptyRange = isNaN(lowValue) && isNaN(highValue);
        this.nullsFraction = isEmptyRange ? 1.0 : nullsFraction;

        checkArgument(averageRowSize >= 0 || isNaN(averageRowSize), "Average row size should be non-negative or NaN, got: %s", averageRowSize);
        this.averageRowSize = averageRowSize;

        checkArgument(distinctValuesCount >= 0 || isNaN(distinctValuesCount), "Distinct values count should be non-negative, got: %s", distinctValuesCount);
        // TODO normalize distinctValuesCount for an empty range (or validate it is already normalized)
        this.distinctValuesCount = distinctValuesCount;
    }