Skip to content

Commit 325b7ce

Browse files
authored
Create memory table (#271)
* Introduce to_variant trait function to LogicalNode and create Explain LogicalNode bindings * Cargo fmt * bindings for Extension LogicalNode * Add missing classes to list of exports so test_imports will pass * Update to point to proper repo * Update pytest to adhere to aggregate calls being wrapped in projections * Address linter change which causes a pytest to fail * Add bindings for LogicalPlan::CreateMemoryTable
1 parent 1c4a35c commit 325b7ce

4 files changed

Lines changed: 103 additions & 0 deletions

File tree

datafusion/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
TryCast,
7878
Between,
7979
Explain,
80+
CreateMemoryTable,
8081
SubqueryAlias,
8182
Extension,
8283
)
@@ -133,6 +134,7 @@
133134
"Explain",
134135
"SubqueryAlias",
135136
"Extension",
137+
"CreateMemoryTable",
136138
]
137139

138140

datafusion/tests/test_imports.py

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

8586

@@ -149,6 +150,7 @@ def test_class_module_is_datafusion():
149150
SubqueryAlias,
150151
Explain,
151152
Extension,
153+
CreateMemoryTable,
152154
]:
153155
assert klass.__module__ == "datafusion.expr"
154156

src/expr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub mod bool_expr;
4747
pub mod case;
4848
pub mod cast;
4949
pub mod column;
50+
pub mod create_memory_table;
5051
pub mod cross_join;
5152
pub mod empty_relation;
5253
pub mod exists;
@@ -278,6 +279,7 @@ pub(crate) fn init_module(m: &PyModule) -> PyResult<()> {
278279
m.add_class::<filter::PyFilter>()?;
279280
m.add_class::<projection::PyProjection>()?;
280281
m.add_class::<table_scan::PyTableScan>()?;
282+
m.add_class::<create_memory_table::PyCreateMemoryTable>()?;
281283
m.add_class::<subquery_alias::PySubqueryAlias>()?;
282284
Ok(())
283285
}

src/expr/create_memory_table.rs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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::CreateMemoryTable;
21+
use pyo3::prelude::*;
22+
23+
use crate::sql::logical::PyLogicalPlan;
24+
25+
use super::logical_node::LogicalNode;
26+
27+
#[pyclass(name = "CreateMemoryTable", module = "datafusion.expr", subclass)]
28+
#[derive(Clone)]
29+
pub struct PyCreateMemoryTable {
30+
create: CreateMemoryTable,
31+
}
32+
33+
impl From<PyCreateMemoryTable> for CreateMemoryTable {
34+
fn from(create: PyCreateMemoryTable) -> Self {
35+
create.create
36+
}
37+
}
38+
39+
impl From<CreateMemoryTable> for PyCreateMemoryTable {
40+
fn from(create: CreateMemoryTable) -> PyCreateMemoryTable {
41+
PyCreateMemoryTable { create }
42+
}
43+
}
44+
45+
impl Display for PyCreateMemoryTable {
46+
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
47+
write!(
48+
f,
49+
"CreateMemoryTable
50+
Name: {:?}
51+
Input: {:?}
52+
if_not_exists: {:?}
53+
or_replace: {:?}",
54+
&self.create.name,
55+
&self.create.input,
56+
&self.create.if_not_exists,
57+
&self.create.or_replace,
58+
)
59+
}
60+
}
61+
62+
#[pymethods]
63+
impl PyCreateMemoryTable {
64+
fn name(&self) -> PyResult<String> {
65+
Ok(self.create.name.to_string())
66+
}
67+
68+
fn input(&self) -> PyResult<Vec<PyLogicalPlan>> {
69+
Ok(Self::inputs(self))
70+
}
71+
72+
fn if_not_exists(&self) -> bool {
73+
self.create.if_not_exists
74+
}
75+
76+
fn or_replace(&self) -> bool {
77+
self.create.or_replace
78+
}
79+
80+
fn __repr__(&self) -> PyResult<String> {
81+
Ok(format!("CreateMemoryTable({})", self))
82+
}
83+
84+
fn __name__(&self) -> PyResult<String> {
85+
Ok("CreateMemoryTable".to_string())
86+
}
87+
}
88+
89+
impl LogicalNode for PyCreateMemoryTable {
90+
fn inputs(&self) -> Vec<PyLogicalPlan> {
91+
vec![PyLogicalPlan::from((*self.create.input).clone())]
92+
}
93+
94+
fn to_variant(&self, py: Python) -> PyResult<PyObject> {
95+
Ok(self.clone().into_py(py))
96+
}
97+
}

0 commit comments

Comments
 (0)