Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions presto-docs/src/main/sphinx/develop/spi-overview.rst
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ factories.
+----------------------+----------------------------------------------+---------------------------------------+
| Types | NativeTypeManagerFactory | NativeTypeManager |
+----------------------+----------------------------------------------+---------------------------------------+
| Expression Optimizer | NativeExpressionOptimizerFactory | NativeExpressionOptimizer |
+----------------------+----------------------------------------------+---------------------------------------+
| Plan Checker | NativePlanCheckerProviderFactory | NativePlanCheckerProvider |
+----------------------+----------------------------------------------+---------------------------------------+

Expand Down
16 changes: 16 additions & 0 deletions presto-docs/src/main/sphinx/presto_cpp/properties-session.rst
Original file line number Diff line number Diff line change
Expand Up @@ -487,3 +487,19 @@ This is used in global arbitration victim selection.

Maximum number of splits to listen to by the SplitListener per table scan node per
native worker.


Sidecar Session Properties
--------------------------

The following session properties apply for Presto C++ deployed with native sidecar.

``expression_optimizer_name``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

* **Type:** ``varchar``
* **Default value:** ``default``

The default expression optimizer uses Presto Java function implementations. Set
this to ``native`` to use the native expression optimizer, which uses Presto C++
function implementations.
7 changes: 7 additions & 0 deletions presto-docs/src/main/sphinx/presto_cpp/sidecar.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,13 @@ The following HTTP endpoints are implemented by the Presto C++ sidecar.
validates the Velox plan. Returns any errors encountered during plan
conversion.

.. function:: POST /v1/expressions

Optimizes ``RowExpression``\s from input json array by applying logical
rewrites and recursively constant folding expressions in a bottom up
manner using the native execution engine ``Velox``. Returns a list
of optimized ``RowExpression``\s.

Configuration Properties
------------------------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,18 @@
public class HandleJsonModule
implements Module
{
private final HandleResolver handleResolver;

public HandleJsonModule()
{
this(null);
}

public HandleJsonModule(HandleResolver handleResolver)
{
this.handleResolver = handleResolver;
}

@Override
public void configure(Binder binder)
{
Expand All @@ -38,6 +50,11 @@ public void configure(Binder binder)
jsonBinder(binder).addModuleBinding().to(PartitioningHandleJacksonModule.class);
jsonBinder(binder).addModuleBinding().to(FunctionHandleJacksonModule.class);

binder.bind(HandleResolver.class).in(Scopes.SINGLETON);
if (handleResolver == null) {
binder.bind(HandleResolver.class).in(Scopes.SINGLETON);
}
else {
binder.bind(HandleResolver.class).toInstance(handleResolver);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.facebook.presto.nodeManager.PluginNodeManager;
import com.facebook.presto.spi.ConnectorSession;
import com.facebook.presto.spi.NodeManager;
import com.facebook.presto.spi.RowExpressionSerde;
import com.facebook.presto.spi.relation.ExpressionOptimizer;
import com.facebook.presto.spi.relation.ExpressionOptimizerProvider;
import com.facebook.presto.spi.sql.planner.ExpressionOptimizerContext;
Expand Down Expand Up @@ -52,23 +53,25 @@ public class ExpressionOptimizerManager

private final NodeManager nodeManager;
private final FunctionAndTypeManager functionAndTypeManager;
private final RowExpressionSerde rowExpressionSerde;
private final FunctionResolution functionResolution;
private final File configurationDirectory;

private final Map<String, ExpressionOptimizerFactory> expressionOptimizerFactories = new ConcurrentHashMap<>();
private final Map<String, ExpressionOptimizer> expressionOptimizers = new ConcurrentHashMap<>();

@Inject
public ExpressionOptimizerManager(PluginNodeManager nodeManager, FunctionAndTypeManager functionAndTypeManager)
public ExpressionOptimizerManager(PluginNodeManager nodeManager, FunctionAndTypeManager functionAndTypeManager, RowExpressionSerde rowExpressionSerde)
{
this(nodeManager, functionAndTypeManager, EXPRESSION_MANAGER_CONFIGURATION_DIRECTORY);
this(nodeManager, functionAndTypeManager, rowExpressionSerde, EXPRESSION_MANAGER_CONFIGURATION_DIRECTORY);
}

public ExpressionOptimizerManager(PluginNodeManager nodeManager, FunctionAndTypeManager functionAndTypeManager, File configurationDirectory)
public ExpressionOptimizerManager(PluginNodeManager nodeManager, FunctionAndTypeManager functionAndTypeManager, RowExpressionSerde rowExpressionSerde, File configurationDirectory)
{
requireNonNull(nodeManager, "nodeManager is null");
this.nodeManager = requireNonNull(nodeManager, "nodeManager is null");
this.functionAndTypeManager = requireNonNull(functionAndTypeManager, "functionAndTypeManager is null");
this.rowExpressionSerde = requireNonNull(rowExpressionSerde, "rowExpressionSerde is null");
this.functionResolution = new FunctionResolution(functionAndTypeManager.getFunctionAndTypeResolver());
this.configurationDirectory = requireNonNull(configurationDirectory, "configurationDirectory is null");
expressionOptimizers.put(DEFAULT_EXPRESSION_OPTIMIZER_NAME, new RowExpressionOptimizer(functionAndTypeManager));
Expand All @@ -88,7 +91,7 @@ public void loadExpressionOptimizerFactories()
}
}

private void loadExpressionOptimizerFactory(File configurationFile)
public void loadExpressionOptimizerFactory(File configurationFile)
throws IOException
{
String name = getNameWithoutExtension(configurationFile.getName());
Expand All @@ -98,13 +101,19 @@ private void loadExpressionOptimizerFactory(File configurationFile)
Map<String, String> properties = new HashMap<>(loadProperties(configurationFile));
String factoryName = properties.remove(EXPRESSION_MANAGER_FACTORY_NAME);
checkArgument(!isNullOrEmpty(factoryName), "%s does not contain %s", configurationFile, EXPRESSION_MANAGER_FACTORY_NAME);
loadExpressionOptimizerFactory(factoryName, name, properties);
}

public void loadExpressionOptimizerFactory(String factoryName, String expressionOptimizerName, Map<String, String> properties)
{
requireNonNull(factoryName, "factoryName is null");
checkArgument(expressionOptimizerFactories.containsKey(factoryName),
"ExpressionOptimizerFactory %s is not registered, registered factories: ", factoryName, expressionOptimizerFactories.keySet());

ExpressionOptimizer optimizer = expressionOptimizerFactories.get(factoryName).createOptimizer(
properties,
new ExpressionOptimizerContext(nodeManager, functionAndTypeManager, functionResolution));
expressionOptimizers.put(name, optimizer);
new ExpressionOptimizerContext(nodeManager, rowExpressionSerde, functionAndTypeManager, functionResolution));
expressionOptimizers.put(expressionOptimizerName, optimizer);
}

public void addExpressionOptimizerFactory(ExpressionOptimizerFactory expressionOptimizerFactory)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* 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.facebook.presto.sql.expressions;

import com.facebook.airlift.json.JsonCodec;
import com.facebook.presto.spi.RowExpressionSerde;
import com.facebook.presto.spi.relation.RowExpression;

import javax.inject.Inject;

import java.nio.charset.StandardCharsets;

import static java.util.Objects.requireNonNull;

public class JsonCodecRowExpressionSerde
implements RowExpressionSerde
{
private final JsonCodec<RowExpression> codec;

@Inject
public JsonCodecRowExpressionSerde(JsonCodec<RowExpression> codec)
{
this.codec = requireNonNull(codec, "codec is null");
}

@Override
public String serialize(RowExpression expression)
{
return new String(codec.toBytes(expression), StandardCharsets.UTF_8);
}

@Override
public RowExpression deserialize(String data)
{
return codec.fromBytes(data.getBytes(StandardCharsets.UTF_8));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@
import com.facebook.presto.spi.plan.SimplePlanFragment;
import com.facebook.presto.spi.plan.StageExecutionDescriptor;
import com.facebook.presto.spi.plan.TableScanNode;
import com.facebook.presto.spi.relation.RowExpression;
import com.facebook.presto.spiller.FileSingleStreamSpillerFactory;
import com.facebook.presto.spiller.GenericPartitioningSpillerFactory;
import com.facebook.presto.spiller.GenericSpillerFactory;
Expand All @@ -176,6 +177,7 @@
import com.facebook.presto.sql.analyzer.QueryExplainer;
import com.facebook.presto.sql.analyzer.QueryPreparerProviderManager;
import com.facebook.presto.sql.expressions.ExpressionOptimizerManager;
import com.facebook.presto.sql.expressions.JsonCodecRowExpressionSerde;
import com.facebook.presto.sql.gen.ExpressionCompiler;
import com.facebook.presto.sql.gen.JoinCompiler;
import com.facebook.presto.sql.gen.JoinFilterFunctionCompiler;
Expand Down Expand Up @@ -465,7 +467,7 @@ private LocalQueryRunner(Session defaultSession, FeaturesConfig featuresConfig,
this.pageIndexerFactory = new GroupByHashPageIndexerFactory(joinCompiler);

NodeInfo nodeInfo = new NodeInfo("test");
expressionOptimizerManager = new ExpressionOptimizerManager(new PluginNodeManager(nodeManager, nodeInfo.getEnvironment()), getFunctionAndTypeManager());
expressionOptimizerManager = new ExpressionOptimizerManager(new PluginNodeManager(nodeManager, nodeInfo.getEnvironment()), getFunctionAndTypeManager(), new JsonCodecRowExpressionSerde(jsonCodec(RowExpression.class)));

this.accessControl = new TestingAccessControlManager(transactionManager);
this.statsNormalizer = new StatsNormalizer();
Expand Down
Loading
Loading