blob: 7159356e3b12c7993a1bcedfaedd24a45a4e1925 [file] [log] [blame]
/*
* 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.beam.sdk.extensions.sql.zetasql.translation;
import com.google.zetasql.resolvedast.ResolvedNode;
import com.google.zetasql.resolvedast.ResolvedNodes.ResolvedWithScan;
import java.util.Collections;
import java.util.List;
import org.apache.beam.vendor.calcite.v1_20_0.org.apache.calcite.rel.RelNode;
/** Converts a named WITH. */
class WithScanConverter extends RelConverter<ResolvedWithScan> {
WithScanConverter(ConversionContext context) {
super(context);
}
@Override
public List<ResolvedNode> getInputs(ResolvedWithScan zetaNode) {
// We must persist the named WITH queries nodes,
// so that when they are referenced by name (e.g. in FROM/JOIN), we can
// resolve them. We need this because the nodes that represent the references (WithRefScan)
// only contain the names of the queries, so we need to keep this map for resolution of the
// names.
zetaNode
.getWithEntryList()
.forEach(withEntry -> getTrait().withEntries.put(withEntry.getWithQueryName(), withEntry));
// Returning the body of the query, it is something like ProjectScan that will be converted
// by ProjectScanConverter before it reaches the convert() method below.
return Collections.singletonList(zetaNode.getQuery());
}
@Override
public RelNode convert(ResolvedWithScan zetaNode, List<RelNode> inputs) {
// The body of the WITH query is already converted at this point so we just
// return it, nothing else is needed.
return inputs.get(0);
}
}