Files
secondo/apis/python2/SecondoAPI/optimizer_pkg/optimize_query.ipynb
2026-01-23 17:03:45 +08:00

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
}