org.apache.calcite.plan.RelTraitDef Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of calcite-core Show documentation
Show all versions of calcite-core Show documentation
Core Calcite APIs and engine.
/*
* 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 org.apache.calcite.plan;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.convert.ConverterRule;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.List;
import javax.annotation.Nonnull;
/**
* RelTraitDef represents a class of {@link RelTrait}s. Implementations of
* RelTraitDef may be singletons under the following conditions:
*
*
* - if the set of all possible associated RelTraits is finite and fixed (e.g.
* all RelTraits for this RelTraitDef are known at compile time). For example,
* the CallingConvention trait meets this requirement, because CallingConvention
* is effectively an enumeration.
* - Either
*
*
* - {@link #canConvert(RelOptPlanner, RelTrait, RelTrait)} and
* {@link #convert(RelOptPlanner, RelNode, RelTrait, boolean)} do not require
* planner-instance-specific information, or
*
* - the RelTraitDef manages separate sets of conversion data internally. See
* {@link ConventionTraitDef} for an example of this.
*
*
*
*
* Otherwise, a new instance of RelTraitDef must be constructed and
* registered with each new planner instantiated.
*
* @param Trait that this trait definition is based upon
*/
public abstract class RelTraitDef {
//~ Instance fields --------------------------------------------------------
private final LoadingCache canonicalMap =
CacheBuilder.newBuilder()
.softValues()
.build(CacheLoader.from(key -> key));
/** Cache of composite traits.
*
* Uses soft values to allow GC.
*
*
You can look up using a {@link RelCompositeTrait} whose constituent
* traits are not canonized.
*/
private final LoadingCache
© 2015 - 2024 Weber Informatics LLC | Privacy Policy