odps/models/function.py (73 lines of code) (raw):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright 1999-2024 Alibaba Group Holding Ltd.
#
# 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 .. import serializers, utils
from .core import LazyLoad
from .resource import Resource
class Function(LazyLoad):
"""
Function can be used in UDF when user writes a SQL.
"""
__slots__ = "_resources_objects", "_owner_changed"
_root = "Function"
name = serializers.XMLNodeField("Alias")
_owner = serializers.XMLNodeField("Owner")
creation_time = serializers.XMLNodeField(
"CreationTime", parse_callback=utils.parse_rfc822
)
class_type = serializers.XMLNodeField("ClassType")
_resources = serializers.XMLNodesField("Resources", "ResourceName")
is_sql_function = serializers.XMLNodeField("IsSqlFunction")
is_embedded_function = serializers.XMLNodeField("IsEmbeddedFunction")
program_language = serializers.XMLNodeField("ProgramLanguage")
code = serializers.XMLNodeField("Code")
file_name = serializers.XMLNodeField("FileName")
def __init__(self, **kwargs):
self._resources_objects = None
self._owner_changed = False
resources = kwargs.pop("resources", None)
if "owner" in kwargs:
kwargs["_owner"] = kwargs.pop("owner")
super(Function, self).__init__(**kwargs)
if resources is not None:
self.resources = resources
def reload(self):
resp = self._client.get(self.resource(), curr_schema=self._get_schema_name())
self.parse(self._client, resp, obj=self)
@property
def resources(self):
"""
Return all the resources which this function refer to.
:return: resources
:rtype: list
.. seealso:: :class:`odps.models.Resource`
"""
if self._resources_objects is not None:
return self._resources_objects
resources = self.parent.parent.resources
resources = [resources[name] for name in self._resources or ()]
self._resources_objects = resources
return resources
@resources.setter
def resources(self, value):
def get_resource_name(res):
if isinstance(res, Resource):
schema_name = res._get_schema_name()
if res.project.name == self.project.name and schema_name is None:
return res.name
return res.full_resource_name
else:
return res
self._resources_objects = None
self._resources = [get_resource_name(res) for res in value]
@property
def owner(self):
return self._owner
@owner.setter
def owner(self, value):
self._owner_changed = True
self._owner = value
def update(self):
"""
Update this function.
:return: None
"""
if self._owner_changed:
self.update_owner(self.owner)
self._resources = [res.name for res in self.resources]
return self.parent.update(self)
def update_owner(self, new_owner):
params = {}
schema_name = self._get_schema_name()
if schema_name:
params["curr_schema"] = schema_name
headers = {"x-odps-owner": new_owner}
self._client.put(
self.resource(), None, action="updateowner", params=params, headers=headers
)
def drop(self):
"""
Delete this Function.
:return: None
"""
return self.parent.delete(self)