8000 Create view bindings (#273) · chenqin/arrow-datafusion-python@e5ae43b · GitHub
[go: up one dir, main page]

Skip to content

Commit e5ae43b

Browse files
authored
Create view bindings (apache#273)
1 parent 325b7ce commit e5ae43b

File tree

4 files changed

+100
-0
lines changed

4 files changed

+100
-0
lines changed

datafusion/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
CreateMemoryTable,
8181
SubqueryAlias,
8282
Extension,
83+
CreateView,
8384
)
8485

8586
__version__ = importlib_metadata.version(__name__)
@@ -135,6 +136,7 @@
135136
"SubqueryAlias",
136137
"Extension",
137138
"CreateMemoryTable",
139+
"CreateView",
138140
]
139141

140142

datafusion/tests/test_imports.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
Explain,
8282
Extension,
8383
CreateMemoryTable,
84+
CreateView,
8485
)
8586

8687

@@ -151,6 +152,7 @@ def test_class_module_is_datafusion():
151152
Explain,
152153
Extension,
153154
CreateMemoryTable,
155+
CreateView,
154156
]:
155157
assert klass.__module__ == "datafusion.expr"
156158

src/expr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ pub mod case;
4848
pub mod cast;
4949
pub mod column;
5050
pub mod create_memory_table;
51+
pub mod create_view;
5152
pub mod cross_join;
5253
pub mod empty_relation;
5354
pub mod exists;
@@ -280,6 +281,7 @@ pub(crate) fn init_module(m: &PyModule) -> PyResult<()> {
280281
m.add_class::<projection::PyProjection>()?;
281282
m.add_class::<table_scan::PyTableScan>()?;
282283
m.add_class::<create_memory_table::PyCreateMemoryTable>()?;
284+
m.add_class::<create_view::PyCreateView>()?;
283285
m.add_class::<subquery_alias::PySubqueryAlias>()?;
284286
Ok(())
285287
}

src/expr/create_view.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// Licensed to the Apache Software Foundation (ASF) under one
2+
// or more contributor license agreements. See the NOTICE file
3+
// distributed with this work for additional information
4+
// regarding copyright ownership. The ASF licenses this file
5+
// to you under the Apache License, Version 2.0 (the
6+
// "License"); you may not use this file except in compliance
7+
// with the License. You may obtain a copy of the License at
8+
//
9+
// http://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// Unless required by applicable law or agreed to in writing,
12+
// software distributed under the License is distributed on an
13+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14+
// KIND, either express or implied. See the License for the
15+
// specific language governing permissions and limitations
16+
// under the License.
17+
18+
use std::fmt::{self, Display, Formatter};
19+
20+
use datafusion_expr::CreateView;
21+
use pyo3::prelude::*;
22+
23+
use crate::sql::logical::PyLogicalPlan;
24+
25+
use super::logical_node::LogicalNode;
26+
27+
#[pyclass(name = "CreateView", module = "datafusion.expr", subclass)]
28+
#[derive(Clone)]
29+
pub struct PyCreateView {
30+
create: CreateView,
31+
}
32+
33+
impl From<PyCreateView> for CreateView {
34+
fn from(create: PyCreateView) -> Self {
35+
create.create
36+
}
37+
}
38+
39+
impl From<CreateView> for PyCreateView {
40+
fn from(create: CreateView) -> PyCreateView {
41+
PyCreateView { create }
42+
}
43+
}
44+
45+
impl Display for PyCreateView {
46+
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
47+
write!(
48+
f,
49+
"CreateView
50+
name: {:?}
51+
input: {:?}
52+
or_replace: {:?}
53+
definition: {:?}",
54+
&self.create.name, &self.create.input, &self.create.or_replace, &self.create.definition,
55+
)
56+
}
57+
}
58+
59+
#[pymethods]
60+
impl PyCreateView {
61+
fn name(&self) -> PyResult<String> {
62+
Ok(self.create.name.to_string())
63+
}
64+
65+
fn input(&self) -> PyResult<Vec<PyLogicalPlan>> {
66+
Ok(Self::inputs(self))
67+
}
68+
69+
fn or_replace(&self) -> bool {
70+
self.create.or_replace
71+
}
72+
73+
fn definition(&self) -> PyResult<Option<String>> {
74+
Ok(self.create.definition.clone())
75+
}
76+
77+
fn __repr__(&self) -> PyResult<String> {
78+
Ok(format!("CreateView({})", self))
79+
}
80+
81+
fn __name__(&self) -> PyResult<String> {
82+
Ok("CreateView".to_string())
83+
}
84+
}
85+
86+
impl LogicalNode for PyCreateView {
87+
fn inputs(&self) -> Vec<PyLogicalPlan> {
88+
vec![PyLogicalPlan::from((*self.create.input).clone())]
89+
}
90+
91+
fn to_variant(&self, py: Python) -> PyResult<PyObject> {
92+
Ok(self.clone().into_py(py))
93+
}
94+
}

0 commit comments

Comments
 (0)
0