diff --git a/datafusion/__init__.py b/datafusion/__init__.py index 9de141636..c3b76d2e6 100644 --- a/datafusion/__init__.py +++ b/datafusion/__init__.py @@ -80,6 +80,7 @@ CreateMemoryTable, SubqueryAlias, Extension, + CreateView, ) __version__ = importlib_metadata.version(__name__) @@ -135,6 +136,7 @@ "SubqueryAlias", "Extension", "CreateMemoryTable", + "CreateView", ] diff --git a/datafusion/tests/test_imports.py b/datafusion/tests/test_imports.py index 76fbc481c..ed9f710d0 100644 --- a/datafusion/tests/test_imports.py +++ b/datafusion/tests/test_imports.py @@ -81,6 +81,7 @@ Explain, Extension, CreateMemoryTable, + CreateView, ) @@ -151,6 +152,7 @@ def test_class_module_is_datafusion(): Explain, Extension, CreateMemoryTable, + CreateView, ]: assert klass.__module__ == "datafusion.expr" diff --git a/src/expr.rs b/src/expr.rs index 5cf712d09..71a6c0b91 100644 --- a/src/expr.rs +++ b/src/expr.rs @@ -48,6 +48,7 @@ pub mod case; pub mod cast; pub mod column; pub mod create_memory_table; +pub mod create_view; pub mod cross_join; pub mod empty_relation; pub mod exists; @@ -280,6 +281,7 @@ pub(crate) fn init_module(m: &PyModule) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; m.add_class::()?; Ok(()) } diff --git a/src/expr/create_view.rs b/src/expr/create_view.rs new file mode 100644 index 000000000..9d06239ea --- /dev/null +++ b/src/expr/create_view.rs @@ -0,0 +1,94 @@ +// 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. + +use std::fmt::{self, Display, Formatter}; + +use datafusion_expr::CreateView; +use pyo3::prelude::*; + +use crate::sql::logical::PyLogicalPlan; + +use super::logical_node::LogicalNode; + +#[pyclass(name = "CreateView", module = "datafusion.expr", subclass)] +#[derive(Clone)] +pub struct PyCreateView { + create: CreateView, +} + +impl From for CreateView { + fn from(create: PyCreateView) -> Self { + create.create + } +} + +impl From for PyCreateView { + fn from(create: CreateView) -> PyCreateView { + PyCreateView { create } + } +} + +impl Display for PyCreateView { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!( + f, + "CreateView + name: {:?} + input: {:?} + or_replace: {:?} + definition: {:?}", + &self.create.name, &self.create.input, &self.create.or_replace, &self.create.definition, + ) + } +} + +#[pymethods] +impl PyCreateView { + fn name(&self) -> PyResult { + Ok(self.create.name.to_string()) + } + + fn input(&self) -> PyResult> { + Ok(Self::inputs(self)) + } + + fn or_replace(&self) -> bool { + self.create.or_replace + } + + fn definition(&self) -> PyResult> { + Ok(self.create.definition.clone()) + } + + fn __repr__(&self) -> PyResult { + Ok(format!("CreateView({})", self)) + } + + fn __name__(&self) -> PyResult { + Ok("CreateView".to_string()) + } +} + +impl LogicalNode for PyCreateView { + fn inputs(&self) -> Vec { + vec![PyLogicalPlan::from((*self.create.input).clone())] + } + + fn to_variant(&self, py: Python) -> PyResult { + Ok(self.clone().into_py(py)) + } +}