/* * Licensed to CRATE Technology GmbH ("Crate") under one or more contributor * license agreements. See the NOTICE file distributed with this work for * additional information regarding copyright ownership. Crate 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. * * However, if you have executed another commercial license agreement * with Crate these terms will supersede the license and you may use the * software solely pursuant to the terms of the relevant commercial agreement. */ package io.crate.planner.projection; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import io.crate.analyze.symbol.Symbol; import io.crate.metadata.RowGranularity; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import javax.annotation.Nullable; import java.io.IOException; import java.util.List; import java.util.function.Function; public abstract class Projection { public static final Predicate<Projection> IS_SHARD_PROJECTION = new Predicate<Projection>() { @Override public boolean apply(@Nullable Projection projection) { return projection != null && projection.requiredGranularity() == RowGranularity.SHARD; } }; public static final Predicate<Projection> IS_NODE_PROJECTION = Predicates.not(IS_SHARD_PROJECTION); /** * The granularity required to run this projection * <p> * For example: * <p> * CLUSTER - projection may run in any context on the cluster and receive any rows. * <p> * SHARD - projection must be run in a shard-context and it must only receive rows from a * single shard. */ public RowGranularity requiredGranularity() { return RowGranularity.CLUSTER; } public abstract void replaceSymbols(Function<Symbol, Symbol> replaceFunction); public interface ProjectionFactory<T extends Projection> { T newInstance(StreamInput in) throws IOException; } public abstract ProjectionType projectionType(); public abstract <C, R> R accept(ProjectionVisitor<C, R> visitor, C context); public abstract List<? extends Symbol> outputs(); public static void toStream(Projection projection, StreamOutput out) throws IOException { out.writeVInt(projection.projectionType().ordinal()); projection.writeTo(out); } public static Projection fromStream(StreamInput in) throws IOException { return ProjectionType.values()[in.readVInt()].newInstance(in); } public abstract void writeTo(StreamOutput out) throws IOException; // force subclasses to implement equality @Override public abstract boolean equals(Object obj); @Override public int hashCode() { return projectionType().hashCode(); } }