Source code for sasoptpy.abstract.statement.create_data
#!/usr/bin/env python
# encoding: utf-8
#
# Copyright SAS Institute
#
# 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.
#
from .statement_base import Statement
import sasoptpy
[docs]class CreateDataStatement(Statement):
def __init__(self, table, index, columns=None):
super().__init__()
self._table = table
self._index = index
if isinstance(index, list):
self._index = {'key': index}
self._columns = list()
if columns:
for col in columns:
self.append(col)
def append(self, element, **kwargs):
if isinstance(element, dict):
self._columns.append(element)
else:
self._columns.append({'expression': element})
def get_table_expr(self):
if hasattr(self._table, '_expr'):
return f'({self._table._expr()})'
elif hasattr(self._table, 'name'):
return self._table.name
else:
return str(self._table)
def get_table_name(self):
return self._table
def get_index_expr(self):
s = ''
key = self._index.get('key')
if isinstance(key, str):
key = [key]
index = self._index.get('set')
if key:
joined_key = ' '.join([k.get_name() if hasattr(k, 'get_name') else str(k) for k in key])
s += '[{}]'.format(joined_key)
if key and index:
s += ' = '
if index:
s += '{' + sasoptpy.util.package_utils._to_sas_string(index) + '}'
return s
def get_columns_expr(self):
cols = self._columns
columns_string = [CreateDataStatement.get_column_str(c) for c in cols]
s = ' '.join(columns_string)
return s
@classmethod
def get_column_str(cls, c):
name = c.get('name')
expr = c.get('expression', c.get('expr'))
index = c.get('index')
if not isinstance(index, list):
index = [index]
name_str = ''
connect_str = ''
expr_str = ''
if name:
if hasattr(name, '_expr'):
name_str = 'col(' + name._expr() + ')'
else:
name_str = str(name)
if name and expr:
connect_str += '='
if expr:
if sasoptpy.util.has_expr(expr):
expr_str += expr._expr()
else:
expr_str += '{}'.format(expr)
if name_str == expr_str:
connect_str = ''
expr_str = ''
if name_str != '':
expr_str = '({})'.format(expr_str)
s = name_str + connect_str + expr_str
if index and any(sasoptpy.abstract.util.is_key_abstract(i) for i in index):
index_str = ', '.join([sasoptpy.to_definition(i) for i in index])
s = '{{{}}} < {} >'.format(index_str, s)
return s
def _defn(self):
s = 'create data'
table_str = self.get_table_expr()
index_str = self.get_index_expr()
column_str = self.get_columns_expr()
s += ' ' + table_str + ' from '
if index_str != '':
s += index_str + ' '
if column_str != '':
s += column_str
s += ';'
return s
@classmethod
def create_data(cls, *args, **kwargs):
c = CreateDataStatement(*args, **kwargs)
return c