diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a9e379e4..58c8429ce 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,37 +2,41 @@ version: 2.1 jobs: build-and-test: - machine: - image: ubuntu-1604:202007-01 + docker: + - image: cimg/python:3.7 + resource_class: large steps: - - checkout + - checkout + - restore_cache: + keys: + - v1-dependencies-{{ checksum "setup.cfg" }} + # fallback to using the latest cache if no exact match is found + - v1-dependencies- + - run: + name: Install Package + command: | + python -m venv env37 + . env37/bin/activate + pip install --upgrade pip + python setup.py install - run: - name: Before Install + name: Generate Parser Files command: | - sh script/install/before_install.sh - environment: - DEBIAN_FRONTEND: noninteractive + sudo add-apt-repository ppa:openjdk-r/ppa + sudo -E apt install -y openjdk-8-jdk openjdk-8-jre + sh script/antlr4/generate_parser.sh - run: - name: Install - command: | - export PATH="$HOME/miniconda/bin:$PATH" - sh script/install/install.sh - # allow no-password connection for root - sudo mysql -u root -e "SELECT User,Host FROM mysql.user; - DROP USER 'root'@'localhost'; - CREATE USER 'root'@'%' IDENTIFIED BY ''; - GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - FLUSH PRIVILEGES;" + name: Install Test Dependencies + command: | + . env37/bin/activate + pip install flake8==3.9.0 pytest==6.1.2 pytest-cov==2.11.1 mock==4.0.3 coveralls==3.0.1 - run: name: Test - command: | - export PATH="$HOME/miniconda/bin:$PATH" - conda init bash - source ~/.bashrc - conda activate eva + command: | + . env37/bin/activate sh script/test/test.sh coveralls diff --git a/.coveragerc b/.coveragerc index fca13adab..35ac42653 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,2 +1,2 @@ [run] -omit = src/parser/evaql/* +omit = eva/parser/evaql/* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 24e27184b..39a96f527 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,10 +9,10 @@ repos: rev: v1.5.3 hooks: - id: autopep8 - args: ['-i', '--select=E,F', '--exclude=src/filters, src/parser/evaql'] + args: ['-i', '--select=E,F', '--exclude=eva/filters, eva/parser/evaql'] - repo: https://gitlab.com/pycqa/flake8 rev: 3.8.3 hooks: - id: flake8 additional_dependencies: [flake8-typing-imports==1.6.0] - args: ['--select=E,F', '--exclude=src/filters, src/parser/evaql'] + args: ['--select=E,F', '--exclude=eva/filters, eva/parser/evaql'] diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..dba205ee3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,116 @@ +# Contributing to EVA + +## Setting up Development Environment + +### Installation + +Installation of EVA involves setting a virtual environment using [miniconda](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) and configuring git hooks. + +1. Clone the repository +```shell +git clone https://github.com/georgia-tech-db/eva.git +``` + +2. Install the dependencies. +```shell +sh script/install/before_install.sh +export PATH="$HOME/miniconda/bin:$PATH" +sh script/install/install.sh +``` + + + +### Client Testing + +1. Set up the server and client + +- Activate the conda environment: `conda activate eva` + +- Launch EVA database Server: `python eva/eva_server.py` + +- Launch CLI: `python eva/eva_cmd_client.py` + +2. Run the `UPLOAD` command in the client terminal: +```mysql +UPLOAD INFILE 'data/ua_detrac/ua_detrac.mp4' PATH 'test_video.mp4'; +``` + +3. Run the `LOAD` command in the client terminal: (may take a while) +```mysql +LOAD DATA INFILE 'test_video.mp4' INTO MyVideo; +``` + +4. Below is a basic query that should work on the client +```mysql +SELECT id, data FROM MyVideo WHERE id < 5; +``` + +### Configure GPU (Recommended) + +1. If your workstation has a GPU, you need to first set it up and configure it. You can run the following command first to check your hardware capabilities. + + ``` + ubuntu-drivers devices + ``` + + If you do have an NVIDIA GPU, and its not been configured yet, follow all the steps in this link carefully. `https://towardsdatascience.com/deep-learning-gpu-installation-on-ubuntu-18-4-9b12230a1d31`. + + Some pointers: + - When installing NVIDIA drivers, check the correct driver version for your GPU to avoid compatibiility issues. + - When installing cuDNN, you will have to create an account. Make sure you get the correct deb files for your OS and architecture. + +2. You can run the following code in a jupyter instance to verify your GPU is working well along with PyTorch. + + ``` + import torch + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + print(device) + ``` + + Output of `cuda:0` indicates the presence of a GPU. (Note: 0 indicates the index of the GPU in system. Incase you have multiple GPUs, the index needs to be accordingly changed) + +2. Now configure the `executor` section in `eva/eva.yml` as follows: + + ``` + gpus: {'127.0.1.1': [0]} + ``` + + `127.0.1.1` is the loopback address on which the eva server is started. 0 refers to the GPU index to be used. + +## Commiting and Testing + +1. Install git hooks in your .git/ directory. [optional, but recommended] +```shell +conda activate eva +pre-commit install +``` + +2. Ensure that all the unit test cases (including the ones you have added) run succesfully and the coding style conventions are followed. +```shell +bash script/test/test.sh +``` + +## Packaging New Version of EVA + +1. Generate EVA grammar files. +```shell +bash script/antlr4/generate_parser.sh +``` + +2. Bump up version number in `setup.cfg` along with any additional dependencies. + +3. Create a new build locally. +```shell +python -m build +``` + +4. Upload build to pypi using credentials. +```shell +python -m twine upload dist/* +``` + + +## Issues and PR's + +To file a bug or request a feature, please file a GitHub issue. Pull requests are welcome. diff --git a/README.md b/README.md index e06a5f3e4..24e8bd25e 100644 --- a/README.md +++ b/README.md @@ -17,56 +17,40 @@ EVA is a visual data management system (think MySQL for videos). It supports a d * EVA **improves accuracy** by introducing state-of-the-art model specialization and selection algorithms. -## Table of Contents -* [Installation](#installation) -* [Client Testing](#client-testing) -* [Docker](#docker) -* [Development](#development) -* [Architecture](#architecture) - - ## Installation -Installation of EVA involves setting a virtual environment using [miniconda](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) and configuring git hooks. +### Dependency +EVA requires Python 3.7 or later and JAVA 8. On Ubuntu, you can install the JAVA by `sudo -E apt install -y openjdk-8-jdk openjdk-8-jre`. -1. Clone the repository +### Recommended +To install EVA, we recommend using virtual environment and pip: ```shell -git clone https://github.com/georgia-tech-db/eva.git +python3 -m venv env37 +. env37/bin/activate +pip install --upgrade pip +pip install evatestdb ``` -2. Install the dependencies. +### Install From Source ```shell -sh script/install/before_install.sh -export PATH="$HOME/miniconda/bin:$PATH" -sh script/install/install.sh -``` - -3. Connect mysql user root with normal account and no password -```mysql -sudo mysql -u root -> SELECT User,Host FROM mysql.user; -> DROP USER 'root'@'localhost'; -> CREATE USER 'root'@'%' IDENTIFIED BY ''; -> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -> FLUSH PRIVILEGES; -mysql -u root +git clone https://github.com/georgia-tech-db/eva.git && cd eva +python3 -m venv env37 +. env37/bin/activate +pip install --upgrade pip +sh script/antlr4/generate_parser.sh +pip install . ``` -refer to [askubuntu](https://askubuntu.com/questions/766334/cant-login-as-mysql-user-root-from-normal-user-account-in-ubuntu-16-04) - - -## Client Testing +## Verify Installation 1. Set up the server and client +- Activate the virtual environment: `. env37/bin/activate` -- Activate the conda environment: `conda activate eva` +- Launch EVA database Server: `eva_server` -- Launch EVA database Server: `python eva.py` +- Launch CLI: `eva_client` -- Launch CLI: `python eva_cmd_client.py` - -2. Run the `UPLOAD` command in the client terminal: +2. Run the `UPLOAD` command in the client terminal (use the [ua_detrac.mp4](data/ua_detrac/ua_detrac.mp4) as an example): ```mysql UPLOAD INFILE 'data/ua_detrac/ua_detrac.mp4' PATH 'test_video.mp4'; ``` @@ -81,28 +65,6 @@ LOAD DATA INFILE 'test_video.mp4' INTO MyVideo; SELECT id, data FROM MyVideo WHERE id < 5; ``` - - - - -## Development - -1. Install git hooks in your .git/ directory. [optional, but recommended] -```shell -conda activate eva -pre-commit install -``` - -2. Ensure that all the unit test cases (including the ones you have added) run succesfully and the coding style conventions are followed. -```shell -bash script/test/test.sh -``` - ## Quickstart Tutorial ### Configure GPU (Recommended) @@ -129,7 +91,7 @@ bash script/test/test.sh Output of `cuda:0` indicates the presence of a GPU. (Note: 0 indicates the index of the GPU in system. Incase you have multiple GPUs, the index needs to be accordingly changed) -2. Now configure the `executor` section in `eva.yml` as follows: +2. Now configure the `executor` section in `~/.eva/eva.yml` as follows: ``` gpus: {'127.0.1.1': [0]} @@ -141,28 +103,26 @@ bash script/test/test.sh 1. Open a terminal instance and start the server: ``` - python eva.py + eva_server ``` -2. Open another terminal instance. Start a jupyter lab/notebook instance, and navigate to `tutorials/object_detection.ipynb` +2. Open another terminal instance. Start a jupyter lab/notebook instance, and navigate to [tutorials/object_detection.ipynb](tutorials/object_detection.ipynb) 3. You might have to install ipywidgets to visualize the input video and output. Follow steps in `https://ipywidgets.readthedocs.io/en/latest/user_install.html` as per your jupyter environment. -4. Run each cell one by one. Each cell is self-explanatory. If everything has been configured correctly you should be able to see a ipywidgets Video instance with the bounding boxes output of the executed query. +4. Run each cell one by one. Each cell is self-explanatory. If everything has been configured correctly you should be able to see a ipywidgets Video instance with the bounding boxes output of the executed query. -## Architecture +## Documentation -EVA consists of four core components: - -* EVAQL Query Parser -* Query Optimizer -* Query Execution Engine (Filters + Deep Learning Models) -* Distributed Storage Engine +You can find documentation and code snippets for EVA [here](https://evagatech.readthedocs.io/). ## Contributing To file a bug or request a feature, please file a GitHub issue. Pull requests are welcome. +For information on installing from source and contributing to EVA, see our +[contributing guidelines](./CONTRIBUTING.md). + ## Contributors See the [people page](https://github.com/georgia-tech-db/eva/graphs/contributors) for the full listing of contributors. diff --git a/api-docs/guide/getstarted.rst b/api-docs/guide/getstarted.rst index dd2858af7..c7470879d 100644 --- a/api-docs/guide/getstarted.rst +++ b/api-docs/guide/getstarted.rst @@ -5,29 +5,32 @@ Get Started Installation ------- -If you haven't installed EVA yet, you can do so by following instructions `given here `_ +EVA requires Python 3.7 or later. To install EVA, we recommend using pip:: + + pip install evadb + Running EVA Server ------- -EVA runs as a client-server architecture. So you need to start the server before you can connect to it via various interfaces:: +EVA runs as a client server architecture. So you need to start the server before you can connect to it via various interfaces::: - python eva.py + eva_server Querying EVA ------- - Querying Via Command Line:: -You can use the CLI of EVA to do some quick testing or verifying if the installation was succesful:: +EVA offers a CLI interface to query the server for quick testing and debugging:: - python eva_cmd_client.py + eva_client >>> UPLOAD INFILE 'data/ua_detrac/ua_detrac.mp4' PATH 'test_video.mp4'; >>> LOAD DATA INFILE 'test_video.mp4' INTO MyVideo; >>> SELECT id, data FROM MyVideo WHERE id < 5 -- Experimenting With Jupyter Notebook:: +- From Python/Jupyter Code:: -You can connect to the EVA server via a Jupyter Notebook as well, just copy paste the following snipped:: +EVA also provides an API to connect to the server using Python code:: from src.server.db_api import connect import nest_asyncio @@ -39,3 +42,5 @@ Once the connection is established, you can run queries using the cursor:: cursor.execute("""SELECT id, Unnest(FastRCNNObjectDetector(data)) FROM MyVideo""") response = cursor.fetch_all() + +- A sample jupyter notebook the performs object detection using EVA can be found `here `_. \ No newline at end of file diff --git a/api-docs/guide/udf.rst b/api-docs/guide/udf.rst index 55683ef68..f414e822e 100644 --- a/api-docs/guide/udf.rst +++ b/api-docs/guide/udf.rst @@ -14,9 +14,9 @@ Introduction to UDFs Implementing your own UDF ------- - During each step you can use `this UDF implementation `_ as reference. + During each step you can use `this UDF implementation `_ as reference. - 1. Create a new file under `udfs/` and give it a descriptive name. eg: `fastrcnn_object_detector.py`, `midas_depth_estimator.py`. (Note that, UDFs packaged along with EVA are present inside `src/udfs/`) + 1. Create a new file under `udfs/` and give it a descriptive name. eg: `fastrcnn_object_detector.py`, `midas_depth_estimator.py`. (Note that, UDFs packaged along with EVA are present inside `eva/udfs/`) 2. Here, you need to create and implement a class that derives from `PytorchAbstractUDF`. @@ -122,7 +122,7 @@ Now that you have implemented your UDF we need to register it into EVA and execu OUTPUT (labels NDARRAY STR(ANYDIM), bboxes NDARRAY FLOAT32(ANYDIM, 4), scores NDARRAY FLOAT32(ANYDIM)) TYPE Classification - IMPL 'src/udfs/fastrcnn_object_detector.py'; + IMPL 'eva/udfs/fastrcnn_object_detector.py'; * Input is a frame of type NDARRAY with shape (3, ANYDIM, ANYDIM). 3 channels and any width or height. * We return 3 variables for this UDF: diff --git a/db_api_example.py b/db_api_example.py index 007c0c61a..1b759d5ff 100644 --- a/db_api_example.py +++ b/db_api_example.py @@ -2,7 +2,7 @@ import sys from typing import List -from src.server.db_api import connect, connect_async +from eva.server.db_api import connect, connect_async async def run_async(query: List[str]): hostname = '0.0.0.0' diff --git a/docker-compose.yml b/docker-compose.yml index 0d08ae3eb..20d5a8ef8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,8 +26,8 @@ services: - | cd /app sed -i "s/\broot@localhost\b/root@db/g" eva.yml - ~/miniconda/bin/conda run -n eva flake8 --select E,F src/ test/ --exclude src/filters,src/parser/evaql - ~/miniconda/bin/conda run -n eva PYTHONPATH=./ pytest test/ --cov-report= --cov-config=.coveragerc --cov=src/ -s -v --log-level=WARNING + ~/miniconda/bin/conda run -n eva flake8 --select E,F eva/ test/ --exclude eva/filters,eva/parser/evaql + ~/miniconda/bin/conda run -n eva PYTHONPATH=./ pytest test/ --cov-report= --cov-config=.coveragerc --cov=eva/ -s -v --log-level=WARNING eva-test-cpu: depends_on: @@ -44,8 +44,8 @@ services: - | cd /app sed -i "s/\broot@localhost\b/root@db/g" eva.yml - ~/miniconda/bin/conda run -n eva flake8 --select E,F src/ test/ --exclude src/filters,src/parser/evaql - ~/miniconda/bin/conda run -n eva PYTHONPATH=./ pytest test/ --cov-report= --cov-config=.coveragerc --cov=src/ -s -v --log-level=WARNING + ~/miniconda/bin/conda run -n eva flake8 --select E,F eva/ test/ --exclude eva/filters,eva/parser/evaql + ~/miniconda/bin/conda run -n eva PYTHONPATH=./ pytest test/ --cov-report= --cov-config=.coveragerc --cov=eva/ -s -v --log-level=WARNING volumes: db_data: {} diff --git a/docker/eva_cpu.Dockerfile b/docker/eva_cpu.Dockerfile index 03fb34044..ad4cda697 100644 --- a/docker/eva_cpu.Dockerfile +++ b/docker/eva_cpu.Dockerfile @@ -26,6 +26,6 @@ RUN ~/miniconda/bin/conda env create -f /app/script/install/conda_eva_environmen # generate eva-ql parser RUN wget https://www.antlr.org/download/antlr-4.8-complete.jar -O ~/antlr.jar \ - && java -jar ~/antlr.jar -Dlanguage=Python3 /app/src/parser/evaql/evaql_lexer.g4 \ - && java -jar ~/antlr.jar -Dlanguage=Python3 -visitor /app/src/parser/evaql/evaql_parser.g4 \ + && java -jar ~/antlr.jar -Dlanguage=Python3 /app/eva/parser/evaql/evaql_lexer.g4 \ + && java -jar ~/antlr.jar -Dlanguage=Python3 -visitor /app/eva/parser/evaql/evaql_parser.g4 \ && rm ~/antlr.jar diff --git a/docker/eva_gpu.Dockerfile b/docker/eva_gpu.Dockerfile index c45c18dad..febfbf5b7 100644 --- a/docker/eva_gpu.Dockerfile +++ b/docker/eva_gpu.Dockerfile @@ -28,6 +28,6 @@ RUN ~/miniconda/bin/conda run -n eva python -c "import torch; torch.randn(1).cud # generate eva-ql parser RUN wget https://www.antlr.org/download/antlr-4.8-complete.jar -O ~/antlr.jar \ - && java -jar ~/antlr.jar -Dlanguage=Python3 /app/src/parser/evaql/evaql_lexer.g4 \ - && java -jar ~/antlr.jar -Dlanguage=Python3 -visitor /app/src/parser/evaql/evaql_parser.g4 \ + && java -jar ~/antlr.jar -Dlanguage=Python3 /app/eva/parser/evaql/evaql_lexer.g4 \ + && java -jar ~/antlr.jar -Dlanguage=Python3 -visitor /app/eva/parser/evaql/evaql_parser.g4 \ && rm ~/antlr.jar diff --git a/src/README.md b/eva/README.md similarity index 100% rename from src/README.md rename to eva/README.md diff --git a/src/configuration/dictionary.py b/eva/__init__.py similarity index 79% rename from src/configuration/dictionary.py rename to eva/__init__.py index e25a80800..83b9ea76c 100644 --- a/src/configuration/dictionary.py +++ b/eva/__init__.py @@ -12,10 +12,4 @@ # 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. -import os - -import src - -EVA_DIR = os.path.join(os.path.dirname(src.__file__), os.path.pardir) -CATALOG_DIR = "catalog" -DATASET_DATAFRAME_NAME = "dataset" +name = 'eva' \ No newline at end of file diff --git a/src/catalog/__init__.py b/eva/catalog/__init__.py similarity index 100% rename from src/catalog/__init__.py rename to eva/catalog/__init__.py diff --git a/src/catalog/catalog_manager.py b/eva/catalog/catalog_manager.py similarity index 94% rename from src/catalog/catalog_manager.py rename to eva/catalog/catalog_manager.py index 2ab05e091..d2fa1de16 100644 --- a/src/catalog/catalog_manager.py +++ b/eva/catalog/catalog_manager.py @@ -15,18 +15,18 @@ from typing import List, Tuple -from src.catalog.column_type import ColumnType, NdArrayType -from src.catalog.models.base_model import init_db, drop_db -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.models.df_metadata import DataFrameMetadata -from src.catalog.models.udf import UdfMetadata -from src.catalog.models.udf_io import UdfIO -from src.catalog.services.df_column_service import DatasetColumnService -from src.catalog.services.df_service import DatasetService -from src.catalog.services.udf_service import UdfService -from src.catalog.services.udf_io_service import UdfIOService -from src.utils.logging_manager import LoggingLevel -from src.utils.logging_manager import LoggingManager +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.models.base_model import init_db, drop_db +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.catalog.models.udf import UdfMetadata +from eva.catalog.models.udf_io import UdfIO +from eva.catalog.services.df_column_service import DatasetColumnService +from eva.catalog.services.df_service import DatasetService +from eva.catalog.services.udf_service import UdfService +from eva.catalog.services.udf_io_service import UdfIOService +from eva.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager class CatalogManager(object): @@ -258,7 +258,7 @@ def create_udf(self, name: str, impl_file_path: str, Arguments: name(str): name of the udf to which this metdata corresponds impl_file_path(str): implementation path of the udf, - relative to src/udf + relative to eva/udf type(str): what kind of udf operator like classification, detection etc udf_io_list(List[UdfIO]): input/output info of this udf diff --git a/src/catalog/column_type.py b/eva/catalog/column_type.py similarity index 100% rename from src/catalog/column_type.py rename to eva/catalog/column_type.py diff --git a/src/catalog/df_schema.py b/eva/catalog/df_schema.py similarity index 93% rename from src/catalog/df_schema.py rename to eva/catalog/df_schema.py index 5f2ac530c..0c5442bfc 100644 --- a/src/catalog/df_schema.py +++ b/eva/catalog/df_schema.py @@ -15,8 +15,8 @@ from typing import List -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.schema_utils import SchemaUtils +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.schema_utils import SchemaUtils class DataFrameSchema(object): diff --git a/src/__init__.py b/eva/catalog/models/__init__.py similarity index 100% rename from src/__init__.py rename to eva/catalog/models/__init__.py diff --git a/src/catalog/models/base_model.py b/eva/catalog/models/base_model.py similarity index 96% rename from src/catalog/models/base_model.py rename to eva/catalog/models/base_model.py index e097dba14..ecda9989d 100644 --- a/src/catalog/models/base_model.py +++ b/eva/catalog/models/base_model.py @@ -17,9 +17,9 @@ from sqlalchemy.ext.declarative import declarative_base from sqlalchemy_utils import database_exists, create_database, drop_database -from src.catalog.sql_config import SQLConfig -from src.utils.logging_manager import LoggingLevel -from src.utils.logging_manager import LoggingManager +from eva.catalog.sql_config import SQLConfig +from eva.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager db_session = SQLConfig().session diff --git a/src/catalog/models/df_column.py b/eva/catalog/models/df_column.py similarity index 96% rename from src/catalog/models/df_column.py rename to eva/catalog/models/df_column.py index 58a967fb6..2281cd912 100644 --- a/src/catalog/models/df_column.py +++ b/eva/catalog/models/df_column.py @@ -20,8 +20,8 @@ from sqlalchemy.types import Enum from ast import literal_eval -from src.catalog.column_type import ColumnType, NdArrayType -from src.catalog.models.base_model import BaseModel +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.models.base_model import BaseModel class DataFrameColumn(BaseModel): diff --git a/src/catalog/models/df_metadata.py b/eva/catalog/models/df_metadata.py similarity index 95% rename from src/catalog/models/df_metadata.py rename to eva/catalog/models/df_metadata.py index 400546063..428e8bc09 100644 --- a/src/catalog/models/df_metadata.py +++ b/eva/catalog/models/df_metadata.py @@ -15,8 +15,8 @@ from sqlalchemy import Column, String from sqlalchemy.orm import relationship -from src.catalog.df_schema import DataFrameSchema -from src.catalog.models.base_model import BaseModel +from eva.catalog.df_schema import DataFrameSchema +from eva.catalog.models.base_model import BaseModel class DataFrameMetadata(BaseModel): diff --git a/src/catalog/models/udf.py b/eva/catalog/models/udf.py similarity index 97% rename from src/catalog/models/udf.py rename to eva/catalog/models/udf.py index 9c205ff0e..8609f12fe 100644 --- a/src/catalog/models/udf.py +++ b/eva/catalog/models/udf.py @@ -15,7 +15,7 @@ from sqlalchemy import Column, String from sqlalchemy.orm import relationship -from src.catalog.models.base_model import BaseModel +from eva.catalog.models.base_model import BaseModel class UdfMetadata(BaseModel): diff --git a/src/catalog/models/udf_io.py b/eva/catalog/models/udf_io.py similarity index 97% rename from src/catalog/models/udf_io.py rename to eva/catalog/models/udf_io.py index 67c50dbcd..9ff30150a 100644 --- a/src/catalog/models/udf_io.py +++ b/eva/catalog/models/udf_io.py @@ -20,8 +20,8 @@ from sqlalchemy.types import Enum from ast import literal_eval -from src.catalog.column_type import ColumnType, NdArrayType -from src.catalog.models.base_model import BaseModel +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.models.base_model import BaseModel class UdfIO(BaseModel): diff --git a/src/catalog/schema_utils.py b/eva/catalog/schema_utils.py similarity index 96% rename from src/catalog/schema_utils.py rename to eva/catalog/schema_utils.py index d24670dee..0e88e0c05 100644 --- a/src/catalog/schema_utils.py +++ b/eva/catalog/schema_utils.py @@ -21,9 +21,9 @@ from petastorm.unischema import UnischemaField from pyspark.sql.types import IntegerType, FloatType, StringType -from src.catalog.column_type import ColumnType, NdArrayType -from src.utils.logging_manager import LoggingLevel -from src.utils.logging_manager import LoggingManager +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager class SchemaUtils(object): diff --git a/src/catalog/models/__init__.py b/eva/catalog/services/__init__.py similarity index 100% rename from src/catalog/models/__init__.py rename to eva/catalog/services/__init__.py diff --git a/src/catalog/services/base_service.py b/eva/catalog/services/base_service.py similarity index 94% rename from src/catalog/services/base_service.py rename to eva/catalog/services/base_service.py index 53447a0c8..3a2a87d0b 100644 --- a/src/catalog/services/base_service.py +++ b/eva/catalog/services/base_service.py @@ -12,7 +12,7 @@ # 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 src.catalog.models.base_model import BaseModel +from eva.catalog.models.base_model import BaseModel class BaseService: diff --git a/src/catalog/services/df_column_service.py b/eva/catalog/services/df_column_service.py similarity index 94% rename from src/catalog/services/df_column_service.py rename to eva/catalog/services/df_column_service.py index 3fa8c1969..d3ef62179 100644 --- a/src/catalog/services/df_column_service.py +++ b/eva/catalog/services/df_column_service.py @@ -14,8 +14,8 @@ # limitations under the License. from typing import List -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.services.base_service import BaseService +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.services.base_service import BaseService class DatasetColumnService(BaseService): diff --git a/src/catalog/services/df_service.py b/eva/catalog/services/df_service.py similarity index 95% rename from src/catalog/services/df_service.py rename to eva/catalog/services/df_service.py index 20c1d443a..b49b2ed8f 100644 --- a/src/catalog/services/df_service.py +++ b/eva/catalog/services/df_service.py @@ -16,9 +16,9 @@ from sqlalchemy.orm.exc import NoResultFound -from src.catalog.models.df_metadata import DataFrameMetadata -from src.catalog.services.base_service import BaseService -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.catalog.services.base_service import BaseService +from eva.utils.logging_manager import LoggingManager, LoggingLevel class DatasetService(BaseService): diff --git a/src/catalog/services/udf_io_service.py b/eva/catalog/services/udf_io_service.py similarity index 95% rename from src/catalog/services/udf_io_service.py rename to eva/catalog/services/udf_io_service.py index 74ca44fb7..899a36952 100644 --- a/src/catalog/services/udf_io_service.py +++ b/eva/catalog/services/udf_io_service.py @@ -15,8 +15,8 @@ from typing import List from sqlalchemy.orm.exc import NoResultFound -from src.catalog.models.udf_io import UdfIO -from src.catalog.services.base_service import BaseService +from eva.catalog.models.udf_io import UdfIO +from eva.catalog.services.base_service import BaseService class UdfIOService(BaseService): diff --git a/src/catalog/services/udf_service.py b/eva/catalog/services/udf_service.py similarity index 93% rename from src/catalog/services/udf_service.py rename to eva/catalog/services/udf_service.py index e1de97e14..5901331c0 100644 --- a/src/catalog/services/udf_service.py +++ b/eva/catalog/services/udf_service.py @@ -12,11 +12,11 @@ # 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 src.catalog.models.udf import UdfMetadata -from src.catalog.services.base_service import BaseService +from eva.catalog.models.udf import UdfMetadata +from eva.catalog.services.base_service import BaseService from sqlalchemy.orm.exc import NoResultFound -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.utils.logging_manager import LoggingManager, LoggingLevel class UdfService(BaseService): @@ -28,7 +28,7 @@ def create_udf(self, name: str, impl_path: str, type: str) -> UdfMetadata: Arguments: name (str): name of the udf - impl_path (str): path to the udf implementation relative to src/udf + impl_path (str): path to the udf implementation relative to eva/udf type (str): udf operator kind, classification or detection or etc Returns: diff --git a/src/catalog/sql_config.py b/eva/catalog/sql_config.py similarity index 92% rename from src/catalog/sql_config.py rename to eva/catalog/sql_config.py index 15ef4576d..e492d3cf1 100644 --- a/src/catalog/sql_config.py +++ b/eva/catalog/sql_config.py @@ -14,7 +14,7 @@ # limitations under the License. from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, scoped_session -from src.configuration.configuration_manager import ConfigurationManager +from eva.configuration.configuration_manager import ConfigurationManager class SQLConfig: @@ -45,7 +45,7 @@ def __init__(self): Retrieves the database uri for connection from ConfigurationManager. """ uri = ConfigurationManager().get_value("core", - "sqlalchemy_database_uri") + "catalog_database_uri") # set echo=True to log SQL self.engine = create_engine(uri) # statements diff --git a/src/configuration/__init__.py b/eva/configuration/__init__.py similarity index 100% rename from src/configuration/__init__.py rename to eva/configuration/__init__.py diff --git a/eva/configuration/bootstrap_environment.py b/eva/configuration/bootstrap_environment.py new file mode 100644 index 000000000..c8d463543 --- /dev/null +++ b/eva/configuration/bootstrap_environment.py @@ -0,0 +1,76 @@ +# coding=utf-8 +# Copyright 2018-2020 EVA +# +# 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 pathlib import Path +import importlib.resources as importlib_resources +import os +import shutil +import yaml + +from eva.configuration.dictionary import EVA_INSTALLATION_DIR, \ + EVA_DEFAULT_DIR, EVA_DATASET_DIR, DB_DEFAULT_URI, \ + EVA_CONFIG_FILE +from eva.configuration.config_utils import read_value_config, \ + update_value_config + + +def get_base_config(): + ymlpath = None + if importlib_resources.is_resource('eva', EVA_CONFIG_FILE): + with importlib_resources.path('eva', EVA_CONFIG_FILE)as path: + ymlpath = path + else: # For local dev environments without package installed + ymlpath = os.path.join(EVA_INSTALLATION_DIR, EVA_CONFIG_FILE) + return ymlpath + + +def bootstrap_environment(): + # create eva directory in user home + eva_home_directory = Path(EVA_DEFAULT_DIR) + eva_home_directory.mkdir(parents=True, exist_ok=True) + + # copy default config to eva directory + config_path = eva_home_directory / EVA_CONFIG_FILE + if not config_path.exists(): + default_config_path = get_base_config() + shutil.copy(str(default_config_path), str(config_path)) + + # copy udfs to eva directory + udfs_path = Path(EVA_DEFAULT_DIR + "/udfs/") + if not udfs_path.exists(): + default_udfs_path = EVA_INSTALLATION_DIR + "/udfs/" + shutil.copytree(default_udfs_path, str(udfs_path)) + + with open(config_path, 'r') as ymlfile: + cfg = yaml.load(ymlfile, Loader=yaml.FullLoader) + + # fill default values for dataset and database if not present + dataset_location = read_value_config(cfg, "core", "datasets_dir") + database_uri = read_value_config(cfg, "core", "catalog_database_uri") + + if not dataset_location or not database_uri: + if not dataset_location: + dataset_location = str( + eva_home_directory / EVA_DATASET_DIR) + update_value_config(cfg, "core", "datasets_dir", + dataset_location) + if not database_uri: + database_uri = DB_DEFAULT_URI + update_value_config(cfg, "core", "catalog_database_uri", + database_uri) + + # update config on disk + with open(config_path, 'w') as ymlfile: + ymlfile.write(yaml.dump(cfg)) diff --git a/eva/configuration/config_utils.py b/eva/configuration/config_utils.py new file mode 100644 index 000000000..2b84601b2 --- /dev/null +++ b/eva/configuration/config_utils.py @@ -0,0 +1,23 @@ +# coding=utf-8 +# Copyright 2018-2020 EVA +# +# 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. + +def read_value_config(cfg, category, key): + return cfg.get(category, {}).get(key) + + +def update_value_config(cfg, category, key, value): + category_data = cfg.get(category, None) + if category_data: + category_data[key] = value diff --git a/src/configuration/configuration_manager.py b/eva/configuration/configuration_manager.py similarity index 61% rename from src/configuration/configuration_manager.py rename to eva/configuration/configuration_manager.py index f9116af01..7a1ec1915 100644 --- a/src/configuration/configuration_manager.py +++ b/eva/configuration/configuration_manager.py @@ -13,11 +13,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os - import yaml -from src.configuration.dictionary import EVA_DIR + +from eva.configuration.dictionary import EVA_DEFAULT_DIR, \ + EVA_CONFIG_FILE +from eva.configuration.config_utils import read_value_config, \ + update_value_config +from eva.configuration.bootstrap_environment import \ + bootstrap_environment class ConfigurationManager(object): @@ -28,17 +32,16 @@ def __new__(cls): if cls._instance is None: cls._instance = super(ConfigurationManager, cls).__new__(cls) - with open(os.path.join(EVA_DIR, "eva.yml"), 'r') as ymlfile: + bootstrap_environment() # Setup eva in home directory + + ymlpath = EVA_DEFAULT_DIR + EVA_CONFIG_FILE + with open(ymlpath, 'r') as ymlfile: cls._cfg = yaml.load(ymlfile, Loader=yaml.FullLoader) return cls._instance def get_value(self, category, key): - # get category information - category_data = self._cfg.get(category, None) - - # get key information - value = None - if category_data is not None: - value = category_data.get(key, None) - return value + return read_value_config(self._cfg, category, key) + + def update_value(self, category, key, value): + update_value_config(self._cfg, category, key, value) diff --git a/eva/configuration/dictionary.py b/eva/configuration/dictionary.py new file mode 100644 index 000000000..fead5aebd --- /dev/null +++ b/eva/configuration/dictionary.py @@ -0,0 +1,26 @@ +# coding=utf-8 +# Copyright 2018-2020 EVA +# +# 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. +import os +from pathlib import Path + +import eva + +EVA_INSTALLATION_DIR = os.path.dirname(eva.__file__) +EVA_DEFAULT_DIR = str(Path.home()) + "/.eva/" +EVA_DATASET_DIR = "eva_datasets" +EVA_CONFIG_FILE = "eva.yml" +CATALOG_DIR = "catalog" +DATASET_DATAFRAME_NAME = "dataset" +DB_DEFAULT_URI = "sqlite:///{}eva_catalog.db".format(EVA_DEFAULT_DIR) diff --git a/src/constants.py b/eva/constants.py similarity index 100% rename from src/constants.py rename to eva/constants.py diff --git a/eva.yml b/eva/eva.yml similarity index 81% rename from eva.yml rename to eva/eva.yml index 37f4721a3..992dfe6f6 100644 --- a/eva.yml +++ b/eva/eva.yml @@ -1,6 +1,6 @@ core: - location: "eva_datasets" - sqlalchemy_database_uri: 'mysql+pymysql://root@localhost/eva_catalog' + datasets_dir: "" + catalog_database_uri: "" application: "eva" mode: "debug" #release @@ -12,9 +12,9 @@ executor: # batch size used for gpu_operations gpu_batch_size: 1 - gpus: {'130.207.125.60': [0]} + gpus: {'127.0.0.1': [0]} storage: - engine: "src.storage.petastorm_storage_engine.PetastormStorageEngine" + engine: "eva.storage.petastorm_storage_engine.PetastormStorageEngine" path_prefix: "/tmp" # https://petastorm.readthedocs.io/en/latest/api.html#module-petastorm.reader petastorm: {'cache_type' : 'local-disk', diff --git a/eva_cmd_client.py b/eva/eva_cmd_client.py similarity index 72% rename from eva_cmd_client.py rename to eva/eva_cmd_client.py index 2be800352..0311bb8a7 100644 --- a/eva_cmd_client.py +++ b/eva/eva_cmd_client.py @@ -13,9 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. import argparse +import sys +from os.path import dirname, abspath, join -from src.server.interpreter import start_cmd_client -from src.utils.logging_manager import LoggingManager, LoggingLevel +''' +To allow running eva_server from any location +''' +THIS_DIR = dirname(__file__) +EVA_CODE_DIR = abspath(join(THIS_DIR, '..')) +sys.path.append(EVA_CODE_DIR) + +from eva.server.interpreter import start_cmd_client # noqa: E402 +from eva.utils.logging_manager import LoggingManager, \ + LoggingLevel # noqa: E402 def eva_client(host='0.0.0.0', port=5432): @@ -27,16 +37,22 @@ def eva_client(host='0.0.0.0', port=5432): try: start_cmd_client(host=host, port=port) except Exception as e: - raise e LoggingManager().log(e, LoggingLevel.CRITICAL) -if __name__ == '__main__': +def parse_args(args): parser = argparse.ArgumentParser(description='') parser.add_argument('-H', '--host', dest='host', type=str, help='Host address for EVA server', default='0.0.0.0') parser.add_argument('-P', '--port', dest='port', type=int, help='Port for EVA server', default=5432) - args = parser.parse_args() + return parser.parse_args(args) + +def main(): + args = parse_args(sys.argv[1:]) eva_client(host=args.host, port=args.port) + + +if __name__ == '__main__': + main() diff --git a/eva.py b/eva/eva_server.py similarity index 73% rename from eva.py rename to eva/eva_server.py index 654f2de81..4f3b05a7f 100644 --- a/eva.py +++ b/eva/eva_server.py @@ -14,19 +14,28 @@ # limitations under the License. import asyncio +import sys +from os.path import dirname, abspath, join -from src.server.server import start_server -from src.udfs.udf_bootstrap_queries import init_builtin_udfs -from src.configuration.configuration_manager import ConfigurationManager -from src.utils.logging_manager import LoggingManager -from src.utils.logging_manager import LoggingLevel +''' +To allow running eva_server from any location +''' +THIS_DIR = dirname(__file__) +EVA_CODE_DIR = abspath(join(THIS_DIR, '..')) +sys.path.append(EVA_CODE_DIR) + +from eva.server.server import start_server # noqa: E402 +from eva.udfs.udf_bootstrap_queries import init_builtin_udfs # noqa: E402 +from eva.configuration.configuration_manager import \ + ConfigurationManager # noqa: E402 +from eva.utils.logging_manager import LoggingManager # noqa: E402 +from eva.utils.logging_manager import LoggingLevel # noqa: E402 def eva(): """ Start the eva system """ - # Get the hostname and port information from the configuration file config = ConfigurationManager() hostname = config.get_value('server', 'host') @@ -48,8 +57,12 @@ def eva(): LoggingManager().log(e, LoggingLevel.CRITICAL) -if __name__ == '__main__': - # execute only if run as the entry point into the program +def main(): mode = ConfigurationManager().get_value('core', 'mode') init_builtin_udfs(mode=mode) eva() + + +if __name__ == '__main__': + # execute only if run as the entry point into the program + main() diff --git a/src/executor/__init__.py b/eva/executor/__init__.py similarity index 100% rename from src/executor/__init__.py rename to eva/executor/__init__.py diff --git a/src/executor/abstract_executor.py b/eva/executor/abstract_executor.py similarity index 97% rename from src/executor/abstract_executor.py rename to eva/executor/abstract_executor.py index 0067bbc4e..8e9f001cb 100644 --- a/src/executor/abstract_executor.py +++ b/eva/executor/abstract_executor.py @@ -15,7 +15,7 @@ from abc import ABC, abstractmethod from typing import List -from src.planner.abstract_plan import AbstractPlan +from eva.planner.abstract_plan import AbstractPlan class AbstractExecutor(ABC): diff --git a/src/executor/abstract_storage_executor.py b/eva/executor/abstract_storage_executor.py similarity index 88% rename from src/executor/abstract_storage_executor.py rename to eva/executor/abstract_storage_executor.py index 865907c4a..003e49a3f 100644 --- a/src/executor/abstract_storage_executor.py +++ b/eva/executor/abstract_storage_executor.py @@ -14,8 +14,8 @@ # limitations under the License. from abc import ABC -from src.executor.abstract_executor import AbstractExecutor -from src.planner.storage_plan import StoragePlan +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.storage_plan import StoragePlan class AbstractStorageExecutor(AbstractExecutor, ABC): diff --git a/src/executor/create_executor.py b/eva/executor/create_executor.py similarity index 84% rename from src/executor/create_executor.py rename to eva/executor/create_executor.py index 425c83a20..7a3d8b388 100644 --- a/src/executor/create_executor.py +++ b/eva/executor/create_executor.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.catalog.catalog_manager import CatalogManager -from src.planner.create_plan import CreatePlan -from src.executor.abstract_executor import AbstractExecutor -from src.utils.generic_utils import generate_file_path -from src.storage.storage_engine import StorageEngine +from eva.catalog.catalog_manager import CatalogManager +from eva.planner.create_plan import CreatePlan +from eva.executor.abstract_executor import AbstractExecutor +from eva.utils.generic_utils import generate_file_path +from eva.storage.storage_engine import StorageEngine class CreateExecutor(AbstractExecutor): diff --git a/src/executor/create_udf_executor.py b/eva/executor/create_udf_executor.py similarity index 89% rename from src/executor/create_udf_executor.py rename to eva/executor/create_udf_executor.py index 9a6e2f5a4..14e7416e4 100644 --- a/src/executor/create_udf_executor.py +++ b/eva/executor/create_udf_executor.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.catalog.catalog_manager import CatalogManager -from src.executor.abstract_executor import AbstractExecutor -from src.planner.create_udf_plan import CreateUDFPlan +from eva.catalog.catalog_manager import CatalogManager +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.create_udf_plan import CreateUDFPlan class CreateUDFExecutor(AbstractExecutor): diff --git a/src/executor/disk_based_storage_executor.py b/eva/executor/disk_based_storage_executor.py similarity index 87% rename from src/executor/disk_based_storage_executor.py rename to eva/executor/disk_based_storage_executor.py index 7ab073a79..d5fca22c8 100644 --- a/src/executor/disk_based_storage_executor.py +++ b/eva/executor/disk_based_storage_executor.py @@ -14,11 +14,11 @@ # limitations under the License. from typing import Iterator -from src.readers.opencv_reader import OpenCVReader -from src.models.storage.batch import Batch -from src.executor.abstract_storage_executor import \ +from eva.readers.opencv_reader import OpenCVReader +from eva.models.storage.batch import Batch +from eva.executor.abstract_storage_executor import \ AbstractStorageExecutor -from src.planner.storage_plan import StoragePlan +from eva.planner.storage_plan import StoragePlan class DiskStorageExecutor(AbstractStorageExecutor): diff --git a/src/executor/execution_context.py b/eva/executor/execution_context.py similarity index 95% rename from src/executor/execution_context.py rename to eva/executor/execution_context.py index 3b8c8e11d..49bfef9a9 100644 --- a/src/executor/execution_context.py +++ b/eva/executor/execution_context.py @@ -17,9 +17,9 @@ import socket from typing import Set, List -from src.configuration.configuration_manager import ConfigurationManager -from src.constants import NO_GPU -from src.utils.generic_utils import is_gpu_available +from eva.configuration.configuration_manager import ConfigurationManager +from eva.constants import NO_GPU +from eva.utils.generic_utils import is_gpu_available class Context: diff --git a/src/executor/insert_executor.py b/eva/executor/insert_executor.py similarity index 83% rename from src/executor/insert_executor.py rename to eva/executor/insert_executor.py index 53fcce153..3fdf86969 100644 --- a/src/executor/insert_executor.py +++ b/eva/executor/insert_executor.py @@ -13,12 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.catalog.catalog_manager import CatalogManager -from src.planner.insert_plan import InsertPlan -from src.executor.abstract_executor import AbstractExecutor -from src.storage.storage_engine import StorageEngine -from src.models.storage.batch import Batch -from src.catalog.schema_utils import SchemaUtils +from eva.catalog.catalog_manager import CatalogManager +from eva.planner.insert_plan import InsertPlan +from eva.executor.abstract_executor import AbstractExecutor +from eva.storage.storage_engine import StorageEngine +from eva.models.storage.batch import Batch +from eva.catalog.schema_utils import SchemaUtils class InsertExecutor(AbstractExecutor): diff --git a/src/executor/limit_executor.py b/eva/executor/limit_executor.py similarity index 90% rename from src/executor/limit_executor.py rename to eva/executor/limit_executor.py index daaf1f56d..042ad5adf 100644 --- a/src/executor/limit_executor.py +++ b/eva/executor/limit_executor.py @@ -14,9 +14,9 @@ # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.planner.limit_plan import LimitPlan +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.limit_plan import LimitPlan class LimitExecutor(AbstractExecutor): diff --git a/src/executor/load_executor.py b/eva/executor/load_executor.py similarity index 86% rename from src/executor/load_executor.py rename to eva/executor/load_executor.py index 461a25d24..07c985a0e 100644 --- a/src/executor/load_executor.py +++ b/eva/executor/load_executor.py @@ -16,12 +16,12 @@ import os import pandas as pd -from src.planner.load_data_plan import LoadDataPlan -from src.executor.abstract_executor import AbstractExecutor -from src.storage.storage_engine import StorageEngine -from src.readers.opencv_reader import OpenCVReader -from src.models.storage.batch import Batch -from src.configuration.configuration_manager import ConfigurationManager +from eva.planner.load_data_plan import LoadDataPlan +from eva.executor.abstract_executor import AbstractExecutor +from eva.storage.storage_engine import StorageEngine +from eva.readers.opencv_reader import OpenCVReader +from eva.models.storage.batch import Batch +from eva.configuration.configuration_manager import ConfigurationManager class LoadDataExecutor(AbstractExecutor): diff --git a/src/executor/orderby_executor.py b/eva/executor/orderby_executor.py similarity index 92% rename from src/executor/orderby_executor.py rename to eva/executor/orderby_executor.py index 90a7c8d91..37fdfe2c4 100644 --- a/src/executor/orderby_executor.py +++ b/eva/executor/orderby_executor.py @@ -14,10 +14,10 @@ # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.parser.types import ParserOrderBySortType -from src.planner.orderby_plan import OrderByPlan +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.parser.types import ParserOrderBySortType +from eva.planner.orderby_plan import OrderByPlan class OrderByExecutor(AbstractExecutor): diff --git a/src/executor/plan_executor.py b/eva/executor/plan_executor.py similarity index 79% rename from src/executor/plan_executor.py rename to eva/executor/plan_executor.py index f1b066518..d86ee13e8 100644 --- a/src/executor/plan_executor.py +++ b/eva/executor/plan_executor.py @@ -14,22 +14,22 @@ # limitations under the License. from typing import Iterator -from src.executor.abstract_executor import AbstractExecutor -from src.executor.limit_executor import LimitExecutor -from src.executor.sample_executor import SampleExecutor -from src.executor.seq_scan_executor import SequentialScanExecutor -from src.models.storage.batch import Batch -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType -from src.executor.pp_executor import PPExecutor -from src.executor.create_executor import CreateExecutor -from src.executor.insert_executor import InsertExecutor -from src.executor.create_udf_executor import CreateUDFExecutor -from src.executor.load_executor import LoadDataExecutor -from src.executor.upload_executor import UploadExecutor -from src.executor.storage_executor import StorageExecutor -from src.executor.union_executor import UnionExecutor -from src.executor.orderby_executor import OrderByExecutor +from eva.executor.abstract_executor import AbstractExecutor +from eva.executor.limit_executor import LimitExecutor +from eva.executor.sample_executor import SampleExecutor +from eva.executor.seq_scan_executor import SequentialScanExecutor +from eva.models.storage.batch import Batch +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType +from eva.executor.pp_executor import PPExecutor +from eva.executor.create_executor import CreateExecutor +from eva.executor.insert_executor import InsertExecutor +from eva.executor.create_udf_executor import CreateUDFExecutor +from eva.executor.load_executor import LoadDataExecutor +from eva.executor.upload_executor import UploadExecutor +from eva.executor.storage_executor import StorageExecutor +from eva.executor.union_executor import UnionExecutor +from eva.executor.orderby_executor import OrderByExecutor class PlanExecutor: diff --git a/src/executor/pp_executor.py b/eva/executor/pp_executor.py similarity index 91% rename from src/executor/pp_executor.py rename to eva/executor/pp_executor.py index d8132d236..6f31f37cf 100644 --- a/src/executor/pp_executor.py +++ b/eva/executor/pp_executor.py @@ -14,9 +14,9 @@ # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.planner.pp_plan import PPScanPlan +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.pp_plan import PPScanPlan class PPExecutor(AbstractExecutor): diff --git a/src/executor/sample_executor.py b/eva/executor/sample_executor.py similarity index 88% rename from src/executor/sample_executor.py rename to eva/executor/sample_executor.py index 27268fccd..440ea848e 100644 --- a/src/executor/sample_executor.py +++ b/eva/executor/sample_executor.py @@ -14,9 +14,9 @@ # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.planner.sample_plan import SamplePlan +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.sample_plan import SamplePlan class SampleExecutor(AbstractExecutor): diff --git a/src/executor/seq_scan_executor.py b/eva/executor/seq_scan_executor.py similarity index 91% rename from src/executor/seq_scan_executor.py rename to eva/executor/seq_scan_executor.py index 65c9be6f3..5d48ca836 100644 --- a/src/executor/seq_scan_executor.py +++ b/eva/executor/seq_scan_executor.py @@ -14,9 +14,9 @@ # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.planner.seq_scan_plan import SeqScanPlan +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.seq_scan_plan import SeqScanPlan class SequentialScanExecutor(AbstractExecutor): diff --git a/src/executor/storage_executor.py b/eva/executor/storage_executor.py similarity index 81% rename from src/executor/storage_executor.py rename to eva/executor/storage_executor.py index 9ccc5c5d3..3364f638d 100644 --- a/src/executor/storage_executor.py +++ b/eva/executor/storage_executor.py @@ -13,10 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.planner.storage_plan import StoragePlan -from src.storage.storage_engine import StorageEngine +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.storage_plan import StoragePlan +from eva.storage.storage_engine import StorageEngine class StorageExecutor(AbstractExecutor): diff --git a/src/executor/union_executor.py b/eva/executor/union_executor.py similarity index 85% rename from src/executor/union_executor.py rename to eva/executor/union_executor.py index 0e04c70bb..d998d4b31 100644 --- a/src/executor/union_executor.py +++ b/eva/executor/union_executor.py @@ -14,10 +14,10 @@ # limitations under the License. from typing import Iterator -from src.models.storage.batch import Batch -from src.executor.abstract_executor import AbstractExecutor -from src.planner.union_plan import UnionPlan -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.models.storage.batch import Batch +from eva.executor.abstract_executor import AbstractExecutor +from eva.planner.union_plan import UnionPlan +from eva.utils.logging_manager import LoggingManager, LoggingLevel class UnionExecutor(AbstractExecutor): diff --git a/src/executor/upload_executor.py b/eva/executor/upload_executor.py similarity index 89% rename from src/executor/upload_executor.py rename to eva/executor/upload_executor.py index 6def2177f..8fdb288a2 100644 --- a/src/executor/upload_executor.py +++ b/eva/executor/upload_executor.py @@ -15,10 +15,10 @@ import os import base64 -from src.planner.upload_plan import UploadPlan -from src.executor.abstract_executor import AbstractExecutor +from eva.planner.upload_plan import UploadPlan +from eva.executor.abstract_executor import AbstractExecutor -from src.configuration.configuration_manager import ConfigurationManager +from eva.configuration.configuration_manager import ConfigurationManager class UploadExecutor(AbstractExecutor): diff --git a/src/expression/__init__.py b/eva/expression/__init__.py similarity index 100% rename from src/expression/__init__.py rename to eva/expression/__init__.py diff --git a/src/expression/abstract_expression.py b/eva/expression/abstract_expression.py similarity index 99% rename from src/expression/abstract_expression.py rename to eva/expression/abstract_expression.py index 8a466777e..562e6469a 100644 --- a/src/expression/abstract_expression.py +++ b/eva/expression/abstract_expression.py @@ -15,7 +15,7 @@ from abc import ABC, abstractmethod from enum import IntEnum, unique, auto -from src.utils import generic_utils +from eva.utils import generic_utils @unique diff --git a/src/expression/aggregation_expression.py b/eva/expression/aggregation_expression.py similarity index 95% rename from src/expression/aggregation_expression.py rename to eva/expression/aggregation_expression.py index 00277f606..3c4193d00 100644 --- a/src/expression/aggregation_expression.py +++ b/eva/expression/aggregation_expression.py @@ -12,10 +12,10 @@ # 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 src.expression.abstract_expression import AbstractExpression, \ +from eva.expression.abstract_expression import AbstractExpression, \ ExpressionType, \ ExpressionReturnType -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class AggregationExpression(AbstractExpression): diff --git a/src/expression/arithmetic_expression.py b/eva/expression/arithmetic_expression.py similarity index 94% rename from src/expression/arithmetic_expression.py rename to eva/expression/arithmetic_expression.py index abd0905cd..c9062ea82 100644 --- a/src/expression/arithmetic_expression.py +++ b/eva/expression/arithmetic_expression.py @@ -12,10 +12,10 @@ # 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 src.expression.abstract_expression import AbstractExpression, \ +from eva.expression.abstract_expression import AbstractExpression, \ ExpressionType, ExpressionReturnType import pandas as pd -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class ArithmeticExpression(AbstractExpression): diff --git a/src/expression/comparison_expression.py b/eva/expression/comparison_expression.py similarity index 96% rename from src/expression/comparison_expression.py rename to eva/expression/comparison_expression.py index efc8a5e13..946250dae 100644 --- a/src/expression/comparison_expression.py +++ b/eva/expression/comparison_expression.py @@ -15,10 +15,10 @@ import pandas as pd import numpy as np -from src.expression.abstract_expression import AbstractExpression, \ +from eva.expression.abstract_expression import AbstractExpression, \ ExpressionType, \ ExpressionReturnType -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class ComparisonExpression(AbstractExpression): diff --git a/src/expression/constant_value_expression.py b/eva/expression/constant_value_expression.py similarity index 92% rename from src/expression/constant_value_expression.py rename to eva/expression/constant_value_expression.py index 64433637c..706652201 100644 --- a/src/expression/constant_value_expression.py +++ b/eva/expression/constant_value_expression.py @@ -14,10 +14,10 @@ # limitations under the License. import pandas as pd from typing import Any -from src.expression.abstract_expression import AbstractExpression, \ +from eva.expression.abstract_expression import AbstractExpression, \ ExpressionType -from src.models.storage.batch import Batch -from src.catalog.column_type import ColumnType +from eva.models.storage.batch import Batch +from eva.catalog.column_type import ColumnType class ConstantValueExpression(AbstractExpression): diff --git a/src/expression/expression_utils.py b/eva/expression/expression_utils.py similarity index 100% rename from src/expression/expression_utils.py rename to eva/expression/expression_utils.py diff --git a/src/expression/function_expression.py b/eva/expression/function_expression.py similarity index 93% rename from src/expression/function_expression.py rename to eva/expression/function_expression.py index a28e1e49a..961ffcc46 100644 --- a/src/expression/function_expression.py +++ b/eva/expression/function_expression.py @@ -16,13 +16,13 @@ from enum import Enum, unique from typing import Callable -from src.constants import NO_GPU -from src.executor.execution_context import Context -from src.expression.abstract_expression import AbstractExpression, \ +from eva.constants import NO_GPU +from eva.executor.execution_context import Context +from eva.expression.abstract_expression import AbstractExpression, \ ExpressionType -from src.models.storage.batch import Batch -from src.udfs.gpu_compatible import GPUCompatible -from src.catalog.models.udf_io import UdfIO +from eva.models.storage.batch import Batch +from eva.udfs.gpu_compatible import GPUCompatible +from eva.catalog.models.udf_io import UdfIO @unique diff --git a/src/expression/logical_expression.py b/eva/expression/logical_expression.py similarity index 95% rename from src/expression/logical_expression.py rename to eva/expression/logical_expression.py index 61740f2b9..3ee5f9ea1 100644 --- a/src/expression/logical_expression.py +++ b/eva/expression/logical_expression.py @@ -12,11 +12,11 @@ # 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 src.expression.abstract_expression import AbstractExpression, \ +from eva.expression.abstract_expression import AbstractExpression, \ ExpressionType, \ ExpressionReturnType import pandas as pd -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class LogicalExpression(AbstractExpression): diff --git a/src/expression/tuple_value_expression.py b/eva/expression/tuple_value_expression.py similarity index 96% rename from src/expression/tuple_value_expression.py rename to eva/expression/tuple_value_expression.py index 4723ef2ac..5ae8a74d9 100644 --- a/src/expression/tuple_value_expression.py +++ b/eva/expression/tuple_value_expression.py @@ -12,8 +12,8 @@ # 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 src.catalog.models.df_column import DataFrameColumn -from src.models.storage.batch import Batch +from eva.catalog.models.df_column import DataFrameColumn +from eva.models.storage.batch import Batch from .abstract_expression import AbstractExpression, ExpressionType, \ ExpressionReturnType diff --git a/src/models/__init__.py b/eva/models/__init__.py similarity index 100% rename from src/models/__init__.py rename to eva/models/__init__.py diff --git a/src/catalog/services/__init__.py b/eva/models/catalog/__init__.py similarity index 100% rename from src/catalog/services/__init__.py rename to eva/models/catalog/__init__.py diff --git a/src/models/catalog/frame_info.py b/eva/models/catalog/frame_info.py similarity index 97% rename from src/models/catalog/frame_info.py rename to eva/models/catalog/frame_info.py index cff49751e..c341bbdad 100644 --- a/src/models/catalog/frame_info.py +++ b/eva/models/catalog/frame_info.py @@ -12,7 +12,7 @@ # 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 src.models.catalog.properties import ColorSpace +from eva.models.catalog.properties import ColorSpace class FrameInfo: diff --git a/src/models/catalog/properties.py b/eva/models/catalog/properties.py similarity index 100% rename from src/models/catalog/properties.py rename to eva/models/catalog/properties.py diff --git a/src/models/catalog/__init__.py b/eva/models/server/__init__.py similarity index 100% rename from src/models/catalog/__init__.py rename to eva/models/server/__init__.py diff --git a/src/models/server/response.py b/eva/models/server/response.py similarity index 97% rename from src/models/server/response.py rename to eva/models/server/response.py index 8d9d4e4ba..3b342ff61 100644 --- a/src/models/server/response.py +++ b/eva/models/server/response.py @@ -1,7 +1,7 @@ import json from enum import Enum -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class ResponseStatus(str, Enum): diff --git a/src/models/storage/__init__.py b/eva/models/storage/__init__.py similarity index 100% rename from src/models/storage/__init__.py rename to eva/models/storage/__init__.py diff --git a/src/models/storage/batch.py b/eva/models/storage/batch.py similarity index 99% rename from src/models/storage/batch.py rename to eva/models/storage/batch.py index 0ff2db0be..89c6b8527 100644 --- a/src/models/storage/batch.py +++ b/eva/models/storage/batch.py @@ -19,7 +19,7 @@ from typing import Iterable from pandas import DataFrame -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.utils.logging_manager import LoggingManager, LoggingLevel class BatchEncoder(json.JSONEncoder): diff --git a/src/optimizer/__init__.py b/eva/optimizer/__init__.py similarity index 100% rename from src/optimizer/__init__.py rename to eva/optimizer/__init__.py diff --git a/src/optimizer/binder.py b/eva/optimizer/binder.py similarity index 92% rename from src/optimizer/binder.py rename to eva/optimizer/binder.py index 0aa62b4be..818e1712a 100644 --- a/src/optimizer/binder.py +++ b/eva/optimizer/binder.py @@ -14,10 +14,10 @@ # limitations under the License. import itertools -from src.optimizer.rules.pattern import Pattern -from src.optimizer.group_expression import GroupExpression -from src.optimizer.memo import Memo -from src.optimizer.operators import Operator, OperatorType +from eva.optimizer.rules.pattern import Pattern +from eva.optimizer.group_expression import GroupExpression +from eva.optimizer.memo import Memo +from eva.optimizer.operators import Operator, OperatorType class Binder: diff --git a/src/optimizer/group.py b/eva/optimizer/group.py similarity index 93% rename from src/optimizer/group.py rename to eva/optimizer/group.py index 1e440053b..3202cf92b 100644 --- a/src/optimizer/group.py +++ b/eva/optimizer/group.py @@ -16,10 +16,10 @@ from __future__ import annotations from typing import Dict -from src.optimizer.property import Property -from src.optimizer.group_expression import GroupExpression -from src.utils.logging_manager import LoggingManager -from src.constants import INVALID_GROUP_ID +from eva.optimizer.property import Property +from eva.optimizer.group_expression import GroupExpression +from eva.utils.logging_manager import LoggingManager +from eva.constants import INVALID_GROUP_ID class Winner: diff --git a/src/optimizer/group_expression.py b/eva/optimizer/group_expression.py similarity index 94% rename from src/optimizer/group_expression.py rename to eva/optimizer/group_expression.py index bcfa14bc2..bcdc822ff 100644 --- a/src/optimizer/group_expression.py +++ b/eva/optimizer/group_expression.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.optimizer.operators import Operator -from src.optimizer.rules.rules import RuleType -from src.constants import INVALID_GROUP_ID +from eva.optimizer.operators import Operator +from eva.optimizer.rules.rules import RuleType +from eva.constants import INVALID_GROUP_ID from typing import List diff --git a/src/optimizer/memo.py b/eva/optimizer/memo.py similarity index 97% rename from src/optimizer/memo.py rename to eva/optimizer/memo.py index 811d85ca5..0fa20b337 100644 --- a/src/optimizer/memo.py +++ b/eva/optimizer/memo.py @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.optimizer.group_expression import GroupExpression -from src.optimizer.group import Group, INVALID_GROUP_ID +from eva.optimizer.group_expression import GroupExpression +from eva.optimizer.group import Group, INVALID_GROUP_ID class Memo: diff --git a/src/optimizer/operators.py b/eva/optimizer/operators.py similarity index 97% rename from src/optimizer/operators.py rename to eva/optimizer/operators.py index dc2c51638..d795be0a7 100644 --- a/src/optimizer/operators.py +++ b/eva/optimizer/operators.py @@ -15,12 +15,12 @@ from enum import IntEnum, auto from typing import List -from src.catalog.models.df_metadata import DataFrameMetadata -from src.expression.constant_value_expression import ConstantValueExpression -from src.parser.table_ref import TableRef -from src.expression.abstract_expression import AbstractExpression -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.models.udf_io import UdfIO +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.parser.table_ref import TableRef +from eva.expression.abstract_expression import AbstractExpression +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.models.udf_io import UdfIO from pathlib import Path diff --git a/src/optimizer/optimizer_context.py b/eva/optimizer/optimizer_context.py similarity index 92% rename from src/optimizer/optimizer_context.py rename to eva/optimizer/optimizer_context.py index 79d2a47ca..18c883c7d 100644 --- a/src/optimizer/optimizer_context.py +++ b/eva/optimizer/optimizer_context.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. import copy -from src.optimizer.optimizer_task_stack import OptimizerTaskStack -from src.optimizer.memo import Memo -from src.optimizer.operators import Operator -from src.optimizer.group_expression import GroupExpression -from src.constants import INVALID_GROUP_ID +from eva.optimizer.optimizer_task_stack import OptimizerTaskStack +from eva.optimizer.memo import Memo +from eva.optimizer.operators import Operator +from eva.optimizer.group_expression import GroupExpression +from eva.constants import INVALID_GROUP_ID class OptimizerContext: diff --git a/src/optimizer/optimizer_task_stack.py b/eva/optimizer/optimizer_task_stack.py similarity index 94% rename from src/optimizer/optimizer_task_stack.py rename to eva/optimizer/optimizer_task_stack.py index cc92ce641..18092871f 100644 --- a/src/optimizer/optimizer_task_stack.py +++ b/eva/optimizer/optimizer_task_stack.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from collections import deque -from src.optimizer.optimizer_tasks import OptimizerTask +from eva.optimizer.optimizer_tasks import OptimizerTask class OptimizerTaskStack(): diff --git a/src/optimizer/optimizer_tasks.py b/eva/optimizer/optimizer_tasks.py similarity index 97% rename from src/optimizer/optimizer_tasks.py rename to eva/optimizer/optimizer_tasks.py index 15daf9408..53466761a 100644 --- a/src/optimizer/optimizer_tasks.py +++ b/eva/optimizer/optimizer_tasks.py @@ -14,15 +14,15 @@ # limitations under the License. from __future__ import annotations from enum import IntEnum, auto -from src.optimizer.rules.rules import RulesManager -from src.optimizer.group_expression import GroupExpression -from src.optimizer.binder import Binder -from src.optimizer.property import PropertyType -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.optimizer.rules.rules import RulesManager +from eva.optimizer.group_expression import GroupExpression +from eva.optimizer.binder import Binder +from eva.optimizer.property import PropertyType +from eva.utils.logging_manager import LoggingManager, LoggingLevel from typing import TYPE_CHECKING if TYPE_CHECKING: - from src.optimizer.optimizer_context import OptimizerContext + from eva.optimizer.optimizer_context import OptimizerContext class OptimizerTaskType(IntEnum): diff --git a/src/optimizer/optimizer_utils.py b/eva/optimizer/optimizer_utils.py similarity index 91% rename from src/optimizer/optimizer_utils.py rename to eva/optimizer/optimizer_utils.py index 29c82b53c..a7bbf855c 100644 --- a/src/optimizer/optimizer_utils.py +++ b/eva/optimizer/optimizer_utils.py @@ -14,22 +14,22 @@ # limitations under the License. from typing import List -from src.catalog.models.df_metadata import DataFrameMetadata -from src.expression.function_expression import FunctionExpression -from src.parser.table_ref import TableInfo -from src.catalog.catalog_manager import CatalogManager -from src.catalog.column_type import ColumnType, NdArrayType - -from src.expression.abstract_expression import AbstractExpression -from src.expression.tuple_value_expression import ExpressionType, \ +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.expression.function_expression import FunctionExpression +from eva.parser.table_ref import TableInfo +from eva.catalog.catalog_manager import CatalogManager +from eva.catalog.column_type import ColumnType, NdArrayType + +from eva.expression.abstract_expression import AbstractExpression +from eva.expression.tuple_value_expression import ExpressionType, \ TupleValueExpression -from src.parser.create_statement import ColumnDefinition, \ +from eva.parser.create_statement import ColumnDefinition, \ ColConstraintInfo -from src.utils.generic_utils import path_to_class, generate_file_path +from eva.utils.generic_utils import path_to_class, generate_file_path -from src.utils.logging_manager import LoggingLevel -from src.utils.logging_manager import LoggingManager +from eva.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager def bind_dataset(video_info: TableInfo) -> DataFrameMetadata: diff --git a/src/optimizer/plan_generator.py b/eva/optimizer/plan_generator.py similarity index 92% rename from src/optimizer/plan_generator.py rename to eva/optimizer/plan_generator.py index 37e398e9c..3a568dc42 100644 --- a/src/optimizer/plan_generator.py +++ b/eva/optimizer/plan_generator.py @@ -12,12 +12,12 @@ # 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 src.optimizer.operators import Operator -from src.optimizer.optimizer_context import OptimizerContext -from src.optimizer.optimizer_tasks import ( +from eva.optimizer.operators import Operator +from eva.optimizer.optimizer_context import OptimizerContext +from eva.optimizer.optimizer_tasks import ( TopDownRewrite, OptimizeGroup, BottomUpRewrite) -from src.optimizer.optimizer_task_stack import OptimizerTaskStack -from src.optimizer.property import PropertyType +from eva.optimizer.optimizer_task_stack import OptimizerTaskStack +from eva.optimizer.property import PropertyType class PlanGenerator: diff --git a/src/optimizer/property.py b/eva/optimizer/property.py similarity index 100% rename from src/optimizer/property.py rename to eva/optimizer/property.py diff --git a/src/optimizer/rules/__init__.py b/eva/optimizer/rules/__init__.py similarity index 100% rename from src/optimizer/rules/__init__.py rename to eva/optimizer/rules/__init__.py diff --git a/src/optimizer/rules/pattern.py b/eva/optimizer/rules/pattern.py similarity index 95% rename from src/optimizer/rules/pattern.py rename to eva/optimizer/rules/pattern.py index edc376049..29e733495 100644 --- a/src/optimizer/rules/pattern.py +++ b/eva/optimizer/rules/pattern.py @@ -14,7 +14,7 @@ # limitations under the License. from __future__ import annotations -from src.optimizer.operators import OperatorType +from eva.optimizer.operators import OperatorType class Pattern: diff --git a/src/optimizer/rules/rules.py b/eva/optimizer/rules/rules.py similarity index 96% rename from src/optimizer/rules/rules.py rename to eva/optimizer/rules/rules.py index 4b39a6225..521dd0e75 100644 --- a/src/optimizer/rules/rules.py +++ b/eva/optimizer/rules/rules.py @@ -19,27 +19,27 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from src.optimizer.optimizer_context import OptimizerContext + from eva.optimizer.optimizer_context import OptimizerContext -from src.optimizer.rules.pattern import Pattern -from src.optimizer.operators import OperatorType, Operator -from src.optimizer.operators import ( +from eva.optimizer.rules.pattern import Pattern +from eva.optimizer.operators import OperatorType, Operator +from eva.optimizer.operators import ( LogicalCreate, LogicalInsert, LogicalLoadData, LogicalUpload, LogicalCreateUDF, LogicalProject, LogicalGet, LogicalFilter, LogicalUnion, LogicalOrderBy, LogicalLimit, LogicalQueryDerivedGet, LogicalSample) -from src.planner.create_plan import CreatePlan -from src.planner.create_udf_plan import CreateUDFPlan -from src.planner.insert_plan import InsertPlan -from src.planner.load_data_plan import LoadDataPlan -from src.planner.upload_plan import UploadPlan -from src.planner.seq_scan_plan import SeqScanPlan -from src.planner.storage_plan import StoragePlan -from src.planner.union_plan import UnionPlan -from src.planner.orderby_plan import OrderByPlan -from src.planner.limit_plan import LimitPlan -from src.planner.sample_plan import SamplePlan -from src.configuration.configuration_manager import ConfigurationManager +from eva.planner.create_plan import CreatePlan +from eva.planner.create_udf_plan import CreateUDFPlan +from eva.planner.insert_plan import InsertPlan +from eva.planner.load_data_plan import LoadDataPlan +from eva.planner.upload_plan import UploadPlan +from eva.planner.seq_scan_plan import SeqScanPlan +from eva.planner.storage_plan import StoragePlan +from eva.planner.union_plan import UnionPlan +from eva.planner.orderby_plan import OrderByPlan +from eva.planner.limit_plan import LimitPlan +from eva.planner.sample_plan import SamplePlan +from eva.configuration.configuration_manager import ConfigurationManager class RuleType(Flag): diff --git a/src/optimizer/statement_to_opr_convertor.py b/eva/optimizer/statement_to_opr_convertor.py similarity index 92% rename from src/optimizer/statement_to_opr_convertor.py rename to eva/optimizer/statement_to_opr_convertor.py index daac739ff..792956cca 100644 --- a/src/optimizer/statement_to_opr_convertor.py +++ b/eva/optimizer/statement_to_opr_convertor.py @@ -12,29 +12,29 @@ # 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 src.catalog.models.df_metadata import DataFrameMetadata -from src.expression.abstract_expression import AbstractExpression -from src.optimizer.operators import (LogicalGet, LogicalFilter, LogicalProject, +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.expression.abstract_expression import AbstractExpression +from eva.optimizer.operators import (LogicalGet, LogicalFilter, LogicalProject, LogicalInsert, LogicalCreate, LogicalCreateUDF, LogicalLoadData, LogicalUpload, LogicalQueryDerivedGet, LogicalUnion, LogicalOrderBy, LogicalLimit, LogicalSample) -from src.parser.statement import AbstractStatement -from src.parser.select_statement import SelectStatement -from src.parser.insert_statement import InsertTableStatement -from src.parser.create_statement import CreateTableStatement -from src.parser.create_udf_statement import CreateUDFStatement -from src.parser.load_statement import LoadDataStatement -from src.parser.upload_statement import UploadStatement -from src.optimizer.optimizer_utils import (bind_table_ref, bind_columns_expr, +from eva.parser.statement import AbstractStatement +from eva.parser.select_statement import SelectStatement +from eva.parser.insert_statement import InsertTableStatement +from eva.parser.create_statement import CreateTableStatement +from eva.parser.create_udf_statement import CreateUDFStatement +from eva.parser.load_statement import LoadDataStatement +from eva.parser.upload_statement import UploadStatement +from eva.optimizer.optimizer_utils import (bind_table_ref, bind_columns_expr, bind_predicate_expr, create_column_metadata, bind_dataset, column_definition_to_udf_io, create_video_metadata) -from src.parser.table_ref import TableRef -from src.utils.logging_manager import LoggingLevel, LoggingManager +from eva.parser.table_ref import TableRef +from eva.utils.logging_manager import LoggingLevel, LoggingManager class StatementToPlanConvertor: diff --git a/src/parser/__init__.py b/eva/parser/__init__.py similarity index 100% rename from src/parser/__init__.py rename to eva/parser/__init__.py diff --git a/src/parser/create_statement.py b/eva/parser/create_statement.py similarity index 94% rename from src/parser/create_statement.py rename to eva/parser/create_statement.py index 994738e65..a86da0052 100644 --- a/src/parser/create_statement.py +++ b/eva/parser/create_statement.py @@ -14,11 +14,11 @@ # limitations under the License. from typing import List -from src.parser.statement import AbstractStatement +from eva.parser.statement import AbstractStatement -from src.parser.types import StatementType -from src.parser.table_ref import TableRef -from src.catalog.column_type import ColumnType, NdArrayType +from eva.parser.types import StatementType +from eva.parser.table_ref import TableRef +from eva.catalog.column_type import ColumnType, NdArrayType class ColConstraintInfo: diff --git a/src/parser/create_udf_statement.py b/eva/parser/create_udf_statement.py similarity index 95% rename from src/parser/create_udf_statement.py rename to eva/parser/create_udf_statement.py index 04b96b2a2..8a13864cd 100644 --- a/src/parser/create_udf_statement.py +++ b/eva/parser/create_udf_statement.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.statement import AbstractStatement +from eva.parser.statement import AbstractStatement -from src.parser.types import StatementType +from eva.parser.types import StatementType from typing import List -from src.parser.create_statement import ColumnDefinition +from eva.parser.create_statement import ColumnDefinition from pathlib import Path diff --git a/src/parser/evaql/__init__.py b/eva/parser/evaql/__init__.py similarity index 100% rename from src/parser/evaql/__init__.py rename to eva/parser/evaql/__init__.py diff --git a/src/parser/evaql/evaql_lexer.g4 b/eva/parser/evaql/evaql_lexer.g4 similarity index 100% rename from src/parser/evaql/evaql_lexer.g4 rename to eva/parser/evaql/evaql_lexer.g4 diff --git a/src/parser/evaql/evaql_parser.g4 b/eva/parser/evaql/evaql_parser.g4 similarity index 100% rename from src/parser/evaql/evaql_parser.g4 rename to eva/parser/evaql/evaql_parser.g4 diff --git a/src/parser/insert_statement.py b/eva/parser/insert_statement.py similarity index 91% rename from src/parser/insert_statement.py rename to eva/parser/insert_statement.py index 51666f639..4c481beee 100644 --- a/src/parser/insert_statement.py +++ b/eva/parser/insert_statement.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.statement import AbstractStatement +from eva.parser.statement import AbstractStatement -from src.parser.types import StatementType -from src.expression.abstract_expression import AbstractExpression -from src.parser.table_ref import TableRef +from eva.parser.types import StatementType +from eva.expression.abstract_expression import AbstractExpression +from eva.parser.table_ref import TableRef from typing import List diff --git a/src/parser/load_statement.py b/eva/parser/load_statement.py similarity index 91% rename from src/parser/load_statement.py rename to eva/parser/load_statement.py index 5895e75f3..07f331374 100644 --- a/src/parser/load_statement.py +++ b/eva/parser/load_statement.py @@ -13,10 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.statement import AbstractStatement +from eva.parser.statement import AbstractStatement -from src.parser.types import StatementType -from src.parser.table_ref import TableRef +from eva.parser.types import StatementType +from eva.parser.table_ref import TableRef from pathlib import Path diff --git a/src/parser/parser.py b/eva/parser/parser.py similarity index 94% rename from src/parser/parser.py rename to eva/parser/parser.py index a16d35e8f..310b9391f 100644 --- a/src/parser/parser.py +++ b/eva/parser/parser.py @@ -16,10 +16,10 @@ from antlr4 import InputStream, CommonTokenStream from antlr4.error.ErrorListener import ErrorListener -from src.parser.evaql.evaql_parser import evaql_parser -from src.parser.evaql.evaql_lexer import evaql_lexer +from eva.parser.evaql.evaql_parser import evaql_parser +from eva.parser.evaql.evaql_lexer import evaql_lexer -from src.parser.parser_visitor import ParserVisitor +from eva.parser.parser_visitor import ParserVisitor class MyErrorListener(ErrorListener): diff --git a/src/parser/parser_visitor/__init__.py b/eva/parser/parser_visitor/__init__.py similarity index 75% rename from src/parser/parser_visitor/__init__.py rename to eva/parser/parser_visitor/__init__.py index 4b9489192..f59521984 100644 --- a/src/parser/parser_visitor/__init__.py +++ b/eva/parser/parser_visitor/__init__.py @@ -14,17 +14,17 @@ # limitations under the License. from antlr4 import TerminalNode -from src.parser.evaql.evaql_parser import evaql_parser - -from src.parser.parser_visitor._common_clauses_ids import CommonClauses -from src.parser.parser_visitor._create_statements import CreateTable -from src.parser.parser_visitor._expressions import Expressions -from src.parser.parser_visitor._functions import Functions -from src.parser.parser_visitor._insert_statements import Insert -from src.parser.parser_visitor._select_statement import Select -from src.parser.parser_visitor._table_sources import TableSources -from src.parser.parser_visitor._load_statement import Load -from src.parser.parser_visitor._upload_statement import Upload +from eva.parser.evaql.evaql_parser import evaql_parser + +from eva.parser.parser_visitor._common_clauses_ids import CommonClauses +from eva.parser.parser_visitor._create_statements import CreateTable +from eva.parser.parser_visitor._expressions import Expressions +from eva.parser.parser_visitor._functions import Functions +from eva.parser.parser_visitor._insert_statements import Insert +from eva.parser.parser_visitor._select_statement import Select +from eva.parser.parser_visitor._table_sources import TableSources +from eva.parser.parser_visitor._load_statement import Load +from eva.parser.parser_visitor._upload_statement import Upload # To add new functionality to the parser, create a new file under # the parser_visitor directory, and implement a new class which diff --git a/src/parser/parser_visitor/_common_clauses_ids.py b/eva/parser/parser_visitor/_common_clauses_ids.py similarity index 88% rename from src/parser/parser_visitor/_common_clauses_ids.py rename to eva/parser/parser_visitor/_common_clauses_ids.py index 607196a50..345981f74 100644 --- a/src/parser/parser_visitor/_common_clauses_ids.py +++ b/eva/parser/parser_visitor/_common_clauses_ids.py @@ -14,15 +14,15 @@ # limitations under the License. import warnings -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.expression.tuple_value_expression import TupleValueExpression +from eva.expression.tuple_value_expression import TupleValueExpression -from src.parser.table_ref import TableInfo +from eva.parser.table_ref import TableInfo -from src.parser.evaql.evaql_parser import evaql_parser +from eva.parser.evaql.evaql_parser import evaql_parser -from src.utils.logging_manager import LoggingLevel, LoggingManager +from eva.utils.logging_manager import LoggingLevel, LoggingManager ################################################################## diff --git a/src/parser/parser_visitor/_create_statements.py b/eva/parser/parser_visitor/_create_statements.py similarity index 95% rename from src/parser/parser_visitor/_create_statements.py rename to eva/parser/parser_visitor/_create_statements.py index 4a6956b52..51d36d37c 100644 --- a/src/parser/parser_visitor/_create_statements.py +++ b/eva/parser/parser_visitor/_create_statements.py @@ -13,13 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.create_statement import CreateTableStatement, ColumnDefinition -from src.parser.evaql.evaql_parser import evaql_parser -from src.parser.types import ColumnConstraintEnum -from src.parser.create_statement import ColConstraintInfo +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.create_statement import CreateTableStatement, ColumnDefinition +from eva.parser.evaql.evaql_parser import evaql_parser +from eva.parser.types import ColumnConstraintEnum +from eva.parser.create_statement import ColConstraintInfo -from src.catalog.column_type import ColumnType, NdArrayType, Dimension +from eva.catalog.column_type import ColumnType, NdArrayType, Dimension ################################################################## diff --git a/src/parser/parser_visitor/_expressions.py b/eva/parser/parser_visitor/_expressions.py similarity index 91% rename from src/parser/parser_visitor/_expressions.py rename to eva/parser/parser_visitor/_expressions.py index 4b563a3f4..131324d02 100644 --- a/src/parser/parser_visitor/_expressions.py +++ b/eva/parser/parser_visitor/_expressions.py @@ -15,15 +15,15 @@ import ast import numpy as np -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.expression.abstract_expression import ExpressionType -from src.expression.comparison_expression import ComparisonExpression -from src.expression.constant_value_expression import ConstantValueExpression -from src.expression.logical_expression import LogicalExpression -from src.catalog.column_type import ColumnType +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.expression.abstract_expression import ExpressionType +from eva.expression.comparison_expression import ComparisonExpression +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.expression.logical_expression import LogicalExpression +from eva.catalog.column_type import ColumnType -from src.parser.evaql.evaql_parser import evaql_parser +from eva.parser.evaql.evaql_parser import evaql_parser ################################################################## diff --git a/src/parser/parser_visitor/_functions.py b/eva/parser/parser_visitor/_functions.py similarity index 92% rename from src/parser/parser_visitor/_functions.py rename to eva/parser/parser_visitor/_functions.py index 480dd53fd..bcdceb215 100644 --- a/src/parser/parser_visitor/_functions.py +++ b/eva/parser/parser_visitor/_functions.py @@ -15,12 +15,12 @@ from antlr4 import TerminalNode -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.evaql.evaql_parser import evaql_parser -from src.expression.function_expression import FunctionExpression, \ +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser +from eva.expression.function_expression import FunctionExpression, \ ExecutionMode -from src.parser.create_udf_statement import CreateUDFStatement -from src.utils.logging_manager import LoggingLevel, LoggingManager +from eva.parser.create_udf_statement import CreateUDFStatement +from eva.utils.logging_manager import LoggingLevel, LoggingManager ################################################################## diff --git a/src/parser/parser_visitor/_insert_statements.py b/eva/parser/parser_visitor/_insert_statements.py similarity index 91% rename from src/parser/parser_visitor/_insert_statements.py rename to eva/parser/parser_visitor/_insert_statements.py index 4e1bc301d..a290adb42 100644 --- a/src/parser/parser_visitor/_insert_statements.py +++ b/eva/parser/parser_visitor/_insert_statements.py @@ -16,13 +16,13 @@ from antlr4 import TerminalNode -from src.expression.tuple_value_expression import TupleValueExpression +from eva.expression.tuple_value_expression import TupleValueExpression -from src.parser.insert_statement import InsertTableStatement -from src.parser.table_ref import TableRef +from eva.parser.insert_statement import InsertTableStatement +from eva.parser.table_ref import TableRef -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.evaql.evaql_parser import evaql_parser +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser ################################################################## diff --git a/src/parser/parser_visitor/_load_statement.py b/eva/parser/parser_visitor/_load_statement.py similarity index 80% rename from src/parser/parser_visitor/_load_statement.py rename to eva/parser/parser_visitor/_load_statement.py index 516814fc9..41927b5d4 100644 --- a/src/parser/parser_visitor/_load_statement.py +++ b/eva/parser/parser_visitor/_load_statement.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.load_statement import LoadDataStatement -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.evaql.evaql_parser import evaql_parser +from eva.parser.load_statement import LoadDataStatement +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser -from src.parser.table_ref import TableRef +from eva.parser.table_ref import TableRef class Load(evaql_parserVisitor): diff --git a/src/parser/parser_visitor/_select_statement.py b/eva/parser/parser_visitor/_select_statement.py similarity index 87% rename from src/parser/parser_visitor/_select_statement.py rename to eva/parser/parser_visitor/_select_statement.py index 1ee18917c..4022695f1 100644 --- a/src/parser/parser_visitor/_select_statement.py +++ b/eva/parser/parser_visitor/_select_statement.py @@ -13,10 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.evaql.evaql_parser import evaql_parser -from src.parser.types import ParserOrderBySortType -from src.expression.constant_value_expression import ConstantValueExpression +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser +from eva.parser.types import ParserOrderBySortType +from eva.expression.constant_value_expression import ConstantValueExpression ################################################################## diff --git a/src/parser/parser_visitor/_table_sources.py b/eva/parser/parser_visitor/_table_sources.py similarity index 94% rename from src/parser/parser_visitor/_table_sources.py rename to eva/parser/parser_visitor/_table_sources.py index 279bd0645..3e1dabab5 100644 --- a/src/parser/parser_visitor/_table_sources.py +++ b/eva/parser/parser_visitor/_table_sources.py @@ -13,12 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.select_statement import SelectStatement -from src.parser.table_ref import TableRef +from eva.parser.select_statement import SelectStatement +from eva.parser.table_ref import TableRef -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.evaql.evaql_parser import evaql_parser -from src.utils.logging_manager import LoggingLevel, LoggingManager +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser +from eva.utils.logging_manager import LoggingLevel, LoggingManager ################################################################## # TABLE SOURCES diff --git a/src/parser/parser_visitor/_upload_statement.py b/eva/parser/parser_visitor/_upload_statement.py similarity index 83% rename from src/parser/parser_visitor/_upload_statement.py rename to eva/parser/parser_visitor/_upload_statement.py index 48a1055d2..c238f8925 100644 --- a/src/parser/parser_visitor/_upload_statement.py +++ b/eva/parser/parser_visitor/_upload_statement.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.upload_statement import UploadStatement -from src.parser.evaql.evaql_parserVisitor import evaql_parserVisitor -from src.parser.evaql.evaql_parser import evaql_parser +from eva.parser.upload_statement import UploadStatement +from eva.parser.evaql.evaql_parserVisitor import evaql_parserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser class Upload(evaql_parserVisitor): diff --git a/src/parser/select_statement.py b/eva/parser/select_statement.py similarity index 94% rename from src/parser/select_statement.py rename to eva/parser/select_statement.py index 5ded15721..f1b912ef6 100644 --- a/src/parser/select_statement.py +++ b/eva/parser/select_statement.py @@ -17,12 +17,12 @@ from typing import Union, List import typing if typing.TYPE_CHECKING: - from src.parser.table_ref import TableRef -from src.parser.statement import AbstractStatement + from eva.parser.table_ref import TableRef +from eva.parser.statement import AbstractStatement -from src.parser.types import StatementType -from src.expression.abstract_expression import AbstractExpression -from src.expression.constant_value_expression import ConstantValueExpression +from eva.parser.types import StatementType +from eva.expression.abstract_expression import AbstractExpression +from eva.expression.constant_value_expression import ConstantValueExpression class SelectStatement(AbstractStatement): diff --git a/src/parser/statement.py b/eva/parser/statement.py similarity index 95% rename from src/parser/statement.py rename to eva/parser/statement.py index 746d0b475..cf5af1735 100644 --- a/src/parser/statement.py +++ b/eva/parser/statement.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.types import StatementType +from eva.parser.types import StatementType class AbstractStatement: diff --git a/src/parser/table_ref.py b/eva/parser/table_ref.py similarity index 98% rename from src/parser/table_ref.py rename to eva/parser/table_ref.py index 3aab7fb03..9177a3e69 100644 --- a/src/parser/table_ref.py +++ b/eva/parser/table_ref.py @@ -17,7 +17,7 @@ from typing import Union -from src.parser.select_statement import SelectStatement +from eva.parser.select_statement import SelectStatement class TableInfo: diff --git a/src/parser/types.py b/eva/parser/types.py similarity index 100% rename from src/parser/types.py rename to eva/parser/types.py diff --git a/src/parser/upload_statement.py b/eva/parser/upload_statement.py similarity index 94% rename from src/parser/upload_statement.py rename to eva/parser/upload_statement.py index 9e80ad006..3fbc57957 100644 --- a/src/parser/upload_statement.py +++ b/eva/parser/upload_statement.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.parser.statement import AbstractStatement +from eva.parser.statement import AbstractStatement -from src.parser.types import StatementType +from eva.parser.types import StatementType from pathlib import Path diff --git a/src/planner/__init__.py b/eva/planner/__init__.py similarity index 100% rename from src/planner/__init__.py rename to eva/planner/__init__.py diff --git a/src/planner/abstract_plan.py b/eva/planner/abstract_plan.py similarity index 98% rename from src/planner/abstract_plan.py rename to eva/planner/abstract_plan.py index df4a1dd45..1e9d20f18 100644 --- a/src/planner/abstract_plan.py +++ b/eva/planner/abstract_plan.py @@ -15,7 +15,7 @@ from abc import ABC -from src.planner.types import PlanOprType +from eva.planner.types import PlanOprType from typing import List diff --git a/src/planner/abstract_scan_plan.py b/eva/planner/abstract_scan_plan.py similarity index 88% rename from src/planner/abstract_scan_plan.py rename to eva/planner/abstract_scan_plan.py index 375c4a725..9291a2063 100644 --- a/src/planner/abstract_scan_plan.py +++ b/eva/planner/abstract_scan_plan.py @@ -18,10 +18,10 @@ https://www.postgresql.org/docs/9.1/using-explain.html https://www.postgresql.org/docs/9.5/runtime-config-query.html """ -from src.expression.abstract_expression import AbstractExpression -from src.planner.abstract_plan import AbstractPlan +from eva.expression.abstract_expression import AbstractExpression +from eva.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.planner.types import PlanOprType class AbstractScan(AbstractPlan): diff --git a/src/planner/create_plan.py b/eva/planner/create_plan.py similarity index 88% rename from src/planner/create_plan.py rename to eva/planner/create_plan.py index 843c0cbf7..c4a8ead75 100644 --- a/src/planner/create_plan.py +++ b/eva/planner/create_plan.py @@ -13,11 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType from typing import List -from src.parser.table_ref import TableRef -from src.catalog.models.df_column import DataFrameColumn +from eva.parser.table_ref import TableRef +from eva.catalog.models.df_column import DataFrameColumn class CreatePlan(AbstractPlan): diff --git a/src/planner/create_udf_plan.py b/eva/planner/create_udf_plan.py similarity index 94% rename from src/planner/create_udf_plan.py rename to eva/planner/create_udf_plan.py index 123768ed7..2f370902f 100644 --- a/src/planner/create_udf_plan.py +++ b/eva/planner/create_udf_plan.py @@ -13,10 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType from typing import List -from src.catalog.models.udf_io import UdfIO +from eva.catalog.models.udf_io import UdfIO from pathlib import Path diff --git a/src/planner/insert_plan.py b/eva/planner/insert_plan.py similarity index 90% rename from src/planner/insert_plan.py rename to eva/planner/insert_plan.py index e02bb0189..66248d9bf 100644 --- a/src/planner/insert_plan.py +++ b/eva/planner/insert_plan.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. from typing import List -from src.planner.abstract_plan import AbstractPlan -from src.expression.abstract_expression import AbstractExpression -from src.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan +from eva.expression.abstract_expression import AbstractExpression +from eva.planner.types import PlanOprType class InsertPlan(AbstractPlan): diff --git a/src/planner/limit_plan.py b/eva/planner/limit_plan.py similarity index 88% rename from src/planner/limit_plan.py rename to eva/planner/limit_plan.py index 8da211de1..7fddd5d23 100644 --- a/src/planner/limit_plan.py +++ b/eva/planner/limit_plan.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType -from src.expression.constant_value_expression import ConstantValueExpression +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType +from eva.expression.constant_value_expression import ConstantValueExpression class LimitPlan(AbstractPlan): diff --git a/src/planner/load_data_plan.py b/eva/planner/load_data_plan.py similarity index 92% rename from src/planner/load_data_plan.py rename to eva/planner/load_data_plan.py index 334e32fb0..18932b66e 100644 --- a/src/planner/load_data_plan.py +++ b/eva/planner/load_data_plan.py @@ -12,10 +12,10 @@ # 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 src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType from pathlib import Path -from src.catalog.models.df_metadata import DataFrameMetadata +from eva.catalog.models.df_metadata import DataFrameMetadata class LoadDataPlan(AbstractPlan): diff --git a/src/planner/orderby_plan.py b/eva/planner/orderby_plan.py similarity index 93% rename from src/planner/orderby_plan.py rename to eva/planner/orderby_plan.py index e5174d57d..4453ae264 100644 --- a/src/planner/orderby_plan.py +++ b/eva/planner/orderby_plan.py @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType class OrderByPlan(AbstractPlan): diff --git a/src/planner/pp_plan.py b/eva/planner/pp_plan.py similarity index 85% rename from src/planner/pp_plan.py rename to eva/planner/pp_plan.py index d03d0245c..ffbcc1a5d 100644 --- a/src/planner/pp_plan.py +++ b/eva/planner/pp_plan.py @@ -12,9 +12,9 @@ # 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 src.expression.abstract_expression import AbstractExpression -from src.planner.abstract_scan_plan import AbstractScan -from src.planner.types import PlanOprType +from eva.expression.abstract_expression import AbstractExpression +from eva.planner.abstract_scan_plan import AbstractScan +from eva.planner.types import PlanOprType class PPScanPlan(AbstractScan): diff --git a/src/planner/sample_plan.py b/eva/planner/sample_plan.py similarity index 87% rename from src/planner/sample_plan.py rename to eva/planner/sample_plan.py index c9f87658b..5870e177d 100644 --- a/src/planner/sample_plan.py +++ b/eva/planner/sample_plan.py @@ -13,9 +13,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType -from src.expression.constant_value_expression import ConstantValueExpression +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType +from eva.expression.constant_value_expression import ConstantValueExpression class SamplePlan(AbstractPlan): diff --git a/src/planner/seq_scan_plan.py b/eva/planner/seq_scan_plan.py similarity index 88% rename from src/planner/seq_scan_plan.py rename to eva/planner/seq_scan_plan.py index 98d0891dc..82b3c0609 100644 --- a/src/planner/seq_scan_plan.py +++ b/eva/planner/seq_scan_plan.py @@ -14,9 +14,9 @@ # limitations under the License. from typing import List -from src.expression.abstract_expression import AbstractExpression -from src.planner.abstract_scan_plan import AbstractScan -from src.planner.types import PlanOprType +from eva.expression.abstract_expression import AbstractExpression +from eva.planner.abstract_scan_plan import AbstractScan +from eva.planner.types import PlanOprType class SeqScanPlan(AbstractScan): diff --git a/src/planner/storage_plan.py b/eva/planner/storage_plan.py similarity index 93% rename from src/planner/storage_plan.py rename to eva/planner/storage_plan.py index 4e42e4e34..0d2af26c5 100644 --- a/src/planner/storage_plan.py +++ b/eva/planner/storage_plan.py @@ -12,9 +12,9 @@ # 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 src.catalog.models.df_metadata import DataFrameMetadata -from src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType class StoragePlan(AbstractPlan): diff --git a/src/planner/types.py b/eva/planner/types.py similarity index 100% rename from src/planner/types.py rename to eva/planner/types.py diff --git a/src/planner/union_plan.py b/eva/planner/union_plan.py similarity index 91% rename from src/planner/union_plan.py rename to eva/planner/union_plan.py index f374df6c8..749502a30 100644 --- a/src/planner/union_plan.py +++ b/eva/planner/union_plan.py @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -from src.planner.types import PlanOprType -from src.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan class UnionPlan(AbstractPlan): diff --git a/src/planner/upload_plan.py b/eva/planner/upload_plan.py similarity index 93% rename from src/planner/upload_plan.py rename to eva/planner/upload_plan.py index a39c2274d..792d26fcc 100644 --- a/src/planner/upload_plan.py +++ b/eva/planner/upload_plan.py @@ -12,8 +12,8 @@ # 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 src.planner.abstract_plan import AbstractPlan -from src.planner.types import PlanOprType +from eva.planner.abstract_plan import AbstractPlan +from eva.planner.types import PlanOprType from pathlib import Path diff --git a/src/readers/__init__.py b/eva/readers/__init__.py similarity index 100% rename from src/readers/__init__.py rename to eva/readers/__init__.py diff --git a/src/readers/abstract_reader.py b/eva/readers/abstract_reader.py similarity index 98% rename from src/readers/abstract_reader.py rename to eva/readers/abstract_reader.py index 246578f09..cd8613656 100644 --- a/src/readers/abstract_reader.py +++ b/eva/readers/abstract_reader.py @@ -17,7 +17,7 @@ from typing import Iterator, Dict import pandas as pd -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class AbstractReader(metaclass=ABCMeta): diff --git a/src/readers/opencv_reader.py b/eva/readers/opencv_reader.py similarity index 92% rename from src/readers/opencv_reader.py rename to eva/readers/opencv_reader.py index 0b933384b..12f4237e5 100644 --- a/src/readers/opencv_reader.py +++ b/eva/readers/opencv_reader.py @@ -16,9 +16,9 @@ import cv2 from typing import Iterator, Dict -from src.readers.abstract_reader import AbstractReader -from src.utils.logging_manager import LoggingLevel -from src.utils.logging_manager import LoggingManager +from eva.readers.abstract_reader import AbstractReader +from eva.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager class OpenCVReader(AbstractReader): diff --git a/src/readers/petastorm_reader.py b/eva/readers/petastorm_reader.py similarity index 96% rename from src/readers/petastorm_reader.py rename to eva/readers/petastorm_reader.py index 1d5aa1f65..97b0f3f82 100644 --- a/src/readers/petastorm_reader.py +++ b/eva/readers/petastorm_reader.py @@ -15,8 +15,8 @@ from petastorm import make_reader from typing import Iterator, Dict -from src.readers.abstract_reader import AbstractReader -from src.configuration.configuration_manager import ConfigurationManager +from eva.readers.abstract_reader import AbstractReader +from eva.configuration.configuration_manager import ConfigurationManager class PetastormReader(AbstractReader): diff --git a/src/server/__init__.py b/eva/server/__init__.py similarity index 100% rename from src/server/__init__.py rename to eva/server/__init__.py diff --git a/src/server/async_protocol.py b/eva/server/async_protocol.py similarity index 97% rename from src/server/async_protocol.py rename to eva/server/async_protocol.py index 2f27e910b..0145d04b4 100644 --- a/src/server/async_protocol.py +++ b/eva/server/async_protocol.py @@ -14,8 +14,8 @@ # limitations under the License. import asyncio -from src.server.networking_utils import set_socket_io_timeouts -from src.utils.logging_manager import LoggingManager +from eva.server.networking_utils import set_socket_io_timeouts +from eva.utils.logging_manager import LoggingManager class EvaProtocolBuffer: diff --git a/src/server/command_handler.py b/eva/server/command_handler.py similarity index 86% rename from src/server/command_handler.py rename to eva/server/command_handler.py index 8483a4a7c..46d9022e3 100644 --- a/src/server/command_handler.py +++ b/eva/server/command_handler.py @@ -17,14 +17,14 @@ from typing import Iterator, Optional -from src.parser.parser import Parser -from src.optimizer.statement_to_opr_convertor import StatementToPlanConvertor -from src.optimizer.plan_generator import PlanGenerator -from src.executor.plan_executor import PlanExecutor -from src.models.server.response import ResponseStatus, Response -from src.models.storage.batch import Batch +from eva.parser.parser import Parser +from eva.optimizer.statement_to_opr_convertor import StatementToPlanConvertor +from eva.optimizer.plan_generator import PlanGenerator +from eva.executor.plan_executor import PlanExecutor +from eva.models.server.response import ResponseStatus, Response +from eva.models.storage.batch import Batch -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.utils.logging_manager import LoggingManager, LoggingLevel def execute_query(query) -> Iterator[Batch]: diff --git a/src/server/db_api.py b/eva/server/db_api.py similarity index 97% rename from src/server/db_api.py rename to eva/server/db_api.py index aa649090f..8ddf9644f 100644 --- a/src/server/db_api.py +++ b/eva/server/db_api.py @@ -2,8 +2,8 @@ import random import base64 -from src.server.async_protocol import EvaClient -from src.models.server.response import Response +from eva.server.async_protocol import EvaClient +from eva.models.server.response import Response class EVAConnection: diff --git a/src/server/interpreter.py b/eva/server/interpreter.py similarity index 98% rename from src/server/interpreter.py rename to eva/server/interpreter.py index e415f1422..398e77a7a 100644 --- a/src/server/interpreter.py +++ b/eva/server/interpreter.py @@ -15,7 +15,7 @@ from cmd import Cmd from contextlib import ExitStack -from src.server.db_api import connect +from eva.server.db_api import connect class EvaCommandInterpreter(Cmd): diff --git a/src/server/networking_utils.py b/eva/server/networking_utils.py similarity index 95% rename from src/server/networking_utils.py rename to eva/server/networking_utils.py index 3fd912db9..7edac9077 100644 --- a/src/server/networking_utils.py +++ b/eva/server/networking_utils.py @@ -16,8 +16,8 @@ import socket import asyncio -from src.utils.logging_manager import LoggingManager -from src.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager +from eva.utils.logging_manager import LoggingLevel async def realtime_server_status(protocol, server_closed): diff --git a/src/server/server.py b/eva/server/server.py similarity index 95% rename from src/server/server.py rename to eva/server/server.py index a61680ba2..4cffac7de 100644 --- a/src/server/server.py +++ b/eva/server/server.py @@ -20,14 +20,14 @@ from signal import signal from signal import SIGINT, SIGTERM, SIGHUP, SIGUSR1 -from src.server.networking_utils import realtime_server_status,\ +from eva.server.networking_utils import realtime_server_status,\ set_socket_io_timeouts -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.utils.logging_manager import LoggingManager, LoggingLevel -from src.server.command_handler import handle_request +from eva.server.command_handler import handle_request -from src.server.async_protocol import EvaProtocolBuffer +from eva.server.async_protocol import EvaProtocolBuffer class EvaServer(asyncio.Protocol): diff --git a/src/spark/__init__.py b/eva/spark/__init__.py similarity index 100% rename from src/spark/__init__.py rename to eva/spark/__init__.py diff --git a/src/spark/session.py b/eva/spark/session.py similarity index 95% rename from src/spark/session.py rename to eva/spark/session.py index 9cb9257a4..6c804be2a 100644 --- a/src/spark/session.py +++ b/eva/spark/session.py @@ -17,8 +17,8 @@ from pyspark.sql import SparkSession from pyspark.conf import SparkConf -from src.configuration.configuration_manager import ConfigurationManager -from src.utils.logging_manager import LoggingManager +from eva.configuration.configuration_manager import ConfigurationManager +from eva.utils.logging_manager import LoggingManager class Session(object): diff --git a/src/storage/__init__.py b/eva/storage/__init__.py similarity index 100% rename from src/storage/__init__.py rename to eva/storage/__init__.py diff --git a/src/storage/abstract_storage_engine.py b/eva/storage/abstract_storage_engine.py similarity index 98% rename from src/storage/abstract_storage_engine.py rename to eva/storage/abstract_storage_engine.py index 39309bb10..b39c7c678 100644 --- a/src/storage/abstract_storage_engine.py +++ b/eva/storage/abstract_storage_engine.py @@ -16,7 +16,7 @@ from typing import Iterator from abc import ABCMeta, abstractmethod -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class AbstractStorageEngine(metaclass=ABCMeta): diff --git a/src/storage/petastorm_storage_engine.py b/eva/storage/petastorm_storage_engine.py similarity index 93% rename from src/storage/petastorm_storage_engine.py rename to eva/storage/petastorm_storage_engine.py index f098b5696..2901a7221 100644 --- a/src/storage/petastorm_storage_engine.py +++ b/eva/storage/petastorm_storage_engine.py @@ -15,13 +15,13 @@ from typing import Iterator, List from pathlib import Path -from src.spark.session import Session -from src.catalog.models.df_metadata import DataFrameMetadata +from eva.spark.session import Session +from eva.catalog.models.df_metadata import DataFrameMetadata from petastorm.etl.dataset_metadata import materialize_dataset -from src.storage.abstract_storage_engine import AbstractStorageEngine -from src.readers.petastorm_reader import PetastormReader -from src.models.storage.batch import Batch -from src.configuration.configuration_manager import ConfigurationManager +from eva.storage.abstract_storage_engine import AbstractStorageEngine +from eva.readers.petastorm_reader import PetastormReader +from eva.models.storage.batch import Batch +from eva.configuration.configuration_manager import ConfigurationManager from petastorm.unischema import dict_to_spark_row from petastorm.predicates import in_lambda diff --git a/eva/storage/storage_engine.py b/eva/storage/storage_engine.py new file mode 100644 index 000000000..590167e5f --- /dev/null +++ b/eva/storage/storage_engine.py @@ -0,0 +1,6 @@ +from eva.configuration.configuration_manager import ConfigurationManager +from eva.utils.generic_utils import str_to_class + +StorageEngine = str_to_class( + ConfigurationManager().get_value( + "storage", "engine"))() diff --git a/src/udfs/README.md b/eva/udfs/README.md similarity index 100% rename from src/udfs/README.md rename to eva/udfs/README.md diff --git a/src/udfs/__init__.py b/eva/udfs/__init__.py similarity index 100% rename from src/udfs/__init__.py rename to eva/udfs/__init__.py diff --git a/src/udfs/abstract_udfs.py b/eva/udfs/abstract_udfs.py similarity index 97% rename from src/udfs/abstract_udfs.py rename to eva/udfs/abstract_udfs.py index a275f3137..ae4cf5348 100644 --- a/src/udfs/abstract_udfs.py +++ b/eva/udfs/abstract_udfs.py @@ -18,7 +18,7 @@ import numpy as np import pandas as pd -from src.models.catalog.frame_info import FrameInfo +from eva.models.catalog.frame_info import FrameInfo class AbstractClassifierUDF(metaclass=ABCMeta): diff --git a/src/udfs/fastrcnn_object_detector.py b/eva/udfs/fastrcnn_object_detector.py similarity index 96% rename from src/udfs/fastrcnn_object_detector.py rename to eva/udfs/fastrcnn_object_detector.py index 7b00ed32a..011547e75 100644 --- a/src/udfs/fastrcnn_object_detector.py +++ b/eva/udfs/fastrcnn_object_detector.py @@ -19,9 +19,9 @@ import numpy as np from torch import Tensor -from src.models.catalog.frame_info import FrameInfo -from src.models.catalog.properties import ColorSpace -from src.udfs.pytorch_abstract_udf import PytorchAbstractUDF +from eva.models.catalog.frame_info import FrameInfo +from eva.models.catalog.properties import ColorSpace +from eva.udfs.pytorch_abstract_udf import PytorchAbstractUDF class FastRCNNObjectDetector(PytorchAbstractUDF): diff --git a/src/udfs/gpu_compatible.py b/eva/udfs/gpu_compatible.py similarity index 100% rename from src/udfs/gpu_compatible.py rename to eva/udfs/gpu_compatible.py diff --git a/src/udfs/ndarray_udfs/__init__.py b/eva/udfs/ndarray_udfs/__init__.py similarity index 100% rename from src/udfs/ndarray_udfs/__init__.py rename to eva/udfs/ndarray_udfs/__init__.py diff --git a/src/udfs/ndarray_udfs/abstract_ndarray_udfs.py b/eva/udfs/ndarray_udfs/abstract_ndarray_udfs.py similarity index 100% rename from src/udfs/ndarray_udfs/abstract_ndarray_udfs.py rename to eva/udfs/ndarray_udfs/abstract_ndarray_udfs.py diff --git a/src/udfs/ndarray_udfs/array_count.py b/eva/udfs/ndarray_udfs/array_count.py similarity index 97% rename from src/udfs/ndarray_udfs/array_count.py rename to eva/udfs/ndarray_udfs/array_count.py index a40abbb6f..1f3df8324 100644 --- a/src/udfs/ndarray_udfs/array_count.py +++ b/eva/udfs/ndarray_udfs/array_count.py @@ -14,7 +14,7 @@ # limitations under the License. import pandas as pd import numpy as np -from src.udfs.ndarray_udfs.abstract_ndarray_udfs import AbstractNdarrayUDF +from eva.udfs.ndarray_udfs.abstract_ndarray_udfs import AbstractNdarrayUDF class Array_Count(AbstractNdarrayUDF): diff --git a/src/udfs/ndarray_udfs/unnest.py b/eva/udfs/ndarray_udfs/unnest.py similarity index 96% rename from src/udfs/ndarray_udfs/unnest.py rename to eva/udfs/ndarray_udfs/unnest.py index 3240de92c..39bead720 100644 --- a/src/udfs/ndarray_udfs/unnest.py +++ b/eva/udfs/ndarray_udfs/unnest.py @@ -16,7 +16,7 @@ import numpy as np from itertools import zip_longest -from src.udfs.ndarray_udfs.abstract_ndarray_udfs import AbstractNdarrayUDF +from eva.udfs.ndarray_udfs.abstract_ndarray_udfs import AbstractNdarrayUDF class Unnest(AbstractNdarrayUDF): diff --git a/src/udfs/pytorch_abstract_udf.py b/eva/udfs/pytorch_abstract_udf.py similarity index 95% rename from src/udfs/pytorch_abstract_udf.py rename to eva/udfs/pytorch_abstract_udf.py index 10ca8a5d0..8bfc396d2 100644 --- a/src/udfs/pytorch_abstract_udf.py +++ b/eva/udfs/pytorch_abstract_udf.py @@ -23,9 +23,9 @@ from torch import nn, Tensor from torchvision.transforms import Compose, transforms -from src.udfs.abstract_udfs import AbstractClassifierUDF -from src.udfs.gpu_compatible import GPUCompatible -from src.configuration.configuration_manager import ConfigurationManager +from eva.udfs.abstract_udfs import AbstractClassifierUDF +from eva.udfs.gpu_compatible import GPUCompatible +from eva.configuration.configuration_manager import ConfigurationManager class PytorchAbstractUDF(AbstractClassifierUDF, nn.Module, GPUCompatible, ABC): diff --git a/src/udfs/ssd_object_detector.py b/eva/udfs/ssd_object_detector.py similarity index 98% rename from src/udfs/ssd_object_detector.py rename to eva/udfs/ssd_object_detector.py index 326d3de9a..459d32119 100644 --- a/src/udfs/ssd_object_detector.py +++ b/eva/udfs/ssd_object_detector.py @@ -10,9 +10,9 @@ from torch import Tensor from torchvision.transforms import Compose, transforms -from src.models.catalog.frame_info import FrameInfo -from src.models.catalog.properties import ColorSpace -from src.udfs.pytorch_abstract_udf import PytorchAbstractUDF +from eva.models.catalog.frame_info import FrameInfo +from eva.models.catalog.properties import ColorSpace +from eva.udfs.pytorch_abstract_udf import PytorchAbstractUDF class SSDObjectDetector(PytorchAbstractUDF): diff --git a/src/udfs/udf_bootstrap_queries.py b/eva/udfs/udf_bootstrap_queries.py similarity index 85% rename from src/udfs/udf_bootstrap_queries.py rename to eva/udfs/udf_bootstrap_queries.py index 6f5bc99f5..4d3a66318 100644 --- a/src/udfs/udf_bootstrap_queries.py +++ b/eva/udfs/udf_bootstrap_queries.py @@ -16,7 +16,8 @@ # this file is to list out all the ndarray udf create queries in one place # as constants -from src.server.command_handler import execute_query_fetch_all +from eva.server.command_handler import execute_query_fetch_all +from eva.configuration.dictionary import EVA_INSTALLATION_DIR DummyObjectDetector_udf_query = """CREATE UDF IF NOT EXISTS DummyObjectDetector @@ -37,22 +38,23 @@ INPUT(Input NDARRAY ANYTYPE, Key ANYTYPE) OUTPUT(count INTEGER) TYPE Ndarray - IMPL "src/udfs/ndarray_udfs/array_count.py"; - """ + IMPL "{}/udfs/ndarray_udfs/array_count.py"; + """.format(EVA_INSTALLATION_DIR) + Unnest_udf_query = """CREATE UDF IF NOT EXISTS Unnest INPUT (inp NDARRAY ANYTYPE) OUTPUT (out ANYTYPE) TYPE Ndarray - IMPL "src/udfs/ndarray_udfs/unnest.py"; - """ + IMPL "{}/udfs/ndarray_udfs/unnest.py"; + """.format(EVA_INSTALLATION_DIR) Fastrcnn_udf_query = """CREATE UDF IF NOT EXISTS FastRCNNObjectDetector INPUT (Frame_Array NDARRAY UINT8(3, ANYDIM, ANYDIM)) OUTPUT (labels NDARRAY STR(ANYDIM), bboxes NDARRAY FLOAT32(ANYDIM, 4), scores NDARRAY FLOAT32(ANYDIM)) TYPE Classification - IMPL 'src/udfs/fastrcnn_object_detector.py'; - """ + IMPL '{}/udfs/fastrcnn_object_detector.py'; + """.format(EVA_INSTALLATION_DIR) def init_builtin_udfs(mode='debug'): diff --git a/src/utils/__init__.py b/eva/utils/__init__.py similarity index 100% rename from src/utils/__init__.py rename to eva/utils/__init__.py diff --git a/src/utils/generic_utils.py b/eva/utils/generic_utils.py similarity index 91% rename from src/utils/generic_utils.py rename to eva/utils/generic_utils.py index ec208c9b6..30b39b456 100644 --- a/src/utils/generic_utils.py +++ b/eva/utils/generic_utils.py @@ -18,8 +18,8 @@ import hashlib from pathlib import Path -from src.configuration.configuration_manager import ConfigurationManager -from src.utils.logging_manager import LoggingManager, LoggingLevel +from eva.configuration.configuration_manager import ConfigurationManager +from eva.utils.logging_manager import LoggingManager, LoggingLevel def validate_kwargs(kwargs, allowed_kwargs, @@ -90,13 +90,14 @@ def generate_file_path(name: str = '') -> Path: Path: pathlib.Path object """ - dataset_location = ConfigurationManager().get_value("core", "location") + dataset_location = ConfigurationManager().get_value("core", "datasets_dir") if dataset_location is None: LoggingManager().log( 'Missing location key in eva.yml', LoggingLevel.ERROR) - raise KeyError('Missing location key in eva.yml') + raise KeyError('Missing datasets_dir key in eva.yml') dataset_location = Path(dataset_location) + dataset_location.mkdir(parents=True, exist_ok=True) salt = uuid.uuid4().hex file_name = hashlib.md5(salt.encode() + name.encode()).hexdigest() path = dataset_location / file_name diff --git a/src/utils/logging_manager.py b/eva/utils/logging_manager.py similarity index 100% rename from src/utils/logging_manager.py rename to eva/utils/logging_manager.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..9787c3bdf --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/script/antlr4/generate_parser.sh b/script/antlr4/generate_parser.sh index e0e397a1f..50f5b1540 100755 --- a/script/antlr4/generate_parser.sh +++ b/script/antlr4/generate_parser.sh @@ -10,8 +10,8 @@ wget --no-check-certificate https://www.antlr.org/download/antlr-4.8-complete.ja #alias antlr4='java -jar ./antlr-4.8-complete.jar' # Generate grammar files -java -jar ./antlr-4.8-complete.jar -Dlanguage=Python3 src/parser/evaql/evaql_lexer.g4 -java -jar ./antlr-4.8-complete.jar -Dlanguage=Python3 -visitor src/parser/evaql/evaql_parser.g4 +java -jar ./antlr-4.8-complete.jar -Dlanguage=Python3 eva/parser/evaql/evaql_lexer.g4 +java -jar ./antlr-4.8-complete.jar -Dlanguage=Python3 -visitor eva/parser/evaql/evaql_parser.g4 # Cleanup Antlr4 JAR rm ./antlr-4.8-complete.jar diff --git a/script/install/before_install.sh b/script/install/before_install.sh index 855bb55a6..7200cce84 100644 --- a/script/install/before_install.sh +++ b/script/install/before_install.sh @@ -1,10 +1,5 @@ #!/bin/sh -# Install mysql and start server -sudo -E apt-get update -sudo -E apt-get -q -y install mysql-server -sudo systemctl start mysql - # Install java8 (for running antlr4) sudo -E apt install -y openjdk-8-jdk openjdk-8-jre diff --git a/script/install/install.sh b/script/install/install.sh index 04e2cdac6..f47f7ba18 100644 --- a/script/install/install.sh +++ b/script/install/install.sh @@ -5,9 +5,6 @@ conda env create -f script/install/conda_eva_environment.yml . activate eva conda list -# Create eva-catalog database -mysql -e 'CREATE DATABASE IF NOT EXISTS eva_catalog;' - # Generate eva-ql parser using antlr4 sh script/antlr4/generate_parser.sh diff --git a/script/test/test.sh b/script/test/test.sh index a3e757bf6..70548e16a 100644 --- a/script/test/test.sh +++ b/script/test/test.sh @@ -4,10 +4,10 @@ # linter fails or the pytest fails. This is important for the Travis. # Run linter (checks code style) -flake8 --select E,F src/ test/ --exclude src/filters,src/parser/evaql +flake8 --select E,F eva/ test/ --exclude eva/filters,eva/parser/evaql linter_code=$? # Run unit tests -PYTHONPATH=./ pytest test/ --cov-report= --cov-config=.coveragerc --cov=src/ -s -v --log-level=WARNING +PYTHONPATH=./ pytest test/ --cov-report= --cov-config=.coveragerc --cov=eva/ -s -v --log-level=WARNING test_code=$? if [ $linter_code -ne 0 ]; then diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000..4f80a294d --- /dev/null +++ b/setup.cfg @@ -0,0 +1,46 @@ +[metadata] +name = evatestdb +version = 0.0.55 +author = Georgia Tech Database Group +author_email = arulraj@gatech.edu +description = EVA is a visual data management system (think MySQL for videos). +long_description = file: README.md +long_description_content_type = text/markdown +url = https://github.com/georgia-tech-db/eva +project_urls = + Bug Tracker = https://github.com/georgia-tech-db/eva/issues +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: Apache Software License + Operating System :: OS Independent + +[options] +include_package_data = True +packages = find: +install_requires = + numpy==1.20.1 + opencv-python==4.5.1.48 + pandas==1.2.3 + torch==1.7.1 + torchvision==0.8.2 + Pillow==8.1.2 + sqlalchemy==1.3.20 + pymysql==0.10.1 + sqlalchemy-utils==0.36.6 + pyspark==3.0.2 + petastorm==0.9.8 + antlr4-python3-runtime==4.8 + pyyaml==5.1 + + +[options.package_data] +eva = eva.yml + +[options.entry_points] +console_scripts = + eva_server = eva.eva_server:main + eva_client=eva.eva_cmd_client:main + +[options.packages.find] +exclude = + test* diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..606849326 --- /dev/null +++ b/setup.py @@ -0,0 +1,3 @@ +from setuptools import setup + +setup() diff --git a/src/storage/storage_engine.py b/src/storage/storage_engine.py deleted file mode 100644 index 2347b2a2a..000000000 --- a/src/storage/storage_engine.py +++ /dev/null @@ -1,6 +0,0 @@ -from src.configuration.configuration_manager import ConfigurationManager -from src.utils.generic_utils import str_to_class - -StorageEngine = str_to_class( - ConfigurationManager().get_value( - "storage", "engine"))() diff --git a/test/catalog/models/test_models.py b/test/catalog/models/test_models.py index 55bc44d4c..af883320b 100644 --- a/test/catalog/models/test_models.py +++ b/test/catalog/models/test_models.py @@ -15,12 +15,12 @@ import unittest -from src.catalog.column_type import ColumnType, NdArrayType -from src.catalog.df_schema import DataFrameSchema -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.models.df_metadata import DataFrameMetadata -from src.catalog.models.udf import UdfMetadata -from src.catalog.models.udf_io import UdfIO +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.df_schema import DataFrameSchema +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.catalog.models.udf import UdfMetadata +from eva.catalog.models.udf_io import UdfIO class CatalogModelsTest(unittest.TestCase): diff --git a/test/catalog/services/test_dataset_column_service.py b/test/catalog/services/test_dataset_column_service.py index cc88bd760..10d90b8cb 100644 --- a/test/catalog/services/test_dataset_column_service.py +++ b/test/catalog/services/test_dataset_column_service.py @@ -16,7 +16,7 @@ from mock import patch, MagicMock -from src.catalog.services.df_column_service import DatasetColumnService +from eva.catalog.services.df_column_service import DatasetColumnService class DatasetColumnServiceTest(unittest.TestCase): @@ -28,7 +28,7 @@ def test_create_should_create_all_columns(self): for mock in mocks: mock.save.assert_called_once() - @patch('src.catalog.services.df_column_service.DataFrameColumn') + @patch('eva.catalog.services.df_column_service.DataFrameColumn') def test_column_by_metadata_id_and_names_should_query_correctly(self, mocked): mocked.query.with_entities.return_value.filter \ @@ -47,7 +47,7 @@ def test_column_by_metadata_id_and_names_should_query_correctly(self, self.assertEqual(actual, expected) - @patch('src.catalog.services.df_column_service.DataFrameColumn') + @patch('eva.catalog.services.df_column_service.DataFrameColumn') def test_column_by_metadata_id_and_col_ids_should_query_correctly(self, mocked): return_val = [[1], [2], [3]] @@ -64,7 +64,7 @@ def test_column_by_metadata_id_and_col_ids_should_query_correctly(self, mocked._id.in_(column_ids)) self.assertEqual(actual, return_val) - @patch('src.catalog.services.df_column_service.DataFrameColumn') + @patch('eva.catalog.services.df_column_service.DataFrameColumn') def test_by_dataset_id_and_empty_col_ids_should_query_correctly(self, mocked): return_val = [[1], [2], [3]] diff --git a/test/catalog/services/test_dataset_service.py b/test/catalog/services/test_dataset_service.py index a400082c1..eb120bff3 100644 --- a/test/catalog/services/test_dataset_service.py +++ b/test/catalog/services/test_dataset_service.py @@ -16,7 +16,7 @@ from mock import patch -from src.catalog.services.df_service import DatasetService +from eva.catalog.services.df_service import DatasetService DATASET_ID = 123 @@ -28,7 +28,7 @@ class DatasetServiceTest(unittest.TestCase): - @patch("src.catalog.services.df_service.DataFrameMetadata") + @patch("eva.catalog.services.df_service.DataFrameMetadata") def test_create_dataset_should_create_model(self, mocked): service = DatasetService() service.create_dataset( @@ -41,7 +41,7 @@ def test_create_dataset_should_create_model(self, mocked): identifier_id=IDENTIFIER) mocked.return_value.save.assert_called_once() - @patch("src.catalog.services.df_service.DataFrameMetadata") + @patch("eva.catalog.services.df_service.DataFrameMetadata") def test_dataset_by_id_should_query_model_with_id(self, mocked): service = DatasetService() service.dataset_by_id(DATASET_ID) @@ -49,7 +49,7 @@ def test_dataset_by_id_should_query_model_with_id(self, mocked): mocked._id == DATASET_ID) mocked.query.filter.return_value.one.assert_called_once() - @patch("src.catalog.services.df_service.DataFrameMetadata") + @patch("eva.catalog.services.df_service.DataFrameMetadata") def test_dataset_by_name_queries_model_with_name_and_return_id(self, mocked): service = DatasetService() @@ -65,7 +65,7 @@ def test_dataset_by_name_queries_model_with_name_and_return_id(self, self.assertEqual(result, expected_output) - @patch("src.catalog.services.df_service.DataFrameMetadata") + @patch("eva.catalog.services.df_service.DataFrameMetadata") def test_dataset_object_by_name_queries_with_name_returns_model_object( self, mocked): @@ -75,14 +75,14 @@ def test_dataset_object_by_name_queries_with_name_returns_model_object( self.assertEqual(actual, expected) - @patch('src.catalog.services.df_service.DatasetService.dataset_by_id') + @patch('eva.catalog.services.df_service.DatasetService.dataset_by_id') def test_delete_dataset_object_by_id(self, mock_id): service = DatasetService() self.assertTrue(service.delete_dataset_by_id(DATASET_ID)) mock_id.assert_called_once_with(DATASET_ID) mock_id.return_value.delete.assert_called_once() - @patch('src.catalog.services.df_service.DatasetService.dataset_by_id') + @patch('eva.catalog.services.df_service.DatasetService.dataset_by_id') def test_delete_dataset_object_by_id_should_raise_exception(self, mock_id): service = DatasetService() mock_id.return_value.delete.side_effect = Exception() diff --git a/test/catalog/services/test_udf_io_service.py b/test/catalog/services/test_udf_io_service.py index 7b4480572..b59a827f1 100644 --- a/test/catalog/services/test_udf_io_service.py +++ b/test/catalog/services/test_udf_io_service.py @@ -16,7 +16,7 @@ from mock import patch from mock import MagicMock -from src.catalog.services.udf_io_service import UdfIOService +from eva.catalog.services.udf_io_service import UdfIOService UDF_TYPE = 'classification' UDF_IMPL_PATH = 'file1' @@ -26,7 +26,7 @@ class UdfServiceTest(TestCase): - @patch("src.catalog.services.udf_io_service.UdfIO") + @patch("eva.catalog.services.udf_io_service.UdfIO") def test_get_inputs_by_udf_id_should_query_model_with_id(self, mocked): service = UdfIOService() @@ -40,7 +40,7 @@ def test_get_inputs_by_udf_id_should_query_model_with_id(self, mocked): return_value.all.return_value self.assertEqual(actual, expected) - @patch('src.catalog.services.udf_io_service.UdfIO') + @patch('eva.catalog.services.udf_io_service.UdfIO') def test_get_outputs_by_udf_id_should_query_model_with_id(self, mocked): service = UdfIOService() diff --git a/test/catalog/services/test_udf_service.py b/test/catalog/services/test_udf_service.py index f7e91f2e2..18bf588eb 100644 --- a/test/catalog/services/test_udf_service.py +++ b/test/catalog/services/test_udf_service.py @@ -16,7 +16,7 @@ from mock import patch, MagicMock -from src.catalog.services.udf_service import UdfService +from eva.catalog.services.udf_service import UdfService UDF_TYPE = 'classification' UDF_IMPL_PATH = 'file1' @@ -26,14 +26,14 @@ class UdfServiceTest(TestCase): - @patch("src.catalog.services.udf_service.UdfMetadata") + @patch("eva.catalog.services.udf_service.UdfMetadata") def test_create_udf_should_create_model(self, mocked): service = UdfService() service.create_udf(UDF_NAME, UDF_IMPL_PATH, UDF_TYPE) mocked.assert_called_with(UDF_NAME, UDF_IMPL_PATH, UDF_TYPE) mocked.return_value.save.assert_called_once() - @patch("src.catalog.services.udf_service.UdfMetadata") + @patch("eva.catalog.services.udf_service.UdfMetadata") def test_udf_by_name_should_query_model_with_name(self, mocked): service = UdfService() expected = mocked.query.filter.return_value.one \ @@ -45,7 +45,7 @@ def test_udf_by_name_should_query_model_with_name(self, mocked): mocked.query.filter.return_value.one.assert_called_once() self.assertEqual(actual, expected) - @patch("src.catalog.services.udf_service.UdfMetadata") + @patch("eva.catalog.services.udf_service.UdfMetadata") def test_udf_by_id_should_query_model_with_id(self, mocked): service = UdfService() expected = mocked.query.filter.return_value.one \ @@ -56,7 +56,7 @@ def test_udf_by_id_should_query_model_with_id(self, mocked): mocked.query.filter.return_value.one.assert_called_once() self.assertEqual(actual, expected) - @patch('src.catalog.services.udf_service.UdfService.udf_by_name') + @patch('eva.catalog.services.udf_service.UdfService.udf_by_name') def test_udf_delete_by_name(self, mock_udf_by_name): mock_udf_by_name.return_value = MagicMock() actual = UdfService().delete_udf_by_name(UDF_NAME) diff --git a/test/catalog/test_catalog_manager.py b/test/catalog/test_catalog_manager.py index f62a6f2a7..de1ab4be0 100644 --- a/test/catalog/test_catalog_manager.py +++ b/test/catalog/test_catalog_manager.py @@ -16,9 +16,9 @@ import mock from mock import MagicMock -from src.catalog.catalog_manager import CatalogManager -from src.catalog.column_type import ColumnType, NdArrayType -from src.catalog.models.df_column import DataFrameColumn +from eva.catalog.catalog_manager import CatalogManager +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.models.df_column import DataFrameColumn class CatalogManagerTests(unittest.TestCase): @@ -31,20 +31,20 @@ def test_catalog_manager_singleton_pattern(self): y = CatalogManager() self.assertEqual(x, y) - @mock.patch('src.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.init_db') def test_catalog_bootstrap(self, mocked_db): x = CatalogManager() x._bootstrap_catalog() mocked_db.assert_called() - @mock.patch('src.catalog.catalog_manager.drop_db') + @mock.patch('eva.catalog.catalog_manager.drop_db') def test_catalog_shutdown(self, mocked_db): x = CatalogManager() x._shutdown_catalog() mocked_db.assert_called_once() - @mock.patch('src.catalog.catalog_manager.CatalogManager._shutdown_catalog') - @mock.patch('src.catalog.catalog_manager.CatalogManager._bootstrap_catalog') # noqa + @mock.patch('eva.catalog.catalog_manager.CatalogManager._shutdown_catalog') + @mock.patch('eva.catalog.catalog_manager.CatalogManager._bootstrap_catalog') # noqa def test_catalog_manager_reset(self, mock_bootstrap, mock_shutdown): x = CatalogManager() mock_init = MagicMock() @@ -54,9 +54,9 @@ def test_catalog_manager_reset(self, mock_bootstrap, mock_shutdown): mock_bootstrap.assert_called_once_with() mock_shutdown.assert_called_once_with() - @mock.patch('src.catalog.catalog_manager.init_db') - @mock.patch('src.catalog.catalog_manager.DatasetService') - @mock.patch('src.catalog.catalog_manager.DatasetColumnService') + @mock.patch('eva.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.DatasetService') + @mock.patch('eva.catalog.catalog_manager.DatasetColumnService') def test_create_metadata_should_create_dataset_and_columns(self, dcs_mock, ds_mock, initdb_mock): @@ -80,9 +80,9 @@ def test_create_metadata_should_create_dataset_and_columns(self, dcs_mock, self.assertEqual(actual, expected) - @mock.patch('src.catalog.catalog_manager.init_db') - @mock.patch('src.catalog.catalog_manager.DatasetService') - @mock.patch('src.catalog.catalog_manager.DatasetColumnService') + @mock.patch('eva.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.DatasetService') + @mock.patch('eva.catalog.catalog_manager.DatasetColumnService') def test_table_binding_returns_metadata_and_column_ids(self, dcs_mock, ds_mock, @@ -107,9 +107,9 @@ def test_table_binding_returns_metadata_and_column_ids(self, self.assertEqual(actual, (ds_dataset_name_mock.return_value, column_values_mock.return_value)) - @mock.patch('src.catalog.catalog_manager.init_db') - @mock.patch('src.catalog.catalog_manager.DatasetService') - @mock.patch('src.catalog.catalog_manager.DatasetColumnService') + @mock.patch('eva.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.DatasetService') + @mock.patch('eva.catalog.catalog_manager.DatasetColumnService') def test_table_binding_without_columns_returns_no_column_ids(self, dcs_mock, ds_mock, @@ -128,9 +128,9 @@ def test_table_binding_without_columns_returns_no_column_ids(self, self.assertEqual(actual, (ds_dataset_name_mock.return_value, [])) - @mock.patch('src.catalog.catalog_manager.init_db') - @mock.patch('src.catalog.catalog_manager.DatasetService') - @mock.patch('src.catalog.catalog_manager.DatasetColumnService') + @mock.patch('eva.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.DatasetService') + @mock.patch('eva.catalog.catalog_manager.DatasetColumnService') def test_get_dataset_metadata_when_table_exists(self, dcs_mock, ds_mock, @@ -154,9 +154,9 @@ def test_get_dataset_metadata_when_table_exists(self, self.assertEqual(actual.id, id) self.assertEqual(actual.schema, schema) - @mock.patch('src.catalog.catalog_manager.init_db') - @mock.patch('src.catalog.catalog_manager.DatasetService') - @mock.patch('src.catalog.catalog_manager.DatasetColumnService') + @mock.patch('eva.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.DatasetService') + @mock.patch('eva.catalog.catalog_manager.DatasetColumnService') def test_get_dataset_metadata_when_table_doesnot_exists(self, dcs_mock, ds_mock, @@ -175,7 +175,7 @@ def test_get_dataset_metadata_when_table_doesnot_exists(self, dcs_mock.return_value.columns_by_id_and_dataset_id.assert_not_called() self.assertEqual(actual, metadata_obj) - @mock.patch('src.catalog.catalog_manager.UdfIO') + @mock.patch('eva.catalog.catalog_manager.UdfIO') def test_create_udf_io_object(self, udfio_mock): catalog = CatalogManager() actual = catalog.udf_io('name', ColumnType.NDARRAY, NdArrayType.UINT8, @@ -188,8 +188,8 @@ def test_create_udf_io_object(self, udfio_mock): is_input=True) self.assertEqual(actual, udfio_mock.return_value) - @mock.patch('src.catalog.catalog_manager.UdfService') - @mock.patch('src.catalog.catalog_manager.UdfIOService') + @mock.patch('eva.catalog.catalog_manager.UdfService') + @mock.patch('eva.catalog.catalog_manager.UdfIOService') def test_create_udf(self, udfio_mock, udf_mock): catalog = CatalogManager() udf_io_list = [MagicMock()] @@ -200,9 +200,9 @@ def test_create_udf(self, udfio_mock, udf_mock): 'udf', 'sample.py', 'classification') self.assertEqual(actual, udf_mock.return_value.create_udf.return_value) - @mock.patch('src.catalog.catalog_manager.init_db') - @mock.patch('src.catalog.catalog_manager.DatasetService') - @mock.patch('src.catalog.catalog_manager.DatasetColumnService') + @mock.patch('eva.catalog.catalog_manager.init_db') + @mock.patch('eva.catalog.catalog_manager.DatasetService') + @mock.patch('eva.catalog.catalog_manager.DatasetColumnService') def test_delete_metadata(self, dcs_mock, ds_mock, initdb_mock): dataset_name = "name" catalog = CatalogManager() @@ -212,7 +212,7 @@ def test_delete_metadata(self, dcs_mock, ds_mock, initdb_mock): ds_mock.return_value.delete_dataset_by_id.assert_called_with( ds_id_mock.return_value) - @mock.patch('src.catalog.catalog_manager.UdfService') + @mock.patch('eva.catalog.catalog_manager.UdfService') def test_get_udf_by_name(self, udf_mock): catalog = CatalogManager() actual = catalog.get_udf_by_name('name') @@ -220,7 +220,7 @@ def test_get_udf_by_name(self, udf_mock): self.assertEqual(actual, udf_mock.return_value.udf_by_name.return_value) - @mock.patch('src.catalog.catalog_manager.UdfService') + @mock.patch('eva.catalog.catalog_manager.UdfService') def test_delete_udf(self, udf_mock): actual = CatalogManager().delete_udf('name') udf_mock.return_value.delete_udf_by_name.assert_called_with('name') diff --git a/test/catalog/test_column_type.py b/test/catalog/test_column_type.py index 4841c9af6..288fcad32 100644 --- a/test/catalog/test_column_type.py +++ b/test/catalog/test_column_type.py @@ -16,7 +16,7 @@ import numpy as np from decimal import Decimal -from src.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.column_type import ColumnType, NdArrayType class ColumnTypeTests(unittest.TestCase): diff --git a/test/catalog/test_schema.py b/test/catalog/test_schema.py index b1e718757..0860b4344 100644 --- a/test/catalog/test_schema.py +++ b/test/catalog/test_schema.py @@ -21,10 +21,10 @@ from decimal import Decimal from unittest.mock import MagicMock, call, patch -from src.catalog.column_type import ColumnType, NdArrayType -from src.catalog.df_schema import DataFrameSchema -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.schema_utils import SchemaUtils +from eva.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.df_schema import DataFrameSchema +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.schema_utils import SchemaUtils class SchemaTests(unittest.TestCase): @@ -73,8 +73,8 @@ def test_raise_exception_when_unkown_array_type(self): ColumnType.TEXT, [10, 10]) self.assertRaises(ValueError, SchemaUtils.get_petastorm_column, col) - @patch('src.catalog.schema_utils.Unischema') - @patch('src.catalog.schema_utils.SchemaUtils.get_petastorm_column') + @patch('eva.catalog.schema_utils.Unischema') + @patch('eva.catalog.schema_utils.SchemaUtils.get_petastorm_column') def test_get_petastorm_schema(self, mock_get_pc, mock_uni): cols = [MagicMock() for i in range(2)] mock_get_pc.side_effect = [1, 2] diff --git a/test/configuration/test_configuration_manager.py b/test/configuration/test_configuration_manager.py index 7aeccd6e2..95180f7b5 100644 --- a/test/configuration/test_configuration_manager.py +++ b/test/configuration/test_configuration_manager.py @@ -14,7 +14,7 @@ # limitations under the License. import unittest -from src.configuration.configuration_manager import ConfigurationManager +from eva.configuration.configuration_manager import ConfigurationManager class ConfigurationManagerTests(unittest.TestCase): @@ -26,7 +26,7 @@ def test_configuration_manager_read(self): configuration_manager = ConfigurationManager() - value = configuration_manager.get_value("core", "location") + value = configuration_manager.get_value("core", "datasets_dir") self.assertNotEqual(value, None) value = configuration_manager.get_value("invalid", "") diff --git a/test/executor/test_create_udf_executor.py b/test/executor/test_create_udf_executor.py index 871e65f8f..6246b34a4 100644 --- a/test/executor/test_create_udf_executor.py +++ b/test/executor/test_create_udf_executor.py @@ -15,11 +15,11 @@ import unittest from mock import patch, MagicMock -from src.executor.create_udf_executor import CreateUDFExecutor +from eva.executor.create_udf_executor import CreateUDFExecutor class CreateUdfExecutorTest(unittest.TestCase): - @patch('src.executor.create_udf_executor.CatalogManager') + @patch('eva.executor.create_udf_executor.CatalogManager') def test_should_create_udf(self, mock): catalog_instance = mock.return_value catalog_instance.create_udf.return_value = 'udf' diff --git a/test/executor/test_disk_storage_executor.py b/test/executor/test_disk_storage_executor.py index 023f9ef4b..5c3779a96 100644 --- a/test/executor/test_disk_storage_executor.py +++ b/test/executor/test_disk_storage_executor.py @@ -15,15 +15,15 @@ import unittest from unittest.mock import patch -from src.catalog.models.df_metadata import DataFrameMetadata -from src.executor.disk_based_storage_executor import DiskStorageExecutor -from src.planner.storage_plan import StoragePlan +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.executor.disk_based_storage_executor import DiskStorageExecutor +from eva.planner.storage_plan import StoragePlan class DiskStorageExecutorTest(unittest.TestCase): @unittest.skip("disable test due to deprication") - @patch('src.executor.disk_based_storage_executor.Loader') + @patch('eva.executor.disk_based_storage_executor.Loader') def test_calling_storage_executor_should_return_batches(self, mock_class): class_instance = mock_class.return_value diff --git a/test/executor/test_execution_context.py b/test/executor/test_execution_context.py index 8f536d0ba..306581ce2 100644 --- a/test/executor/test_execution_context.py +++ b/test/executor/test_execution_context.py @@ -16,14 +16,14 @@ from mock import patch -from src.constants import NO_GPU -from src.executor.execution_context import Context +from eva.constants import NO_GPU +from eva.executor.execution_context import Context class ExecutionContextTest(unittest.TestCase): - @patch('src.executor.execution_context.ConfigurationManager') - @patch('src.executor.execution_context.socket') - @patch('src.executor.execution_context.is_gpu_available') + @patch('eva.executor.execution_context.ConfigurationManager') + @patch('eva.executor.execution_context.socket') + @patch('eva.executor.execution_context.is_gpu_available') def test_gpu_devices_gets_populated_from_config(self, gpu_check, socket, cfm): gpu_check.return_value = True @@ -36,10 +36,10 @@ def test_gpu_devices_gets_populated_from_config(self, gpu_check, socket, self.assertEqual(context.gpus, ['0', '1', '2']) - @patch('src.executor.execution_context.ConfigurationManager') - @patch('src.executor.execution_context.os') - @patch('src.executor.execution_context.socket') - @patch('src.executor.execution_context.is_gpu_available') + @patch('eva.executor.execution_context.ConfigurationManager') + @patch('eva.executor.execution_context.os') + @patch('eva.executor.execution_context.socket') + @patch('eva.executor.execution_context.is_gpu_available') def test_gpu_devices_gets_populated_from_environment_if_no_config(self, is_gpu, socket, @@ -57,10 +57,10 @@ def test_gpu_devices_gets_populated_from_environment_if_no_config(self, self.assertEqual(context.gpus, ['0', '1', '2']) - @patch('src.executor.execution_context.ConfigurationManager') - @patch('src.executor.execution_context.os') - @patch('src.executor.execution_context.socket') - @patch('src.executor.execution_context.is_gpu_available') + @patch('eva.executor.execution_context.ConfigurationManager') + @patch('eva.executor.execution_context.os') + @patch('eva.executor.execution_context.socket') + @patch('eva.executor.execution_context.is_gpu_available') def test_gpu_devices_should_be_empty_if_nothing_provided(self, gpu_check, socket, os, cfm): @@ -76,10 +76,10 @@ def test_gpu_devices_should_be_empty_if_nothing_provided(self, gpu_check, self.assertEqual(context.gpus, []) - @patch('src.executor.execution_context.ConfigurationManager') - @patch('src.executor.execution_context.os') - @patch('src.executor.execution_context.socket') - @patch('src.executor.execution_context.is_gpu_available') + @patch('eva.executor.execution_context.ConfigurationManager') + @patch('eva.executor.execution_context.os') + @patch('eva.executor.execution_context.socket') + @patch('eva.executor.execution_context.is_gpu_available') def test_gpus_ignores_config_if_no_gpu_available(self, gpu_check, socket, os, cfm): @@ -94,10 +94,10 @@ def test_gpus_ignores_config_if_no_gpu_available(self, gpu_check, self.assertEqual(context.gpus, []) - @patch('src.executor.execution_context.ConfigurationManager') - @patch('src.executor.execution_context.os') - @patch('src.executor.execution_context.socket') - @patch('src.executor.execution_context.is_gpu_available') + @patch('eva.executor.execution_context.ConfigurationManager') + @patch('eva.executor.execution_context.os') + @patch('eva.executor.execution_context.socket') + @patch('eva.executor.execution_context.is_gpu_available') def test_gpu_device_should_return_NO_GPU_if_GPU_not_available(self, gpu_check, socket, @@ -114,10 +114,10 @@ def test_gpu_device_should_return_NO_GPU_if_GPU_not_available(self, self.assertEqual(context.gpu_device(), NO_GPU) - @patch('src.executor.execution_context.ConfigurationManager') - @patch('src.executor.execution_context.socket') - @patch('src.executor.execution_context.is_gpu_available') - @patch('src.executor.execution_context.random') + @patch('eva.executor.execution_context.ConfigurationManager') + @patch('eva.executor.execution_context.socket') + @patch('eva.executor.execution_context.is_gpu_available') + @patch('eva.executor.execution_context.random') def test_should_return_random_gpu_ID_if_available(self, random, gpu_check, socket, diff --git a/test/executor/test_limit_executor.py b/test/executor/test_limit_executor.py index 9eff92d21..22155f031 100644 --- a/test/executor/test_limit_executor.py +++ b/test/executor/test_limit_executor.py @@ -2,15 +2,15 @@ import pandas as pd import numpy as np -from src.executor.orderby_executor import OrderByExecutor -from src.executor.limit_executor import LimitExecutor -from src.expression.tuple_value_expression import TupleValueExpression -from src.models.storage.batch import Batch -from src.parser.types import ParserOrderBySortType +from eva.executor.orderby_executor import OrderByExecutor +from eva.executor.limit_executor import LimitExecutor +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.models.storage.batch import Batch +from eva.parser.types import ParserOrderBySortType from test.executor.utils import DummyExecutor -from src.planner.orderby_plan import OrderByPlan -from src.planner.limit_plan import LimitPlan -from src.expression.constant_value_expression import ConstantValueExpression +from eva.planner.orderby_plan import OrderByPlan +from eva.planner.limit_plan import LimitPlan +from eva.expression.constant_value_expression import ConstantValueExpression class LimitExecutorTest(unittest.TestCase): diff --git a/test/executor/test_load_executor.py b/test/executor/test_load_executor.py index 4349b2218..9b9e5cead 100644 --- a/test/executor/test_load_executor.py +++ b/test/executor/test_load_executor.py @@ -17,17 +17,17 @@ import pandas as pd from mock import patch, MagicMock, call -from src.executor.load_executor import LoadDataExecutor -from src.models.storage.batch import Batch +from eva.executor.load_executor import LoadDataExecutor +from eva.models.storage.batch import Batch from test.util import PATH_PREFIX class LoadExecutorTest(unittest.TestCase): - @patch('src.executor.load_executor.OpenCVReader') - @patch('src.executor.load_executor.StorageEngine.create') - @patch('src.executor.load_executor.StorageEngine.write') + @patch('eva.executor.load_executor.OpenCVReader') + @patch('eva.executor.load_executor.StorageEngine.create') + @patch('eva.executor.load_executor.StorageEngine.write') def test_should_call_opencv_reader_and_storage_engine( self, write_mock, create_mock, cv_mock): batch_frames = [list(range(5))] * 2 diff --git a/test/executor/test_orderby_executor.py b/test/executor/test_orderby_executor.py index feced2b9c..f9e852d0e 100644 --- a/test/executor/test_orderby_executor.py +++ b/test/executor/test_orderby_executor.py @@ -2,12 +2,12 @@ import pandas as pd import numpy as np -from src.executor.orderby_executor import OrderByExecutor -from src.expression.tuple_value_expression import TupleValueExpression -from src.models.storage.batch import Batch -from src.parser.types import ParserOrderBySortType +from eva.executor.orderby_executor import OrderByExecutor +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.models.storage.batch import Batch +from eva.parser.types import ParserOrderBySortType from test.executor.utils import DummyExecutor -from src.planner.orderby_plan import OrderByPlan +from eva.planner.orderby_plan import OrderByPlan class OrderByExecutorTest(unittest.TestCase): diff --git a/test/executor/test_plan_executor.py b/test/executor/test_plan_executor.py index 38c647e78..aaafa4971 100644 --- a/test/executor/test_plan_executor.py +++ b/test/executor/test_plan_executor.py @@ -17,24 +17,24 @@ from unittest.mock import patch, MagicMock -from src.catalog.models.df_metadata import DataFrameMetadata -from src.executor.plan_executor import PlanExecutor -from src.models.storage.batch import Batch -from src.planner.seq_scan_plan import SeqScanPlan -from src.planner.storage_plan import StoragePlan -from src.planner.pp_plan import PPScanPlan -from src.planner.insert_plan import InsertPlan -from src.planner.create_plan import CreatePlan -from src.planner.create_udf_plan import CreateUDFPlan -from src.planner.load_data_plan import LoadDataPlan -from src.planner.upload_plan import UploadPlan -from src.executor.load_executor import LoadDataExecutor -from src.executor.upload_executor import UploadExecutor -from src.executor.seq_scan_executor import SequentialScanExecutor -from src.executor.create_executor import CreateExecutor -from src.executor.create_udf_executor import CreateUDFExecutor -from src.executor.insert_executor import InsertExecutor -from src.executor.pp_executor import PPExecutor +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.executor.plan_executor import PlanExecutor +from eva.models.storage.batch import Batch +from eva.planner.seq_scan_plan import SeqScanPlan +from eva.planner.storage_plan import StoragePlan +from eva.planner.pp_plan import PPScanPlan +from eva.planner.insert_plan import InsertPlan +from eva.planner.create_plan import CreatePlan +from eva.planner.create_udf_plan import CreateUDFPlan +from eva.planner.load_data_plan import LoadDataPlan +from eva.planner.upload_plan import UploadPlan +from eva.executor.load_executor import LoadDataExecutor +from eva.executor.upload_executor import UploadExecutor +from eva.executor.seq_scan_executor import SequentialScanExecutor +from eva.executor.create_executor import CreateExecutor +from eva.executor.create_udf_executor import CreateUDFExecutor +from eva.executor.insert_executor import InsertExecutor +from eva.executor.pp_executor import PPExecutor class PlanExecutorTest(unittest.TestCase): @@ -116,8 +116,8 @@ def test_build_execution_tree_should_create_correct_exec_node(self): executor = PlanExecutor(plan)._build_execution_tree(plan) self.assertIsInstance(executor, UploadExecutor) - @patch('src.executor.plan_executor.PlanExecutor._build_execution_tree') - @patch('src.executor.plan_executor.PlanExecutor._clean_execution_tree') + @patch('eva.executor.plan_executor.PlanExecutor._build_execution_tree') + @patch('eva.executor.plan_executor.PlanExecutor._clean_execution_tree') def test_execute_plan_for_seq_scan_plan( self, mock_clean, mock_build): @@ -138,8 +138,8 @@ def test_execute_plan_for_seq_scan_plan( tree.exec.assert_called_once() self.assertEqual(actual, batch_list) - @patch('src.executor.plan_executor.PlanExecutor._build_execution_tree') - @patch('src.executor.plan_executor.PlanExecutor._clean_execution_tree') + @patch('eva.executor.plan_executor.PlanExecutor._build_execution_tree') + @patch('eva.executor.plan_executor.PlanExecutor._clean_execution_tree') def test_execute_plan_for_pp_scan_plan( self, mock_clean, mock_build): @@ -159,8 +159,8 @@ def test_execute_plan_for_pp_scan_plan( tree.exec.assert_called_once() self.assertEqual(actual, batch_list) - @patch('src.executor.plan_executor.PlanExecutor._build_execution_tree') - @patch('src.executor.plan_executor.PlanExecutor._clean_execution_tree') + @patch('eva.executor.plan_executor.PlanExecutor._build_execution_tree') + @patch('eva.executor.plan_executor.PlanExecutor._clean_execution_tree') def test_execute_plan_for_create_insert_load_upload_plans( self, mock_clean, mock_build): @@ -218,7 +218,7 @@ def test_execute_plan_for_create_insert_load_upload_plans( self.assertEqual(actual, []) @unittest.skip("disk_based_storage_depricated") - @patch('src.executor.disk_based_storage_executor.Loader') + @patch('eva.executor.disk_based_storage_executor.Loader') def test_should_return_the_new_path_after_execution(self, mock_class): class_instatnce = mock_class.return_value diff --git a/test/executor/test_pp_executor.py b/test/executor/test_pp_executor.py index bf83fc640..12ab8dc65 100644 --- a/test/executor/test_pp_executor.py +++ b/test/executor/test_pp_executor.py @@ -14,8 +14,8 @@ # limitations under the License. import unittest -from src.executor.pp_executor import PPExecutor -from src.models.storage.batch import Batch +from eva.executor.pp_executor import PPExecutor +from eva.models.storage.batch import Batch from test.util import create_dataframe from ..executor.utils import DummyExecutor diff --git a/test/executor/test_sample_executor.py b/test/executor/test_sample_executor.py index cefb2bb46..5e9200d53 100644 --- a/test/executor/test_sample_executor.py +++ b/test/executor/test_sample_executor.py @@ -2,11 +2,11 @@ import pandas as pd import numpy as np -from src.executor.sample_executor import SampleExecutor -from src.models.storage.batch import Batch +from eva.executor.sample_executor import SampleExecutor +from eva.models.storage.batch import Batch from test.executor.utils import DummyExecutor -from src.planner.sample_plan import SamplePlan -from src.expression.constant_value_expression import ConstantValueExpression +from eva.planner.sample_plan import SamplePlan +from eva.expression.constant_value_expression import ConstantValueExpression class SampleExecutorTest(unittest.TestCase): diff --git a/test/executor/test_seq_scan_executor.py b/test/executor/test_seq_scan_executor.py index bb2de6b78..67a6aab48 100644 --- a/test/executor/test_seq_scan_executor.py +++ b/test/executor/test_seq_scan_executor.py @@ -15,8 +15,8 @@ import unittest import pandas as pd -from src.executor.seq_scan_executor import SequentialScanExecutor -from src.models.storage.batch import Batch +from eva.executor.seq_scan_executor import SequentialScanExecutor +from eva.models.storage.batch import Batch from test.util import create_dataframe from test.executor.utils import DummyExecutor diff --git a/test/executor/utils.py b/test/executor/utils.py index 30f793f6d..14f5e739c 100644 --- a/test/executor/utils.py +++ b/test/executor/utils.py @@ -14,7 +14,7 @@ # limitations under the License. from typing import List -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch class DummyExecutor: diff --git a/test/expression/test_aggregation.py b/test/expression/test_aggregation.py index 5c77df02b..673e2d4dd 100644 --- a/test/expression/test_aggregation.py +++ b/test/expression/test_aggregation.py @@ -15,10 +15,10 @@ import pandas as pd import unittest -from src.expression.abstract_expression import ExpressionType -from src.expression.aggregation_expression import AggregationExpression -from src.expression.tuple_value_expression import TupleValueExpression -from src.models.storage.batch import Batch +from eva.expression.abstract_expression import ExpressionType +from eva.expression.aggregation_expression import AggregationExpression +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.models.storage.batch import Batch class AggregationExpressionsTest(unittest.TestCase): diff --git a/test/expression/test_arithmetic.py b/test/expression/test_arithmetic.py index ca02a6509..2f6e9f90b 100644 --- a/test/expression/test_arithmetic.py +++ b/test/expression/test_arithmetic.py @@ -14,9 +14,9 @@ # limitations under the License. import unittest -from src.expression.abstract_expression import ExpressionType -from src.expression.constant_value_expression import ConstantValueExpression -from src.expression.arithmetic_expression import ArithmeticExpression +from eva.expression.abstract_expression import ExpressionType +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.expression.arithmetic_expression import ArithmeticExpression class ArithmeticExpressionsTest(unittest.TestCase): diff --git a/test/expression/test_comparison.py b/test/expression/test_comparison.py index fa81713cb..f3b92aabc 100644 --- a/test/expression/test_comparison.py +++ b/test/expression/test_comparison.py @@ -14,10 +14,10 @@ # limitations under the License. import unittest -from src.expression.abstract_expression import ExpressionType -from src.expression.comparison_expression import ComparisonExpression -from src.expression.constant_value_expression import ConstantValueExpression -from src.catalog.column_type import ColumnType +from eva.expression.abstract_expression import ExpressionType +from eva.expression.comparison_expression import ComparisonExpression +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.catalog.column_type import ColumnType class ComparisonExpressionsTest(unittest.TestCase): diff --git a/test/expression/test_expression_tree.py b/test/expression/test_expression_tree.py index 060e59b86..d1d586c04 100644 --- a/test/expression/test_expression_tree.py +++ b/test/expression/test_expression_tree.py @@ -14,13 +14,13 @@ # limitations under the License. import unittest -from src.expression.abstract_expression import ExpressionType -from src.expression.comparison_expression import ComparisonExpression -from src.expression.constant_value_expression import ConstantValueExpression -from src.expression.tuple_value_expression import TupleValueExpression -from src.expression.aggregation_expression import AggregationExpression -from src.expression.function_expression import FunctionExpression -from src.expression.logical_expression import LogicalExpression +from eva.expression.abstract_expression import ExpressionType +from eva.expression.comparison_expression import ComparisonExpression +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.expression.aggregation_expression import AggregationExpression +from eva.expression.function_expression import FunctionExpression +from eva.expression.logical_expression import LogicalExpression class ExpressionEvaluationTest(unittest.TestCase): diff --git a/test/expression/test_function_expression.py b/test/expression/test_function_expression.py index 643c020ae..95767be05 100644 --- a/test/expression/test_function_expression.py +++ b/test/expression/test_function_expression.py @@ -17,11 +17,11 @@ import pandas as pd from mock import MagicMock, Mock, patch -from src.constants import NO_GPU -from src.expression.function_expression import FunctionExpression, \ +from eva.constants import NO_GPU +from eva.expression.function_expression import FunctionExpression, \ ExecutionMode -from src.models.storage.batch import Batch -from src.udfs.gpu_compatible import GPUCompatible +from eva.models.storage.batch import Batch +from eva.udfs.gpu_compatible import GPUCompatible class FunctionExpressionTest(unittest.TestCase): @@ -55,7 +55,7 @@ def test_should_filter_function_output(self): expected = Batch(pd.DataFrame(values['id']) + 1) self.assertEqual(expected, actual) - @patch('src.expression.function_expression.Context') + @patch('eva.expression.function_expression.Context') def test_function_move_the_device_to_gpu_if_compatible(self, context): context_instance = context.return_value mock_function = MagicMock(spec=GPUCompatible) @@ -85,7 +85,7 @@ def test_should_use_the_same_function_if_not_gpu_compatible(self): expression.evaluate(input_batch) mock_function.assert_called() - @patch('src.expression.function_expression.Context') + @patch('eva.expression.function_expression.Context') def test_should_execute_same_function_if_no_gpu(self, context): context_instance = context.return_value mock_function = MagicMock(spec=GPUCompatible, diff --git a/test/expression/test_logical.py b/test/expression/test_logical.py index b8f045008..f7f83fb57 100644 --- a/test/expression/test_logical.py +++ b/test/expression/test_logical.py @@ -16,12 +16,12 @@ import pandas as pd from mock import Mock -from src.expression.abstract_expression import ExpressionType -from src.expression.comparison_expression import ComparisonExpression -from src.expression.logical_expression import LogicalExpression -from src.expression.constant_value_expression import ConstantValueExpression -from src.expression.tuple_value_expression import TupleValueExpression -from src.models.storage.batch import Batch +from eva.expression.abstract_expression import ExpressionType +from eva.expression.comparison_expression import ComparisonExpression +from eva.expression.logical_expression import LogicalExpression +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.models.storage.batch import Batch class LogicalExpressionsTest(unittest.TestCase): diff --git a/test/expression/test_tuple_value.py b/test/expression/test_tuple_value.py index ba60b7024..8abade4a2 100644 --- a/test/expression/test_tuple_value.py +++ b/test/expression/test_tuple_value.py @@ -15,8 +15,8 @@ import unittest import pandas as pd -from src.expression.tuple_value_expression import TupleValueExpression -from src.models.storage.batch import Batch +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.models.storage.batch import Batch class TupleValueExpressionsTest(unittest.TestCase): diff --git a/test/integration_tests/test_insert_executor.py b/test/integration_tests/test_insert_executor.py index 74c744f3b..3544a553f 100644 --- a/test/integration_tests/test_insert_executor.py +++ b/test/integration_tests/test_insert_executor.py @@ -15,8 +15,8 @@ import unittest import numpy as np -from src.catalog.catalog_manager import CatalogManager -from src.server.command_handler import execute_query_fetch_all +from eva.catalog.catalog_manager import CatalogManager +from eva.server.command_handler import execute_query_fetch_all from test.util import create_sample_video, file_remove diff --git a/test/integration_tests/test_load_executor.py b/test/integration_tests/test_load_executor.py index 93a3eb203..19ccdcd48 100644 --- a/test/integration_tests/test_load_executor.py +++ b/test/integration_tests/test_load_executor.py @@ -15,10 +15,10 @@ import unittest import pandas as pd -from src.catalog.catalog_manager import CatalogManager -from src.models.storage.batch import Batch -from src.storage.storage_engine import StorageEngine -from src.server.command_handler import execute_query_fetch_all +from eva.catalog.catalog_manager import CatalogManager +from eva.models.storage.batch import Batch +from eva.storage.storage_engine import StorageEngine +from eva.server.command_handler import execute_query_fetch_all from test.util import create_sample_video, create_dummy_batches, file_remove diff --git a/test/integration_tests/test_pytorch.py b/test/integration_tests/test_pytorch.py index 3bdb91531..41f9bed05 100644 --- a/test/integration_tests/test_pytorch.py +++ b/test/integration_tests/test_pytorch.py @@ -14,8 +14,8 @@ # limitations under the License. import unittest -from src.catalog.catalog_manager import CatalogManager -from src.server.command_handler import execute_query_fetch_all +from eva.catalog.catalog_manager import CatalogManager +from eva.server.command_handler import execute_query_fetch_all from test.util import copy_sample_video_to_prefix, file_remove @@ -38,7 +38,7 @@ def test_should_run_pytorch_and_fastrcnn(self): INPUT (Frame_Array NDARRAY UINT8(3, 256, 256)) OUTPUT (label NDARRAY STR(10)) TYPE Classification - IMPL 'src/udfs/fastrcnn_object_detector.py'; + IMPL 'eva/udfs/fastrcnn_object_detector.py'; """ execute_query_fetch_all(create_udf_query) @@ -56,7 +56,7 @@ def test_should_run_pytorch_and_ssd(self): INPUT (Frame_Array NDARRAY UINT8(3, 256, 256)) OUTPUT (label NDARRAY STR(10)) TYPE Classification - IMPL 'src/udfs/ssd_object_detector.py'; + IMPL 'eva/udfs/ssd_object_detector.py'; """ execute_query_fetch_all(create_udf_query) diff --git a/test/integration_tests/test_select_executor.py b/test/integration_tests/test_select_executor.py index 79c65b49a..531a0c570 100644 --- a/test/integration_tests/test_select_executor.py +++ b/test/integration_tests/test_select_executor.py @@ -17,10 +17,10 @@ import numpy as np import pandas as pd -from src.catalog.catalog_manager import CatalogManager -from src.models.storage.batch import Batch -from src.readers.opencv_reader import OpenCVReader -from src.server.command_handler import execute_query_fetch_all +from eva.catalog.catalog_manager import CatalogManager +from eva.models.storage.batch import Batch +from eva.readers.opencv_reader import OpenCVReader +from eva.server.command_handler import execute_query_fetch_all from test.util import create_sample_video, create_dummy_batches, file_remove diff --git a/test/integration_tests/test_udf_executor.py b/test/integration_tests/test_udf_executor.py index da618897e..909b0ab73 100644 --- a/test/integration_tests/test_udf_executor.py +++ b/test/integration_tests/test_udf_executor.py @@ -15,9 +15,9 @@ import unittest import pandas as pd -from src.catalog.catalog_manager import CatalogManager -from src.models.storage.batch import Batch -from src.server.command_handler import execute_query_fetch_all +from eva.catalog.catalog_manager import CatalogManager +from eva.models.storage.batch import Batch +from eva.server.command_handler import execute_query_fetch_all from test.util import create_sample_video, create_dummy_batches, \ DummyObjectDetector, file_remove diff --git a/test/integration_tests/test_upload_executor.py b/test/integration_tests/test_upload_executor.py index 6056bfd55..f9f9c4c47 100644 --- a/test/integration_tests/test_upload_executor.py +++ b/test/integration_tests/test_upload_executor.py @@ -16,7 +16,7 @@ import os import base64 -from src.server.command_handler import execute_query_fetch_all +from eva.server.command_handler import execute_query_fetch_all from test.util import file_remove, PATH_PREFIX diff --git a/test/models/catalog/test_frame_info.py b/test/models/catalog/test_frame_info.py index 7d215ad95..979f0f9a9 100644 --- a/test/models/catalog/test_frame_info.py +++ b/test/models/catalog/test_frame_info.py @@ -14,8 +14,8 @@ # limitations under the License. import unittest -from src.models.catalog.frame_info import FrameInfo -from src.models.catalog.properties import ColorSpace +from eva.models.catalog.frame_info import FrameInfo +from eva.models.catalog.properties import ColorSpace class FrameInfoTest(unittest.TestCase): diff --git a/test/models/server/test_response.py b/test/models/server/test_response.py index 853a0fa8a..b47a38a06 100644 --- a/test/models/server/test_response.py +++ b/test/models/server/test_response.py @@ -14,8 +14,8 @@ # limitations under the License. import unittest -from src.models.storage.batch import Batch -from src.models.server.response import ResponseStatus, Response +from eva.models.storage.batch import Batch +from eva.models.server.response import ResponseStatus, Response from test.util import create_dataframe diff --git a/test/models/storage/test_batch.py b/test/models/storage/test_batch.py index 90d92e9aa..bad62210e 100644 --- a/test/models/storage/test_batch.py +++ b/test/models/storage/test_batch.py @@ -17,7 +17,7 @@ import numpy as np -from src.models.storage.batch import Batch +from eva.models.storage.batch import Batch from test.util import create_dataframe_same, create_dataframe diff --git a/test/optimizer/rules/test_rules.py b/test/optimizer/rules/test_rules.py index 8ce24337d..072b7cbbf 100644 --- a/test/optimizer/rules/test_rules.py +++ b/test/optimizer/rules/test_rules.py @@ -2,10 +2,10 @@ from mock import MagicMock -from src.optimizer.operators import (LogicalGet, LogicalProject, LogicalFilter, +from eva.optimizer.operators import (LogicalGet, LogicalProject, LogicalFilter, LogicalQueryDerivedGet, LogicalSample, Dummy) -from src.optimizer.rules.rules import (EmbedProjectIntoGet, EmbedFilterIntoGet, +from eva.optimizer.rules.rules import (EmbedProjectIntoGet, EmbedFilterIntoGet, EmbedFilterIntoDerivedGet, EmbedProjectIntoDerivedGet, PushdownFilterThroughSample, @@ -21,7 +21,7 @@ LogicalUnionToPhysical, LogicalOrderByToPhysical, LogicalLimitToPhysical) -from src.optimizer.rules.rules import Promise, RulesManager +from eva.optimizer.rules.rules import Promise, RulesManager class TestRules(unittest.TestCase): diff --git a/test/optimizer/test_binder.py b/test/optimizer/test_binder.py index 9181ee713..1be61aa9f 100644 --- a/test/optimizer/test_binder.py +++ b/test/optimizer/test_binder.py @@ -2,11 +2,11 @@ from mock import MagicMock -from src.optimizer.binder import Binder -from src.optimizer.optimizer_context import OptimizerContext -from src.optimizer.operators import ( +from eva.optimizer.binder import Binder +from eva.optimizer.optimizer_context import OptimizerContext +from eva.optimizer.operators import ( OperatorType, LogicalFilter, LogicalGet, Dummy) -from src.optimizer.rules.pattern import Pattern +from eva.optimizer.rules.pattern import Pattern class TestBinder(unittest.TestCase): diff --git a/test/optimizer/test_cascade_optimizer.py b/test/optimizer/test_cascade_optimizer.py index 81f257fad..9ae19e21f 100644 --- a/test/optimizer/test_cascade_optimizer.py +++ b/test/optimizer/test_cascade_optimizer.py @@ -15,9 +15,9 @@ import unittest import pandas as pd -from src.catalog.catalog_manager import CatalogManager -from src.server.command_handler import execute_query_fetch_all -from src.models.storage.batch import Batch +from eva.catalog.catalog_manager import CatalogManager +from eva.server.command_handler import execute_query_fetch_all +from eva.models.storage.batch import Batch from test.util import create_sample_video, NUM_FRAMES, file_remove diff --git a/test/optimizer/test_group.py b/test/optimizer/test_group.py index 4592d4c34..1312edc7c 100644 --- a/test/optimizer/test_group.py +++ b/test/optimizer/test_group.py @@ -2,9 +2,9 @@ from mock import MagicMock -from src.optimizer.group import Group -from src.optimizer.group_expression import GroupExpression -from src.optimizer.property import Property, PropertyType +from eva.optimizer.group import Group +from eva.optimizer.group_expression import GroupExpression +from eva.optimizer.property import Property, PropertyType class TestGroup(unittest.TestCase): diff --git a/test/optimizer/test_memo.py b/test/optimizer/test_memo.py index 3e69ae8e3..58531339e 100644 --- a/test/optimizer/test_memo.py +++ b/test/optimizer/test_memo.py @@ -2,8 +2,8 @@ from mock import MagicMock -from src.optimizer.memo import Memo -from src.optimizer.group import INVALID_GROUP_ID +from eva.optimizer.memo import Memo +from eva.optimizer.group import INVALID_GROUP_ID class MemoTest(unittest.TestCase): diff --git a/test/optimizer/test_optimizer_context.py b/test/optimizer/test_optimizer_context.py index bc972b035..4036800a7 100644 --- a/test/optimizer/test_optimizer_context.py +++ b/test/optimizer/test_optimizer_context.py @@ -2,9 +2,9 @@ from mock import patch, MagicMock -from src.optimizer.optimizer_context import OptimizerContext -from src.optimizer.group_expression import GroupExpression -from src.optimizer.group import INVALID_GROUP_ID +from eva.optimizer.optimizer_context import OptimizerContext +from eva.optimizer.group_expression import GroupExpression +from eva.optimizer.group import INVALID_GROUP_ID class TestOptimizerContext(unittest.TestCase): @@ -25,10 +25,10 @@ def test_add_root_guaranteed_group_id(self): opt_ctxt.xform_opr_to_group_expr(fake_opr, 0, True) self.assertEqual(opt_ctxt.memo.get_group_id(fake_opr), 0) - @patch('src.optimizer.operators.Operator') - @patch('src.optimizer.operators.Operator') - @patch('src.optimizer.operators.Operator') - @patch('src.optimizer.operators.Operator') + @patch('eva.optimizer.operators.Operator') + @patch('eva.optimizer.operators.Operator') + @patch('eva.optimizer.operators.Operator') + @patch('eva.optimizer.operators.Operator') def test_opr_to_group_expr(self, child1_opr, child2_opr, diff --git a/test/optimizer/test_optimizer_task.py b/test/optimizer/test_optimizer_task.py index 87cfa3a18..330444181 100644 --- a/test/optimizer/test_optimizer_task.py +++ b/test/optimizer/test_optimizer_task.py @@ -2,13 +2,13 @@ from mock import MagicMock -from src.optimizer.optimizer_tasks import ( +from eva.optimizer.optimizer_tasks import ( TopDownRewrite, BottomUpRewrite, OptimizeGroup) -from src.optimizer.optimizer_context import OptimizerContext -from src.optimizer.operators import ( +from eva.optimizer.optimizer_context import OptimizerContext +from eva.optimizer.operators import ( LogicalGet, LogicalFilter, LogicalProject, LogicalQueryDerivedGet) -from src.optimizer.property import PropertyType -from src.planner.seq_scan_plan import SeqScanPlan +from eva.optimizer.property import PropertyType +from eva.planner.seq_scan_plan import SeqScanPlan class TestOptimizerTask(unittest.TestCase): diff --git a/test/optimizer/test_optimizer_utils.py b/test/optimizer/test_optimizer_utils.py index 5ce04f224..6a6139f65 100644 --- a/test/optimizer/test_optimizer_utils.py +++ b/test/optimizer/test_optimizer_utils.py @@ -16,21 +16,21 @@ from mock import patch, MagicMock, call -from src.expression.function_expression import FunctionExpression -from src.expression.tuple_value_expression import TupleValueExpression -from src.optimizer.optimizer_utils import (bind_dataset, bind_tuple_value_expr, +from eva.expression.function_expression import FunctionExpression +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.optimizer.optimizer_utils import (bind_dataset, bind_tuple_value_expr, column_definition_to_udf_io, bind_function_expr, bind_predicate_expr, bind_columns_expr, create_video_metadata) -from src.parser.create_statement import ColumnDefinition -from src.catalog.column_type import ColumnType, NdArrayType +from eva.parser.create_statement import ColumnDefinition +from eva.catalog.column_type import ColumnType, NdArrayType class OptimizerUtilsTest(unittest.TestCase): - @patch('src.optimizer.optimizer_utils.CatalogManager') + @patch('eva.optimizer.optimizer_utils.CatalogManager') def test_bind_dataset(self, mock): video = MagicMock() catalog = mock.return_value @@ -45,8 +45,8 @@ def test_bind_tuple_value_expr(self): bind_tuple_value_expr(tuple_expr, column_map) self.assertEqual(tuple_expr.col_object, column_map['col1']) - @patch('src.optimizer.optimizer_utils.CatalogManager') - @patch('src.optimizer.optimizer_utils.path_to_class') + @patch('eva.optimizer.optimizer_utils.CatalogManager') + @patch('eva.optimizer.optimizer_utils.path_to_class') def test_bind_function_value_expr(self, mock_str_path, mock_catalog): func_expr = FunctionExpression(None, name='temp') mock_output = MagicMock() @@ -85,25 +85,25 @@ def test_column_definition_to_udf_io(self): self.assertEqual(io.is_input, True) self.assertEqual(io.udf_id, None) - @patch('src.optimizer.optimizer_utils.bind_function_expr') + @patch('eva.optimizer.optimizer_utils.bind_function_expr') def test_bind_predicate_calls_bind_func_expr_if_type_functional(self, mock_bind): func_expr = FunctionExpression(None, name='temp') bind_predicate_expr(func_expr, {}) mock_bind.assert_called_with(func_expr, {}) - @patch('src.optimizer.optimizer_utils.bind_function_expr') + @patch('eva.optimizer.optimizer_utils.bind_function_expr') def test_bind_columns_calls_bind_func_expr_if_type_functional(self, mock_bind): func_expr = FunctionExpression(None, name='temp') bind_columns_expr([func_expr], {}) mock_bind.assert_called_with(func_expr, {}) - @patch('src.optimizer.optimizer_utils.CatalogManager') - @patch('src.optimizer.optimizer_utils.ColumnDefinition') - @patch('src.optimizer.optimizer_utils.ColConstraintInfo') - @patch('src.optimizer.optimizer_utils.create_column_metadata') - @patch('src.optimizer.optimizer_utils.generate_file_path') + @patch('eva.optimizer.optimizer_utils.CatalogManager') + @patch('eva.optimizer.optimizer_utils.ColumnDefinition') + @patch('eva.optimizer.optimizer_utils.ColConstraintInfo') + @patch('eva.optimizer.optimizer_utils.create_column_metadata') + @patch('eva.optimizer.optimizer_utils.generate_file_path') def test_create_video_metadata(self, m_gfp, m_ccm, m_cci, m_cd, m_cm): catalog_ins = MagicMock() expected = 'video_metadata' diff --git a/test/optimizer/test_statement_to_opr_convertor.py b/test/optimizer/test_statement_to_opr_convertor.py index 4d285dd27..f327b9d19 100644 --- a/test/optimizer/test_statement_to_opr_convertor.py +++ b/test/optimizer/test_statement_to_opr_convertor.py @@ -16,33 +16,33 @@ from mock import patch, MagicMock -from src.optimizer.statement_to_opr_convertor import StatementToPlanConvertor -from src.parser.select_statement import SelectStatement -from src.parser.table_ref import TableRef, TableInfo -from src.parser.create_udf_statement import CreateUDFStatement -from src.parser.insert_statement import InsertTableStatement -from src.parser.create_statement import CreateTableStatement -from src.parser.load_statement import LoadDataStatement -from src.parser.parser import Parser - -from src.optimizer.operators import (LogicalProject, LogicalGet, LogicalFilter, +from eva.optimizer.statement_to_opr_convertor import StatementToPlanConvertor +from eva.parser.select_statement import SelectStatement +from eva.parser.table_ref import TableRef, TableInfo +from eva.parser.create_udf_statement import CreateUDFStatement +from eva.parser.insert_statement import InsertTableStatement +from eva.parser.create_statement import CreateTableStatement +from eva.parser.load_statement import LoadDataStatement +from eva.parser.parser import Parser + +from eva.optimizer.operators import (LogicalProject, LogicalGet, LogicalFilter, LogicalQueryDerivedGet, LogicalCreate, LogicalCreateUDF, LogicalInsert, LogicalLoadData, LogicalUnion, LogicalOrderBy, LogicalLimit, LogicalSample) -from src.expression.tuple_value_expression import TupleValueExpression -from src.expression.constant_value_expression import ConstantValueExpression -from src.expression.comparison_expression import ComparisonExpression -from src.expression.abstract_expression import ExpressionType +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.expression.constant_value_expression import ConstantValueExpression +from eva.expression.comparison_expression import ComparisonExpression +from eva.expression.abstract_expression import ExpressionType -from src.parser.types import ParserOrderBySortType +from eva.parser.types import ParserOrderBySortType class StatementToOprTest(unittest.TestCase): - @patch('src.optimizer.statement_to_opr_convertor.LogicalGet') - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.LogicalGet') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') def test_visit_table_ref_should_create_logical_get_opr(self, mock, mock_lget): converter = StatementToPlanConvertor() @@ -52,8 +52,8 @@ def test_visit_table_ref_should_create_logical_get_opr(self, mock, mock_lget.assert_called_with(table_ref, mock.return_value) self.assertEqual(mock_lget.return_value, converter._plan) - @patch('src.optimizer.statement_to_opr_convertor.LogicalGet') - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.LogicalGet') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') def test_visit_table_ref_populates_column_mapping(self, mock, mock_lget): converter = StatementToPlanConvertor() @@ -63,8 +63,8 @@ def test_visit_table_ref_populates_column_mapping(self, mock, converter._populate_column_map.assert_called_with(mock.return_value) - @patch('src.optimizer.statement_to_opr_convertor.LogicalFilter') - @patch('src.optimizer.statement_to_opr_convertor.bind_predicate_expr') + @patch('eva.optimizer.statement_to_opr_convertor.LogicalFilter') + @patch('eva.optimizer.statement_to_opr_convertor.bind_predicate_expr') def test_visit_select_predicate_should_add_logical_filter(self, mock, mock_lfilter): converter = StatementToPlanConvertor() @@ -76,8 +76,8 @@ def test_visit_select_predicate_should_add_logical_filter(self, mock, mock_lfilter.return_value.append_child.assert_called() self.assertEqual(mock_lfilter.return_value, converter._plan) - @patch('src.optimizer.statement_to_opr_convertor.LogicalProject') - @patch('src.optimizer.statement_to_opr_convertor.bind_columns_expr') + @patch('eva.optimizer.statement_to_opr_convertor.LogicalProject') + @patch('eva.optimizer.statement_to_opr_convertor.bind_columns_expr') def test_visit_projection_should_add_logical_predicate(self, mock, mock_lproject): converter = StatementToPlanConvertor() @@ -134,8 +134,8 @@ def test_populate_column_map_should_populate_correctly(self): self.assertEqual(converter._column_map, expected) - @patch('src.optimizer.statement_to_opr_convertor.LogicalCreateUDF') - @patch('src.optimizer.\ + @patch('eva.optimizer.statement_to_opr_convertor.LogicalCreateUDF') + @patch('eva.optimizer.\ statement_to_opr_convertor.column_definition_to_udf_io') def test_visit_create_udf(self, mock, l_create_udf_mock): convertor = StatementToPlanConvertor() @@ -199,9 +199,9 @@ def test_visit_should_call_load_data(self): mock.assert_called_once() mock.assert_called_with(stmt) - @patch('src.optimizer.statement_to_opr_convertor.LogicalLoadData') - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.create_video_metadata') + @patch('eva.optimizer.statement_to_opr_convertor.LogicalLoadData') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.create_video_metadata') def test_visit_load_data_when_bind_returns_valid( self, mock_create, mock_bind, mock_load): mock_bind.return_value = MagicMock() @@ -212,9 +212,9 @@ def test_visit_load_data_when_bind_returns_valid( mock_load.assert_called_once_with(mock_bind.return_value, 'path') mock_create.assert_not_called() - @patch('src.optimizer.statement_to_opr_convertor.LogicalLoadData') - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.create_video_metadata') + @patch('eva.optimizer.statement_to_opr_convertor.LogicalLoadData') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.create_video_metadata') def test_visit_load_data_when_bind_returns_None( self, mock_create, mock_bind, mock_load): mock_bind.return_value = None @@ -225,9 +225,9 @@ def test_visit_load_data_when_bind_returns_None( mock_bind.assert_called_with(table_ref.table) mock_load.assert_called_with(mock_create.return_value, 'path') - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.bind_columns_expr') - @patch('src.optimizer.statement_to_opr_convertor.bind_predicate_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.bind_columns_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_predicate_expr') def test_should_visit_select_if_nested_query(self, mock_p, mock_c, mock_d): m = MagicMock() mock_p.return_value = mock_c.return_value = mock_d.return_value = m @@ -265,9 +265,9 @@ def test_should_visit_select_if_nested_query(self, mock_p, mock_c, mock_d): wrong_plan.append_child(plan) self.assertNotEqual(wrong_plan, actual_plan) - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.bind_columns_expr') - @patch('src.optimizer.statement_to_opr_convertor.bind_predicate_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.bind_columns_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_predicate_expr') def test_visit_select_orderby(self, mock_p, mock_c, mock_d): m = MagicMock() mock_p.return_value = mock_c.return_value = mock_d.return_value = m @@ -307,9 +307,9 @@ def test_visit_select_orderby(self, mock_p, mock_c, mock_d): wrong_plan.append_child(plan) self.assertNotEqual(wrong_plan, actual_plan) - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.bind_columns_expr') - @patch('src.optimizer.statement_to_opr_convertor.bind_predicate_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.bind_columns_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_predicate_expr') def test_visit_select_limit(self, mock_p, mock_c, mock_d): m = MagicMock() mock_p.return_value = mock_c.return_value = mock_d.return_value = m @@ -347,9 +347,9 @@ def test_visit_select_limit(self, mock_p, mock_c, mock_d): wrong_plan.append_child(plan) self.assertNotEqual(wrong_plan, actual_plan) - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.bind_columns_expr') - @patch('src.optimizer.statement_to_opr_convertor.bind_predicate_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.bind_columns_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_predicate_expr') def test_visit_select_sample(self, mock_p, mock_c, mock_d): m = MagicMock() mock_p.return_value = mock_c.return_value = mock_d.return_value = m @@ -385,9 +385,9 @@ def test_visit_select_sample(self, mock_p, mock_c, mock_d): self.assertEqual(expected_plan, actual_plan) - @patch('src.optimizer.statement_to_opr_convertor.bind_dataset') - @patch('src.optimizer.statement_to_opr_convertor.bind_columns_expr') - @patch('src.optimizer.statement_to_opr_convertor.bind_predicate_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_dataset') + @patch('eva.optimizer.statement_to_opr_convertor.bind_columns_expr') + @patch('eva.optimizer.statement_to_opr_convertor.bind_predicate_expr') def test_should_visit_select_union_if_union_query(self, mock_p, mock_c, mock_d): m = MagicMock() diff --git a/test/parser/test_parser.py b/test/parser/test_parser.py index 46f2475b2..152dfd8b2 100644 --- a/test/parser/test_parser.py +++ b/test/parser/test_parser.py @@ -15,25 +15,25 @@ import unittest -from src.parser.parser import Parser -from src.parser.statement import AbstractStatement +from eva.parser.parser import Parser +from eva.parser.statement import AbstractStatement -from src.parser.statement import StatementType +from eva.parser.statement import StatementType -from src.parser.select_statement import SelectStatement -from src.parser.create_statement import ColumnDefinition -from src.parser.create_udf_statement import CreateUDFStatement -from src.parser.load_statement import LoadDataStatement -from src.parser.upload_statement import UploadStatement -from src.parser.insert_statement import InsertTableStatement +from eva.parser.select_statement import SelectStatement +from eva.parser.create_statement import ColumnDefinition +from eva.parser.create_udf_statement import CreateUDFStatement +from eva.parser.load_statement import LoadDataStatement +from eva.parser.upload_statement import UploadStatement +from eva.parser.insert_statement import InsertTableStatement -from src.expression.abstract_expression import ExpressionType -from src.expression.tuple_value_expression import TupleValueExpression -from src.expression.constant_value_expression import ConstantValueExpression +from eva.expression.abstract_expression import ExpressionType +from eva.expression.tuple_value_expression import TupleValueExpression +from eva.expression.constant_value_expression import ConstantValueExpression -from src.parser.table_ref import TableRef, TableInfo -from src.parser.types import ParserOrderBySortType -from src.catalog.column_type import ColumnType, NdArrayType +from eva.parser.table_ref import TableRef, TableInfo +from eva.parser.types import ParserOrderBySortType +from eva.catalog.column_type import ColumnType, NdArrayType from pathlib import Path diff --git a/test/parser/test_parser_visitor.py b/test/parser/test_parser_visitor.py index 5badbed18..37ac7c5ef 100644 --- a/test/parser/test_parser_visitor.py +++ b/test/parser/test_parser_visitor.py @@ -20,12 +20,12 @@ from unittest import mock from unittest.mock import MagicMock, call -from src.models.storage.batch import Batch -from src.parser.parser_visitor import ParserVisitor -from src.parser.evaql.evaql_parser import evaql_parser -from src.expression.abstract_expression import ExpressionType -from src.expression.function_expression import ExecutionMode -from src.parser.table_ref import TableRef +from eva.models.storage.batch import Batch +from eva.parser.parser_visitor import ParserVisitor +from eva.parser.evaql.evaql_parser import evaql_parser +from eva.expression.abstract_expression import ExpressionType +from eva.expression.function_expression import ExecutionMode +from eva.parser.table_ref import TableRef from antlr4 import TerminalNode @@ -251,7 +251,7 @@ def test_visit_query_specification_base_exception(self): ################################################################## @mock.patch.object(ParserVisitor, 'visit') - @mock.patch('src.parser.parser_visitor._functions.FunctionExpression') + @mock.patch('eva.parser.parser_visitor._functions.FunctionExpression') def test_visit_udf_function_call(self, func_mock, visit_mock): ctx = MagicMock() udf_name = 'name' @@ -293,7 +293,7 @@ def test_visit_function_args(self, visit_mock): self.assertEqual(actual, [1, 2]) @mock.patch.object(ParserVisitor, 'visit') - @mock.patch('src.parser.parser_visitor._functions.CreateUDFStatement') + @mock.patch('eva.parser.parser_visitor._functions.CreateUDFStatement') def test_visit_create_udf(self, create_udf_mock, visit_mock): ctx = MagicMock() ctx.children = [MagicMock() for i in range(5)] @@ -342,7 +342,7 @@ def side_effect(arg): # LOAD DATA Statement ################################################################## @mock.patch.object(ParserVisitor, 'visit') - @mock.patch('src.parser.parser_visitor._load_statement.LoadDataStatement') + @mock.patch('eva.parser.parser_visitor._load_statement.LoadDataStatement') def test_visit_load_statement(self, mock_load, mock_visit): ctx = MagicMock() table = 'myVideo' diff --git a/test/planner/test_plan.py b/test/planner/test_plan.py index 89e0a5bbc..751f0b64a 100644 --- a/test/planner/test_plan.py +++ b/test/planner/test_plan.py @@ -13,18 +13,18 @@ # See the License for the specific language governing permissions and # limitations under the License. import unittest -from src.parser.table_ref import TableRef, TableInfo -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.column_type import ColumnType -from src.catalog.catalog_manager import CatalogManager +from eva.parser.table_ref import TableRef, TableInfo +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.column_type import ColumnType +from eva.catalog.catalog_manager import CatalogManager -from src.planner.create_plan import CreatePlan -from src.planner.insert_plan import InsertPlan -from src.planner.create_udf_plan import CreateUDFPlan -from src.planner.load_data_plan import LoadDataPlan -from src.planner.upload_plan import UploadPlan -from src.planner.union_plan import UnionPlan -from src.planner.types import PlanOprType +from eva.planner.create_plan import CreatePlan +from eva.planner.insert_plan import InsertPlan +from eva.planner.create_udf_plan import CreateUDFPlan +from eva.planner.load_data_plan import LoadDataPlan +from eva.planner.upload_plan import UploadPlan +from eva.planner.union_plan import UnionPlan +from eva.planner.types import PlanOprType class PlanNodeTests(unittest.TestCase): diff --git a/test/readers/test_opencv_reader.py b/test/readers/test_opencv_reader.py index c2758e52b..bcef6b721 100644 --- a/test/readers/test_opencv_reader.py +++ b/test/readers/test_opencv_reader.py @@ -15,7 +15,7 @@ import os import unittest -from src.readers.opencv_reader import OpenCVReader +from eva.readers.opencv_reader import OpenCVReader from test.util import create_sample_video from test.util import create_dummy_batches diff --git a/test/readers/test_petastorm_reader.py b/test/readers/test_petastorm_reader.py index 3e1dc2da3..2833369fe 100644 --- a/test/readers/test_petastorm_reader.py +++ b/test/readers/test_petastorm_reader.py @@ -17,8 +17,8 @@ import os import numpy as np -from src.readers.petastorm_reader import PetastormReader -from src.configuration.configuration_manager import ConfigurationManager +from eva.readers.petastorm_reader import PetastormReader +from eva.configuration.configuration_manager import ConfigurationManager from test.util import PATH_PREFIX @@ -46,7 +46,7 @@ def __iter__(self): def __exit__(self, exc_type, exc_val, exc_tb): pass - @patch("src.readers.petastorm_reader.make_reader") + @patch("eva.readers.petastorm_reader.make_reader") def test_should_call_petastorm_make_reader_with_correct_params(self, mock): petastorm_reader = PetastormReader( @@ -66,7 +66,7 @@ def test_should_call_petastorm_make_reader_with_correct_params(self, cache_size_limit=None, cache_row_size_estimate=None) - @patch("src.readers.petastorm_reader.make_reader") + @patch("eva.readers.petastorm_reader.make_reader") def test_should_call_petastorm_make_reader_with_negative_shards(self, mock): petastorm_reader = PetastormReader( @@ -88,7 +88,7 @@ def test_should_call_petastorm_make_reader_with_negative_shards(self, cache_size_limit=petastorm_config.get('cache_size_limit', None), cache_type=petastorm_config.get('cache_type', None)) - @patch("src.readers.petastorm_reader.make_reader") + @patch("eva.readers.petastorm_reader.make_reader") def test_should_read_data_using_petastorm_reader(self, mock): petastorm_reader = PetastormReader( file_url=os.path.join(PATH_PREFIX, 'dummy.avi'), diff --git a/test/server/test_async_protocol.py b/test/server/test_async_protocol.py index 243860b72..b80657195 100644 --- a/test/server/test_async_protocol.py +++ b/test/server/test_async_protocol.py @@ -17,7 +17,7 @@ from mock import patch from unittest.mock import MagicMock -from src.server.async_protocol import EvaProtocolBuffer, EvaClient +from eva.server.async_protocol import EvaProtocolBuffer, EvaClient class AsyncProtocolTests(unittest.TestCase): @@ -76,7 +76,7 @@ def test_read_message_two(self): self.assertEqual('', buf.buf) self.assertEqual(-1, buf.expected_length) - @patch('src.server.async_protocol.set_socket_io_timeouts') + @patch('eva.server.async_protocol.set_socket_io_timeouts') def test_connection_made_time_out(self, mock_set): client = EvaClient() t = MagicMock() @@ -86,7 +86,7 @@ def test_connection_made_time_out(self, mock_set): mock_set.assert_called_once_with(t, 60, 0) t.abort.assert_called_once_with() - @patch('src.server.async_protocol.set_socket_io_timeouts') + @patch('eva.server.async_protocol.set_socket_io_timeouts') def test_connection_made_no_time_out(self, mock_set): client = EvaClient() t = MagicMock() diff --git a/test/server/test_command_handler.py b/test/server/test_command_handler.py index 114aee44e..996dd8360 100644 --- a/test/server/test_command_handler.py +++ b/test/server/test_command_handler.py @@ -18,7 +18,7 @@ from unittest.mock import MagicMock -from src.server.command_handler import handle_request +from eva.server.command_handler import handle_request class CommandHandlerTests(unittest.TestCase): diff --git a/test/server/test_db_api.py b/test/server/test_db_api.py index 9e4909693..33390619b 100644 --- a/test/server/test_db_api.py +++ b/test/server/test_db_api.py @@ -18,8 +18,8 @@ import asyncio from unittest.mock import MagicMock -from src.server.db_api import EVACursor -from src.models.server.response import Response +from eva.server.db_api import EVACursor +from eva.models.server.response import Response class AsyncMock(MagicMock): diff --git a/test/server/test_interpreter.py b/test/server/test_interpreter.py index bbba3b98f..d5664fbf4 100644 --- a/test/server/test_interpreter.py +++ b/test/server/test_interpreter.py @@ -19,7 +19,7 @@ from mock import patch from unittest.mock import MagicMock -from src.server.interpreter import EvaCommandInterpreter, start_cmd_client +from eva.server.interpreter import EvaCommandInterpreter, start_cmd_client class InterpreterTests(unittest.TestCase): @@ -41,7 +41,7 @@ def test_cmd_exit_should_return_true(self): self.assertEqual(SystemExit, prompt.do_quit(None)) self.assertEqual(SystemExit, prompt.do_exit(None)) - @patch('src.server.interpreter.EvaCommandInterpreter.emptyline') + @patch('eva.server.interpreter.EvaCommandInterpreter.emptyline') def test_onecmd_with_emptyline(self, mock_emptyline): prompt = EvaCommandInterpreter() mock_emptyline.return_value = False @@ -69,8 +69,8 @@ def test_onecmd_with_do_query(self): # We are mocking the connect funciton call that gets imported into # interpreter instead of the one in db_api. - @patch('src.server.interpreter.connect') - @patch('src.server.interpreter.EvaCommandInterpreter.cmdloop') + @patch('eva.server.interpreter.connect') + @patch('eva.server.interpreter.EvaCommandInterpreter.cmdloop') def test_start_cmd_client(self, mock_cmdloop, mock_connect): class MOCKCONNECTION: def cursor(self): diff --git a/test/server/test_server.py b/test/server/test_server.py index ecf003c19..a8b7257c0 100644 --- a/test/server/test_server.py +++ b/test/server/test_server.py @@ -21,8 +21,8 @@ from unittest.mock import MagicMock -from src.server.server import start_server -from src.server.server import EvaServer +from eva.server.server import start_server +from eva.server.server import EvaServer from concurrent.futures import CancelledError diff --git a/test/spark/test_session.py b/test/spark/test_session.py index 2b7f569bd..6f5caa878 100644 --- a/test/spark/test_session.py +++ b/test/spark/test_session.py @@ -16,7 +16,7 @@ from pyspark.sql import SparkSession -from src.spark.session import Session +from eva.spark.session import Session class SparkSessionTest(unittest.TestCase): diff --git a/test/storage/test_petastorm_storage_engine.py b/test/storage/test_petastorm_storage_engine.py index 9d01fff6a..8a07b4a78 100644 --- a/test/storage/test_petastorm_storage_engine.py +++ b/test/storage/test_petastorm_storage_engine.py @@ -15,10 +15,10 @@ import shutil import unittest -from src.catalog.models.df_metadata import DataFrameMetadata -from src.storage.petastorm_storage_engine import PetastormStorageEngine -from src.catalog.models.df_column import DataFrameColumn -from src.catalog.column_type import ColumnType, NdArrayType +from eva.catalog.models.df_metadata import DataFrameMetadata +from eva.storage.petastorm_storage_engine import PetastormStorageEngine +from eva.catalog.models.df_column import DataFrameColumn +from eva.catalog.column_type import ColumnType, NdArrayType from test.util import create_dummy_batches from test.util import NUM_FRAMES diff --git a/test/test_eva_cmd_client.py b/test/test_eva_cmd_client.py new file mode 100644 index 000000000..e977740ba --- /dev/null +++ b/test/test_eva_cmd_client.py @@ -0,0 +1,42 @@ +# coding=utf-8 +# Copyright 2018-2020 EVA +# +# 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. + +import unittest +import mock +import sys + + +class CMDClientTest(unittest.TestCase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @mock.patch('eva.eva_cmd_client.eva_client') + def test_main(self, mock_client): + from eva.eva_cmd_client import main + with mock.patch.object(sys, 'argv', ['test']): + main() + mock_client.called_once_with('0.0.0.0', 5432) + + def test_parse_args(self): + from eva.eva_cmd_client import parse_args + args = parse_args(['-P', '2345', '-H', 'test']) + self.assertEqual(args.host, 'test') + self.assertEqual(args.port, 2345) + + @mock.patch('eva.server.interpreter.start_cmd_client') + def test_eva_client(self, mock_client): + from eva.eva_cmd_client import eva_client + eva_client() + mock_client.assert_called_once() diff --git a/test/test_eva_server.py b/test/test_eva_server.py new file mode 100644 index 000000000..7fccf1459 --- /dev/null +++ b/test/test_eva_server.py @@ -0,0 +1,49 @@ +# coding=utf-8 +# Copyright 2018-2020 EVA +# +# 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. + +import unittest +from mock import MagicMock, patch + +from eva.eva_server import main, eva + + +class EVAServerTest(unittest.TestCase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @patch('eva.eva_server.init_builtin_udfs') + @patch('eva.eva_server.eva') + @patch('eva.eva_server.ConfigurationManager') + def test_main(self, mock_config, mock_eva, mock_udfs): + mock_obj_1 = MagicMock() + mock_config.return_value.get_value = mock_obj_1 + main() + mock_obj_1.assert_called_with('core', 'mode') + mock_udfs.assert_called_with(mode=mock_obj_1()) + mock_eva.assert_called_once() + + @patch('eva.eva_server.ConfigurationManager') + @patch('asyncio.new_event_loop') + @patch('asyncio.run') + def test_eva(self, mock_run, mock_new_event_loop, mock_config): + mock_obj_1 = MagicMock() + mock_obj_2 = MagicMock() + mock_config.return_value.get_value = mock_obj_1 + mock_new_event_loop.return_value.create_future = mock_obj_2 + eva() + self.assertEqual(mock_obj_1.call_count, 3) + mock_new_event_loop.assert_called_once() + mock_obj_2.assert_called_once() + mock_run.assert_called_once() diff --git a/test/udfs/ndarray_udfs/test_array_count.py b/test/udfs/ndarray_udfs/test_array_count.py index a1bf0d6e0..78173284d 100644 --- a/test/udfs/ndarray_udfs/test_array_count.py +++ b/test/udfs/ndarray_udfs/test_array_count.py @@ -15,9 +15,9 @@ import unittest import pandas as pd -from src.catalog.catalog_manager import CatalogManager -from src.models.storage.batch import Batch -from src.server.command_handler import execute_query_fetch_all +from eva.catalog.catalog_manager import CatalogManager +from eva.models.storage.batch import Batch +from eva.server.command_handler import execute_query_fetch_all from test.util import create_sample_video, load_inbuilt_udfs, file_remove from test.util import NUM_FRAMES diff --git a/test/udfs/ndarray_udfs/test_unnest.py b/test/udfs/ndarray_udfs/test_unnest.py index c019b39bd..eeef3f017 100644 --- a/test/udfs/ndarray_udfs/test_unnest.py +++ b/test/udfs/ndarray_udfs/test_unnest.py @@ -16,10 +16,10 @@ import pandas as pd import numpy as np -from src.catalog.catalog_manager import CatalogManager -from src.models.storage.batch import Batch -from src.server.command_handler import execute_query_fetch_all -from src.udfs.ndarray_udfs.unnest import Unnest +from eva.catalog.catalog_manager import CatalogManager +from eva.models.storage.batch import Batch +from eva.server.command_handler import execute_query_fetch_all +from eva.udfs.ndarray_udfs.unnest import Unnest from test.util import create_sample_video, load_inbuilt_udfs, file_remove from test.util import NUM_FRAMES diff --git a/test/udfs/test_fastrcnn_object_detector.py b/test/udfs/test_fastrcnn_object_detector.py index cd036723d..ab24b8fa4 100644 --- a/test/udfs/test_fastrcnn_object_detector.py +++ b/test/udfs/test_fastrcnn_object_detector.py @@ -18,8 +18,8 @@ import cv2 import pandas as pd -from src.models.storage.batch import Batch -from src.udfs.fastrcnn_object_detector import FastRCNNObjectDetector +from eva.models.storage.batch import Batch +from eva.udfs.fastrcnn_object_detector import FastRCNNObjectDetector NUM_FRAMES = 10 diff --git a/test/util.py b/test/util.py index 3192a2b38..2e8a1bbd0 100644 --- a/test/util.py +++ b/test/util.py @@ -18,12 +18,12 @@ import os import shutil -from src.models.storage.batch import Batch -from src.models.catalog.frame_info import FrameInfo -from src.models.catalog.properties import ColorSpace -from src.udfs.abstract_udfs import AbstractClassifierUDF -from src.udfs.udf_bootstrap_queries import init_builtin_udfs -from src.configuration.configuration_manager import ConfigurationManager +from eva.models.storage.batch import Batch +from eva.models.catalog.frame_info import FrameInfo +from eva.models.catalog.properties import ColorSpace +from eva.udfs.abstract_udfs import AbstractClassifierUDF +from eva.udfs.udf_bootstrap_queries import init_builtin_udfs +from eva.configuration.configuration_manager import ConfigurationManager NUM_FRAMES = 10 diff --git a/test/utils/test_generic_utils.py b/test/utils/test_generic_utils.py index c7f91aec2..57b504a23 100644 --- a/test/utils/test_generic_utils.py +++ b/test/utils/test_generic_utils.py @@ -17,30 +17,30 @@ from mock import patch, MagicMock from pathlib import Path -from src.utils.generic_utils import (str_to_class, path_to_class, +from eva.utils.generic_utils import (str_to_class, path_to_class, is_gpu_available, generate_file_path) -from src.readers.opencv_reader import OpenCVReader +from eva.readers.opencv_reader import OpenCVReader class ModulePathTest(unittest.TestCase): def test_should_return_correct_class_for_string(self): - vl = str_to_class('src.readers.opencv_reader.OpenCVReader') + vl = str_to_class('eva.readers.opencv_reader.OpenCVReader') self.assertEqual(vl, OpenCVReader) @unittest.skip('This returns opecv_reader.OpenCVReader \ - instead of src.readers.opencv_reader.OpenCVReader') + instead of eva.readers.opencv_reader.OpenCVReader') def test_should_return_correct_class_for_path(self): - vl = path_to_class('src/readers/opencv_reader.py', 'OpenCVReader') + vl = path_to_class('eva/readers/opencv_reader.py', 'OpenCVReader') self.assertEqual(vl, OpenCVReader) - @patch('src.utils.generic_utils.torch') + @patch('eva.utils.generic_utils.torch') def test_should_use_torch_to_check_if_gpu_is_available(self, torch): is_gpu_available() torch.cuda.is_available.assert_called() - @patch('src.utils.generic_utils.ConfigurationManager') + @patch('eva.utils.generic_utils.ConfigurationManager') def test_should_return_a_randon_full_path(self, mock_conf): mock_conf_inst = MagicMock() mock_conf.return_value = mock_conf_inst diff --git a/test/utils/test_logging_manager.py b/test/utils/test_logging_manager.py index 10addbb88..83d0584d0 100644 --- a/test/utils/test_logging_manager.py +++ b/test/utils/test_logging_manager.py @@ -14,8 +14,8 @@ # limitations under the License. import unittest -from src.utils.logging_manager import LoggingManager -from src.utils.logging_manager import LoggingLevel +from eva.utils.logging_manager import LoggingManager +from eva.utils.logging_manager import LoggingLevel class LoggingManagerTests(unittest.TestCase):