/*
* 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.eigenbase.relopt;
import org.eigenbase.rel.*;
import org.eigenbase.rel.metadata.*;
import org.eigenbase.reltype.*;
import org.eigenbase.rex.*;
/**
* A <code>RelOptCluster</code> is a collection of {@link RelNode relational
* expressions} which have the same environment.
*
* <p>See the comment against <code>net.sf.saffron.oj.xlat.QueryInfo</code> on
* why you should put fields in that class, not this one.</p>
*/
public class RelOptCluster {
//~ Instance fields --------------------------------------------------------
private final RelDataTypeFactory typeFactory;
private final RelOptQuery query;
private final RelOptPlanner planner;
private RexNode originalExpression;
private final RexBuilder rexBuilder;
private RelMetadataProvider metadataProvider;
private MetadataFactory metadataFactory;
private final RelTraitSet emptyTraitSet;
//~ Constructors -----------------------------------------------------------
/**
* Creates a cluster.
*/
RelOptCluster(
RelOptQuery query,
RelOptPlanner planner,
RelDataTypeFactory typeFactory,
RexBuilder rexBuilder) {
assert planner != null;
assert typeFactory != null;
this.query = query;
this.planner = planner;
this.typeFactory = typeFactory;
this.rexBuilder = rexBuilder;
this.originalExpression = rexBuilder.makeLiteral("?");
// set up a default rel metadata provider,
// giving the planner first crack at everything
setMetadataProvider(new DefaultRelMetadataProvider());
this.emptyTraitSet = planner.emptyTraitSet();
}
//~ Methods ----------------------------------------------------------------
public RelOptQuery getQuery() {
return query;
}
public RexNode getOriginalExpression() {
return originalExpression;
}
public void setOriginalExpression(RexNode originalExpression) {
this.originalExpression = originalExpression;
}
public RelOptPlanner getPlanner() {
return planner;
}
public RelDataTypeFactory getTypeFactory() {
return typeFactory;
}
public RexBuilder getRexBuilder() {
return rexBuilder;
}
public RelMetadataProvider getMetadataProvider() {
return metadataProvider;
}
/**
* Overrides the default metadata provider for this cluster.
*
* @param metadataProvider custom provider
*/
public void setMetadataProvider(RelMetadataProvider metadataProvider) {
this.metadataProvider = metadataProvider;
this.metadataFactory = new MetadataFactoryImpl(metadataProvider);
}
public MetadataFactory getMetadataFactory() {
return metadataFactory;
}
public RelTraitSet traitSetOf(RelTrait... traits) {
RelTraitSet traitSet = emptyTraitSet;
assert traitSet.size() == planner.getRelTraitDefs().size();
for (RelTrait trait : traits) {
traitSet = traitSet.replace(trait);
}
return traitSet;
}
}
// End RelOptCluster.java