blob: 90390d7c97a608446d4191424ee9d343da1b02b9 [file]
# 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.
from typing import Dict, Optional
from pypaimon.function.function_definition import FunctionDefinition
class Actions:
SET_OPTION = "setOption"
REMOVE_OPTION = "removeOption"
UPDATE_COMMENT = "updateComment"
ADD_DEFINITION = "addDefinition"
UPDATE_DEFINITION = "updateDefinition"
DROP_DEFINITION = "dropDefinition"
class FunctionChange:
"""Represents a change to a function."""
def __init__(self, action: str):
self._action = action
@staticmethod
def set_option(key: str, value: str) -> "SetFunctionOption":
return SetFunctionOption(key, value)
@staticmethod
def remove_option(key: str) -> "RemoveFunctionOption":
return RemoveFunctionOption(key)
@staticmethod
def update_comment(comment: Optional[str]) -> "UpdateFunctionComment":
return UpdateFunctionComment(comment)
@staticmethod
def add_definition(name: str, definition: FunctionDefinition) -> "AddDefinition":
return AddDefinition(name, definition)
@staticmethod
def update_definition(name: str, definition: FunctionDefinition) -> "UpdateDefinition":
return UpdateDefinition(name, definition)
@staticmethod
def drop_definition(name: str) -> "DropDefinition":
return DropDefinition(name)
def to_dict(self) -> Dict:
raise NotImplementedError
@classmethod
def from_dict(cls, data: Dict) -> "FunctionChange":
action = data.get("action")
if action == Actions.SET_OPTION:
return SetFunctionOption(data["key"], data["value"])
elif action == Actions.REMOVE_OPTION:
return RemoveFunctionOption(data["key"])
elif action == Actions.UPDATE_COMMENT:
return UpdateFunctionComment(data.get("comment"))
elif action == Actions.ADD_DEFINITION:
return AddDefinition(data["name"], FunctionDefinition.from_dict(data["definition"]))
elif action == Actions.UPDATE_DEFINITION:
return UpdateDefinition(data["name"], FunctionDefinition.from_dict(data["definition"]))
elif action == Actions.DROP_DEFINITION:
return DropDefinition(data["name"])
else:
raise ValueError(f"Unknown function change action: {action}")
class SetFunctionOption(FunctionChange):
def __init__(self, key: str, value: str):
super().__init__(Actions.SET_OPTION)
self.key = key
self.value = value
def to_dict(self) -> Dict:
return {"action": self._action, "key": self.key, "value": self.value}
class RemoveFunctionOption(FunctionChange):
def __init__(self, key: str):
super().__init__(Actions.REMOVE_OPTION)
self.key = key
def to_dict(self) -> Dict:
return {"action": self._action, "key": self.key}
class UpdateFunctionComment(FunctionChange):
def __init__(self, comment: Optional[str]):
super().__init__(Actions.UPDATE_COMMENT)
self.comment = comment
def to_dict(self) -> Dict:
return {"action": self._action, "comment": self.comment}
class AddDefinition(FunctionChange):
def __init__(self, name: str, definition: FunctionDefinition):
super().__init__(Actions.ADD_DEFINITION)
self.name = name
self.definition = definition
def to_dict(self) -> Dict:
return {
"action": self._action,
"name": self.name,
"definition": self.definition.to_dict(),
}
class UpdateDefinition(FunctionChange):
def __init__(self, name: str, definition: FunctionDefinition):
super().__init__(Actions.UPDATE_DEFINITION)
self.name = name
self.definition = definition
def to_dict(self) -> Dict:
return {
"action": self._action,
"name": self.name,
"definition": self.definition.to_dict(),
}
class DropDefinition(FunctionChange):
def __init__(self, name: str):
super().__init__(Actions.DROP_DEFINITION)
self.name = name
def to_dict(self) -> Dict:
return {"action": self._action, "name": self.name}