All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hazelcast.org.apache.calcite.plan.volcano.VolcanoCost Maven / Gradle / Ivy

There is a newer version: 5.5.0
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.hazelcast.org.apache.calcite.plan.volcano;

import com.hazelcast.org.apache.calcite.plan.RelOptCost;
import com.hazelcast.org.apache.calcite.plan.RelOptCostFactory;
import com.hazelcast.org.apache.calcite.plan.RelOptUtil;

import com.hazelcast.org.checkerframework.checker.nullness.qual.Nullable;

import java.util.Objects;

/**
 * VolcanoCost represents the cost of a plan node.
 *
 * 

This class is immutable: none of the methods modify any member * variables.

*/ class VolcanoCost implements RelOptCost { //~ Static fields/initializers --------------------------------------------- static final VolcanoCost INFINITY = new VolcanoCost( Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY) { @Override public String toString() { return "{inf}"; } }; static final VolcanoCost HUGE = new VolcanoCost(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE) { @Override public String toString() { return "{huge}"; } }; static final VolcanoCost ZERO = new VolcanoCost(0.0, 0.0, 0.0) { @Override public String toString() { return "{0}"; } }; static final VolcanoCost TINY = new VolcanoCost(1.0, 1.0, 0.0) { @Override public String toString() { return "{tiny}"; } }; public static final RelOptCostFactory FACTORY = new Factory(); //~ Instance fields -------------------------------------------------------- final double cpu; final double io; final double rowCount; //~ Constructors ----------------------------------------------------------- VolcanoCost(double rowCount, double cpu, double io) { this.rowCount = rowCount; this.cpu = cpu; this.io = io; } //~ Methods ---------------------------------------------------------------- @Override public double getCpu() { return cpu; } @Override public boolean isInfinite() { return (this == INFINITY) || (this.rowCount == Double.POSITIVE_INFINITY) || (this.cpu == Double.POSITIVE_INFINITY) || (this.io == Double.POSITIVE_INFINITY); } @Override public double getIo() { return io; } @Override public boolean isLe(RelOptCost other) { VolcanoCost that = (VolcanoCost) other; if (true) { return this == that || this.rowCount <= that.rowCount; } return (this == that) || ((this.rowCount <= that.rowCount) && (this.cpu <= that.cpu) && (this.io <= that.io)); } @Override public boolean isLt(RelOptCost other) { if (true) { VolcanoCost that = (VolcanoCost) other; return this.rowCount < that.rowCount; } return isLe(other) && !equals(other); } @Override public double getRows() { return rowCount; } @Override public int hashCode() { return Objects.hash(rowCount, cpu, io); } @SuppressWarnings("NonOverridingEquals") @Override public boolean equals(RelOptCost other) { return this == other || other instanceof VolcanoCost && (this.rowCount == ((VolcanoCost) other).rowCount) && (this.cpu == ((VolcanoCost) other).cpu) && (this.io == ((VolcanoCost) other).io); } @Override public boolean equals(@Nullable Object obj) { if (obj instanceof VolcanoCost) { return equals((VolcanoCost) obj); } return false; } @Override public boolean isEqWithEpsilon(RelOptCost other) { if (!(other instanceof VolcanoCost)) { return false; } VolcanoCost that = (VolcanoCost) other; return (this == that) || ((Math.abs(this.rowCount - that.rowCount) < RelOptUtil.EPSILON) && (Math.abs(this.cpu - that.cpu) < RelOptUtil.EPSILON) && (Math.abs(this.io - that.io) < RelOptUtil.EPSILON)); } @Override public RelOptCost minus(RelOptCost other) { if (this == INFINITY) { return this; } VolcanoCost that = (VolcanoCost) other; return new VolcanoCost( this.rowCount - that.rowCount, this.cpu - that.cpu, this.io - that.io); } @Override public RelOptCost multiplyBy(double factor) { if (this == INFINITY) { return this; } return new VolcanoCost(rowCount * factor, cpu * factor, io * factor); } @Override public double divideBy(RelOptCost cost) { // Compute the geometric average of the ratios of all of the factors // which are non-zero and finite. VolcanoCost that = (VolcanoCost) cost; double d = 1; double n = 0; if ((this.rowCount != 0) && !Double.isInfinite(this.rowCount) && (that.rowCount != 0) && !Double.isInfinite(that.rowCount)) { d *= this.rowCount / that.rowCount; ++n; } if ((this.cpu != 0) && !Double.isInfinite(this.cpu) && (that.cpu != 0) && !Double.isInfinite(that.cpu)) { d *= this.cpu / that.cpu; ++n; } if ((this.io != 0) && !Double.isInfinite(this.io) && (that.io != 0) && !Double.isInfinite(that.io)) { d *= this.io / that.io; ++n; } if (n == 0) { return 1.0; } return Math.pow(d, 1 / n); } @Override public RelOptCost plus(RelOptCost other) { VolcanoCost that = (VolcanoCost) other; if ((this == INFINITY) || (that == INFINITY)) { return INFINITY; } return new VolcanoCost( this.rowCount + that.rowCount, this.cpu + that.cpu, this.io + that.io); } @Override public String toString() { return "{" + rowCount + " rows, " + cpu + " cpu, " + io + " io}"; } /** Implementation of {@link com.hazelcast.org.apache.calcite.plan.RelOptCostFactory} * that creates {@link com.hazelcast.org.apache.calcite.plan.volcano.VolcanoCost}s. */ private static class Factory implements RelOptCostFactory { @Override public RelOptCost makeCost(double dRows, double dCpu, double dIo) { return new VolcanoCost(dRows, dCpu, dIo); } @Override public RelOptCost makeHugeCost() { return VolcanoCost.HUGE; } @Override public RelOptCost makeInfiniteCost() { return VolcanoCost.INFINITY; } @Override public RelOptCost makeTinyCost() { return VolcanoCost.TINY; } @Override public RelOptCost makeZeroCost() { return VolcanoCost.ZERO; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy