{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "091fd0f4",
   "metadata": {},
   "source": [
    "# Querying a track with SQL-like commands\n",
    "\n",
    "\n",
    "With ``Tracklib`` it is really easy and convenient to \"query\" a track with SQL-like commands. The output take the type of a n-dimensional array, a new track or quite simply a float value.\n",
    "\n",
    "To query a track, you have to write a text command in a language which strongly similar at SQL, and call the function ``query`` by passing the text as argument.\n",
    "\n",
    "For example, the query below, create a new *track* with only observations whose speed is under 0.5 m/s:\n",
    "\n",
    "<div class=\"alert alert-block alert-success\" style=\"padding-left:4em\">\n",
    "queryTxt  = ' SELECT * WHERE speed < 0.5 '\n",
    "    \n",
    "track2 = track.query(queryTxt)</div>\n",
    "        \n",
    "Note that the syntax is inspired by SQL, but is a little more restrictive."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9b44cef3",
   "metadata": {},
   "source": [
    "## Let's start by defining our environment\n",
    "\n",
    "1. The first task is only useful for the online notebook, we specify a new value of the PATH environment variable, the directory of *tracklib* library."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c301c476",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import sys\n",
    "\n",
    "# Import de tracklib\n",
    "module_path = os.path.abspath(os.path.join('../../..'))\n",
    "if module_path not in sys.path:\n",
    "    sys.path.append(module_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d8ae71c",
   "metadata": {},
   "source": [
    "2. Then, let's importing all necessary python library including *Tracklib* :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5af602f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import de la librairie tracklib\n",
    "import tracklib as trk\n",
    "\n",
    "# And others \n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "084c7559",
   "metadata": {},
   "source": [
    "## Loading a track for examples\n",
    "\n",
    "After loading the track, we add 3 analytical features (speed, heading and direction) to filter observation according to these criteria:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b75f70a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Warning: no reference point (base) provided for local projection to ENU coordinates. Arbitrarily used: [lon= 2.457019882, lat=48.830705099, hgt= 55.200]\n",
      "-------------------------------------\n",
      "GPS track #0 of user 0:\n",
      "-------------------------------------\n",
      "  Nb of pt(s):   190\n",
      "  Ref sys id   : ENU\n",
      "  Starting at  : 11/11/2020 15:39:54\n",
      "  Ending at    : 11/11/2020 15:52:00\n",
      "  Duration     : 726.000 s\n",
      "  Length       : 2412.144 m\n",
      "-------------------------------------\n",
      "\n",
      "['speed', 'heading', 'orientation']\n"
     ]
    }
   ],
   "source": [
    "# Load a track\n",
    "trk.ObsTime.setReadFormat(\"4Y-2M-2DT2h:2m:2sZ\")\n",
    "tracks = trk.TrackReader.readFromFile('../../../data/gpx/activity_5807084803.gpx', trk.TrackFormat({'ext': 'GPX'}))\n",
    "trace = tracks.getTrack(0)\n",
    "trace.toENUCoords()\n",
    "trace.summary()\n",
    "\n",
    "# Start AF computation\n",
    "trace.addAnalyticalFeature(trk.speed)\n",
    "trace.addAnalyticalFeature(trk.heading)\n",
    "trace.addAnalyticalFeature(trk.orientation)\n",
    "\n",
    "# Display available AFs for the track\n",
    "print (trace.getListAnalyticalFeatures())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cd134f9d",
   "metadata": {},
   "source": [
    "## General rules for querying track\n",
    "\n",
    "- The request will be written using SQL-like commands.\n",
    "- Only *SELECT* and *WHERE* clauses are available\n",
    "- SELECT is mandatory and WHERE is optional\n",
    "- Blank space must be used between every other words, symbols and operators\n",
    "- Capital letters must be used for SQL keywords SELECT, WHERE, AND, OR and aggregators \n",
    "\n",
    "**Fields**\n",
    "\n",
    "- All analytical features, x, y, z, t, and timestamp are available as fields\n",
    "- Fields are written without quotes. They must not contain blank spaces\n",
    "- \"t\" is time as integer in seconds since 1970/01/01 00:00:00\n",
    "- \"timestamp\" is ObsTime object\n",
    "\n",
    "**Aggregators**\n",
    "\n",
    "- All unary operators described in Operator.py, except MSE, are available. For now we have: SUM, AVG, VAR, COUNT, MEDIAN, ARGMIN, ARGMAX, MIN, MAX, MAD, RMSE, SEDDEV, ZEROS."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4cb4186b",
   "metadata": {},
   "source": [
    "##  ``SELECT`` clause\n",
    "\n",
    "Like SQL language, output depends on the select clause. \n",
    "\n",
    "### You get a new ``Track``\n",
    "\n",
    "If SELECT clause is followed by as star, output is a copied track of the original track (with all its AF hopefully)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b24cec87",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------\n",
      "GPS track #0 of user 0:\n",
      "-------------------------------------\n",
      "  Nb of pt(s):   190\n",
      "  Ref sys id   : ENU\n",
      "  Starting at  : 11/11/2020 15:39:54\n",
      "  Ending at    : 11/11/2020 15:52:00\n",
      "  Duration     : 726.000 s\n",
      "  Length       : 2412.144 m\n",
      "-------------------------------------\n",
      "Analytical feature(s):\n",
      " - speed\n",
      " - heading\n",
      " - orientation\n",
      "-------------------------------------\n",
      "\n"
     ]
    }
   ],
   "source": [
    "trace1 = trace.query(\"SELECT *\")\n",
    "trace1.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff116a08",
   "metadata": {},
   "source": [
    "### You get a (p x n)-dimensional array \n",
    "\n",
    "If SELECT clause is followed by a list of AF names like **SELECT f1, f2... fp**, then output is a (p x n)-dimensional array, with p = number of fields queried and n = number of observations selected by the WHERE conditions:\n",
    "\n",
    "OUTPUT[i][j] = f*i* for the j-th observation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "03428d86",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Speed for Obs(0): 6.255327113366183 Heading for Obs(0): -0.17391457626112597\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'heading for speed >= 5')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x144 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "tab = trace.query(\"SELECT speed, heading WHERE speed >= 5\")\n",
    "print ('Speed for Obs(0):', tab[0][0], 'Heading for Obs(0):', tab[1][0])\n",
    "\n",
    "# ======================================================================\n",
    "#    Display a boxplot for all dimension of the result\n",
    "plt.figure(figsize=(6, 2))\n",
    "plt.subplots_adjust(top=1.3, wspace=0.2, hspace=0.2)\n",
    "\n",
    "# Dimension speed\n",
    "ax1 = plt.subplot2grid((1, 2), (0, 0))\n",
    "ax1.boxplot(tab[0])\n",
    "ax1.set_title('speed for speed >= 5')\n",
    "\n",
    "# Dimension heading\n",
    "ax2 = plt.subplot2grid((1, 2), (0, 1))\n",
    "ax2.boxplot(tab[1])\n",
    "ax2.set_title('heading for speed >= 5')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "96482b0b",
   "metadata": {},
   "source": [
    "### You get a (1-p)-dimensional array\n",
    "\n",
    "If \"SELECT AGG1(f1), AGG2(f2)... AGGp(fp)\", with AGG1, AGG2,.. AGGp, a set of p aggregators, \n",
    "then output is a p-dimensional array, with on value for each aggregator\n",
    "\n",
    "Note that operators take as input only analytical feature names. Therefore, \"SELECT COUNT(*)\" syntax \n",
    "is not allowed and must be replaced equivalently by \"SELECT COUNT(f)\" with any AF name f."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "458ae8b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[14, 3.1897129536707767]\n"
     ]
    }
   ],
   "source": [
    "queryTxt  = \" SELECT COUNT(speed), AVG(speed) \"\n",
    "queryTxt += \" WHERE orientation = 1 \"\n",
    "    \n",
    "values = trace.query(queryTxt)\n",
    "print (values)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "51b3c66e",
   "metadata": {},
   "source": [
    "### You get a Float value\n",
    "\n",
    "If \"SELECT AGG(f)\", then output is the floating point value returned by the operator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "0b1549ec",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.696302107811199\n"
     ]
    }
   ],
   "source": [
    "value = trace.query(\"SELECT AVG(speed)\")\n",
    "print (value)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "770129b4",
   "metadata": {},
   "source": [
    "##  ``WHERE`` clause\n",
    "\n",
    "WHERE clause may contain as many conditions as needed, separated by OR/AND key words\n",
    "\n",
    "Parenthesis are not allowed within WHERE clause. Use boolean algebra rules to reformulate query without parenthesis: e.g. A AND (B OR C) = A AND B OR A AND C. Or use successive queries.\n",
    "\n",
    "Each condition must contain exactly 3 parts (separated by blank spaces) in this exact order:\n",
    "\t(1) the name of an analytical feature to test\n",
    "\t(2) a comparison operator among >, <, >=, <=, ==, != and LIKE (with % in str and timestamps)\n",
    "\t(3) a threshold value which is automatically casted to the type of the AF given in (1). Intended types accepted are: integers, floats, strings, boolean and GPSTime. When ObsTime is used as a threshold value, eventhough it may contain 2 parts (date and time), it must not be enclosed within quotes. For boolean, \"1\", \"T\" and \"TRUE\" are considered as logical True, all other values are considered as False. \n",
    "\n",
    "Important: no computation allowed in WHERE conditions. E.g. \"... WHERE z-2 > 10\" not allowed"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "163c6748",
   "metadata": {
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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93HXXXc5za1WFLVUWxa1fog757t77uuvv44777wTnTp1wpAhQ/DZZ5+hdu3aePLJJ93KK5G/MaAU49KlS1i8eDHatWuHqlWr2tY36N+/P3777Tf85z//KfLcTp06oVevXpg6dSouXbrk8bUvXryIX375xa3eUfZfzFYREREOM/fm5ubitddec1iDIiwszDa9+cmTJwEAjz/+OCZPnowhQ4Zg1apV2Lp1q23pU2t61jVCCs+oGxoa6vastNWrV3fKr6trFF6nxGQyuVwW2ZVq1aoBAM6ePYuzZ8/i/Pnzbp1nLz4+HiLisovw6dOnnZ5HYdWrVy/yXGv6RalatSpuueUWh2neiQIZBzYWY+XKlTh16hQ2bdrk8oP/6quvYvTo0UWe/9RTT6F169YuG8hL8uGHH9qWkvWGhIQEdOrUqcj1XaxTzC9atAjDhg1z+FVcuJ7fGuR+/vlnh+1XrlyxBaaysl6j8Hic/Px8/PLLL26l8cUXX+Crr77C66+/jnnz5uHJJ59Ehw4dMGTIEPzlL38pMRgARukvJSUFe/fuddr39ddflzhzbtOmTV22t3399ddITk5GTExMsee7W0olCgQsoRTj1VdfRVRUFNatW+e0xkF6ejo2bdqEH374ocjzrY3e06ZN8+jXcW5uLh577DHUqlXLYS3wsujVqxd2796Npk2bulyzxFpCuHDhgtOa9a+88orDY7PZjLp16zqV0JYuXeqwrGtZmM1mmM1mvPPOOw7b33vvPY+u0axZM0yfPh2HDx/G2rVr0aBBAzz66KOoVasW+vXr55S+K3369MGqVascqjg/++wzHDp0CH369Cnx3GPHjuGTTz6xbfv111+xcuXKEs/99ddfsWrVKtxwww0l5pEoIHja6BJst9I2yv/8888aGhqq6enpLvfv27dPAWhGRoaqOjfK2x9nMpmKnH47PT1dN2/erJs2bdKVK1fqE088oTVq1NCkpCTdsmVLifksahxKly5dHK536NAhveqqq7R169a6cOFC3bBhgy5btkwzMzN1xIgRtuPuuusujYyM1BdeeEE//PBDHTNmjDZs2FAB6CuvvGI7bsGCBbb8r1mzRp9//nmtU6eOVqtWza1G+bvvvtspzyg0hbi14fqvf/2rrlmzRufNm6fJyckaGxvrkGdPnT9/Xt944w3t2bOnmkymEo8/evSoJiQkaOfO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",
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "query  = \" SELECT * \"\n",
    "query += \" WHERE timestamp >= 2020-11-11 15:39:50 \"  \n",
    "query += \"   AND heading < 0.05 \"\n",
    "query += \"   AND speed >= 5 \"\n",
    "traceRapide = trace.query(query)\n",
    "\n",
    "plt.figure(figsize=(6, 6))\n",
    "trace.plot('ko', pointsize=3, append=True)\n",
    "traceRapide.plotAsMarkers(type=trk.MARKERS_TYPE_SPOT, append=True)\n",
    "\n",
    "plt.xlim([-120, 40])\n",
    "plt.ylim([-110, 90])\n",
    "plt.text(-118, 78, 'SELECT *', size=16)\n",
    "plt.text(-118, 68, 'WHERE timestamp ≥ 2020-11-11 15:40:50', size=15)\n",
    "plt.text(-118, 58, '  AND heading < 0.05 ', size=16)\n",
    "plt.text(-118, 48, '  AND speed ≥ 5', size=16)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
