115 lines
3.8 KiB
Plaintext
115 lines
3.8 KiB
Plaintext
|
|
{
|
||
|
|
"cells": [
|
||
|
|
{
|
||
|
|
"cell_type": "code",
|
||
|
|
"execution_count": null,
|
||
|
|
"metadata": {},
|
||
|
|
"outputs": [],
|
||
|
|
"source": [
|
||
|
|
"\"\"\"\n",
|
||
|
|
"The module optimize_query contains a function which sends the query\n",
|
||
|
|
"to Optimizer to be optimized and returns the optimized query back.\n",
|
||
|
|
"\"\"\"\n",
|
||
|
|
"import asyncio\n",
|
||
|
|
"import nest_asyncio\n",
|
||
|
|
"nest_asyncio.apply()\n",
|
||
|
|
"\n",
|
||
|
|
"from libs_pkg.exception_handler import *\n",
|
||
|
|
"\n",
|
||
|
|
"async def opt_comm_exec(reader, writer, query, db_name, flag):\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" This function sends the query to Optimizer to be optimized and returns the optimized query back.\n",
|
||
|
|
" \n",
|
||
|
|
" :param reader: The stream reader of the connection to Optimizer.\n",
|
||
|
|
" :param writer: The stream writer of the connection to Optimizer.\n",
|
||
|
|
" :param query: The query to be optimized given as string.\n",
|
||
|
|
" :param db_name: The The currently open database related to the given query.\n",
|
||
|
|
" :param flag: The boolean value that shows if the command should be executed by optimizer (True) or should be optimized (False).\n",
|
||
|
|
" \n",
|
||
|
|
" :return: The optimized query as string.\n",
|
||
|
|
" \"\"\"\n",
|
||
|
|
" \n",
|
||
|
|
" if reader == None or writer == None:\n",
|
||
|
|
" raise SecondoAPI_Error('Connection to Optimizer reset.')\n",
|
||
|
|
" else:\n",
|
||
|
|
" \n",
|
||
|
|
" #execute query\n",
|
||
|
|
" if flag:\n",
|
||
|
|
" writer.write(b'<execute>\\n')\n",
|
||
|
|
" \n",
|
||
|
|
" #optimize query\n",
|
||
|
|
" else: \n",
|
||
|
|
" writer.write(b'<optimize>\\n')\n",
|
||
|
|
" \n",
|
||
|
|
" writer.write(b'<database>\\n')\n",
|
||
|
|
" db_name += \"\\n\"\n",
|
||
|
|
" writer.write(db_name.encode())\n",
|
||
|
|
" \n",
|
||
|
|
" writer.write(b'</database>\\n')\n",
|
||
|
|
" \n",
|
||
|
|
" writer.write(b'<query>\\n')\n",
|
||
|
|
" query += \"\\n\"\n",
|
||
|
|
" writer.write(query.encode())\n",
|
||
|
|
" \n",
|
||
|
|
" writer.write(b'</query>\\n')\n",
|
||
|
|
" \n",
|
||
|
|
" if flag:\n",
|
||
|
|
" writer.write(b'</execute>\\n')\n",
|
||
|
|
" \n",
|
||
|
|
" else: \n",
|
||
|
|
" writer.write(b'</optimize>\\n')\n",
|
||
|
|
" \n",
|
||
|
|
" await writer.drain()\n",
|
||
|
|
" \n",
|
||
|
|
" res = await reader.readline()\n",
|
||
|
|
" res = res.decode()\n",
|
||
|
|
" if not res:\n",
|
||
|
|
" raise SecondoAPI_Error(\"Connection to Optimizer is broken.\")\n",
|
||
|
|
" if res != \"<answer>\\n\":\n",
|
||
|
|
" raise SecondoError(\"Wrong Data received from Optimizer.\")\n",
|
||
|
|
" res = await reader.readline()\n",
|
||
|
|
" res = res.decode()\n",
|
||
|
|
" if not res:\n",
|
||
|
|
" raise SecondoAPI_Error('Connection to Optimizer is broken.')\n",
|
||
|
|
" opt_res = \"\"\n",
|
||
|
|
" count = 3\n",
|
||
|
|
" while res != \"</answer>\\n\":\n",
|
||
|
|
" if flag:\n",
|
||
|
|
" opt_res += res\n",
|
||
|
|
" else:\n",
|
||
|
|
" opt_res += res.replace(\" \\n\", \"\")\n",
|
||
|
|
" res = await reader.readline()\n",
|
||
|
|
" res = res.decode()\n",
|
||
|
|
" count += 1\n",
|
||
|
|
" if not res:\n",
|
||
|
|
" raise SecondoAPI_Error('Connection to Optimizer is broken.')\n",
|
||
|
|
" \n",
|
||
|
|
" if opt_res == \"\":\n",
|
||
|
|
" raise SecondoAPI_Error('Optimization failed due to some Errors in the query.')\n",
|
||
|
|
" return opt_res"
|
||
|
|
]
|
||
|
|
}
|
||
|
|
],
|
||
|
|
"metadata": {
|
||
|
|
"kernelspec": {
|
||
|
|
"display_name": "Python 3",
|
||
|
|
"language": "python",
|
||
|
|
"name": "python3"
|
||
|
|
},
|
||
|
|
"language_info": {
|
||
|
|
"codemirror_mode": {
|
||
|
|
"name": "ipython",
|
||
|
|
"version": 3
|
||
|
|
},
|
||
|
|
"file_extension": ".py",
|
||
|
|
"mimetype": "text/x-python",
|
||
|
|
"name": "python",
|
||
|
|
"nbconvert_exporter": "python",
|
||
|
|
"pygments_lexer": "ipython3",
|
||
|
|
"version": "3.7.4"
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"nbformat": 4,
|
||
|
|
"nbformat_minor": 2
|
||
|
|
}
|