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

com.speedment.runtime.core.internal.component.sql.SqlStreamOptimizerComponentImpl Maven / Gradle / Ivy

Go to download

A Speedment bundle that shades all dependencies into one jar. This is useful when deploying an application on a server.

There is a newer version: 3.1.18
Show newest version
/**
 *
 * Copyright (c) 2006-2019, Speedment, Inc. All Rights Reserved.
 *
 * Licensed 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.speedment.runtime.core.internal.component.sql;

import static com.speedment.common.logger.Level.DEBUG;
import com.speedment.common.logger.Logger;
import com.speedment.common.logger.LoggerManager;
import com.speedment.runtime.core.ApplicationBuilder;
import com.speedment.runtime.core.component.sql.*;
import com.speedment.runtime.core.db.AsynchronousQueryResult;
import com.speedment.runtime.core.db.DbmsType;
import com.speedment.runtime.core.internal.component.sql.optimizer.FilterSortedSkipOptimizer;
import com.speedment.runtime.core.internal.component.sql.optimizer.InitialFilterOptimizer;
import com.speedment.runtime.core.stream.Pipeline;
import java.util.Comparator;
import static java.util.Comparator.comparingInt;
import java.util.List;
import static java.util.Objects.requireNonNull;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 *
 * @author Per Minborg
 */
public final class SqlStreamOptimizerComponentImpl implements SqlStreamOptimizerComponent {

    private static final Logger LOGGER_STREAM_OPTIMIZER = LoggerManager.getLogger(ApplicationBuilder.LogType.STREAM_OPTIMIZER.getLoggerName());

    private static final SqlStreamOptimizer FALL_BACK = new FallbackStreamOptimizer<>();

    private final List> optimizers;

    public SqlStreamOptimizerComponentImpl() {
        this.optimizers = new CopyOnWriteArrayList<>();
        install(new InitialFilterOptimizer<>());
        install(new FilterSortedSkipOptimizer<>());
    }

    @Override
    public  SqlStreamOptimizer get(Pipeline initialPipeline, DbmsType dbmsType) {
        if (DEBUG.isEqualOrHigherThan(LOGGER_STREAM_OPTIMIZER.getLevel())) {
            LOGGER_STREAM_OPTIMIZER.debug("Evaluating %s pipeline: %s", initialPipeline.isParallel() ? "parallel" : "sequential", initialPipeline.toString());
        }
        final SqlStreamOptimizer result = getHelper(initialPipeline, dbmsType);
        if (DEBUG.isEqualOrHigherThan(LOGGER_STREAM_OPTIMIZER.getLevel())) {
            LOGGER_STREAM_OPTIMIZER.debug("Selected: %s", result.getClass().getSimpleName());
        }
        return result;
    }

    private static final Comparator METRICS_COMPARATOR
        = comparingInt(Metrics::getPipelineReductions)
            .thenComparing(comparingInt(Metrics::getSqlCount).reversed());

    private  SqlStreamOptimizer getHelper(Pipeline initialPipeline, DbmsType dbmsType) {
        @SuppressWarnings("unchecked")
        SqlStreamOptimizer result = (SqlStreamOptimizer) FALL_BACK;
        if (initialPipeline.isEmpty()) {
            return result;
        }

        Metrics metric = Metrics.empty();
        for (int i = optimizers.size() - 1; i >= 0; i--) {
            @SuppressWarnings("unchecked")
            final SqlStreamOptimizer candidate = (SqlStreamOptimizer) optimizers.get(i);
            final Metrics candidateMetric = candidate.metrics(initialPipeline, dbmsType);
            if (DEBUG.isEqualOrHigherThan(LOGGER_STREAM_OPTIMIZER.getLevel())) {
                LOGGER_STREAM_OPTIMIZER.debug("Candidate: %-30s : %s ", candidate.getClass().getSimpleName(), candidateMetric);
            }
            if (METRICS_COMPARATOR.compare(candidateMetric, metric) > 0) {
//            if (candidateMetric.getPipelineReductions() > metric.getPipelineReductions()) {
                metric = candidateMetric;
                result = candidate;
                if (metric.getPipelineReductions() == Integer.MAX_VALUE) {
                    return result;
                }
            }
        }
        return result;
    }

    @Override
    public  void install(SqlStreamOptimizer sqlStreamOptimizer) {
        requireNonNull(sqlStreamOptimizer);
        optimizers.add(sqlStreamOptimizer);
    }

    private static class FallbackStreamOptimizer implements SqlStreamOptimizer {

        @Override
        public 

Metrics metrics(P initialPipeline, DbmsType dbmsType) { return Metrics.empty(); } @Override public

P optimize(P initialPipeline, SqlStreamOptimizerInfo info, AsynchronousQueryResult query) { return initialPipeline; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy