|
46 | 46 | "metadata": {},
|
47 | 47 | "outputs": [],
|
48 | 48 | "source": [
|
49 |
| - "_ = load_dotenv(find_dotenv())\n", |
| 49 | + "_ = load_dotenv(find_dotenv(), override=True)\n", |
50 | 50 | "service_url = os.environ['TIMESCALE_SERVICE_URL']"
|
51 | 51 | ]
|
52 | 52 | },
|
|
455 | 455 | " operator = self.operators_mapping[operator]\n",
|
456 | 456 | " else:\n",
|
457 | 457 | " raise ValueError(\"Invalid clause format\")\n",
|
458 |
| - " \n", |
| 458 | + "\n", |
| 459 | + " index = len(params)+1\n", |
| 460 | + " param_name = f\"${index}\"\n", |
| 461 | + "\n", |
| 462 | + " if field == '__uuid_timestamp':\n", |
| 463 | + " #convert str to timestamp in the database, it's better at it than python\n", |
| 464 | + " if isinstance(value, str):\n", |
| 465 | + " where_conditions.append(f\"uuid_timestamp(id) {operator} ({param_name}::text)::timestamptz\")\n", |
| 466 | + " else:\n", |
| 467 | + " where_conditions.append(f\"uuid_timestamp(id) {operator} {param_name}\")\n", |
| 468 | + " params.append(value)\n", |
| 469 | + " continue\n", |
| 470 | + "\n", |
459 | 471 | " field_cast = ''\n",
|
460 | 472 | " if isinstance(value, int):\n",
|
461 | 473 | " field_cast = '::int'\n",
|
462 | 474 | " elif isinstance(value, float):\n",
|
463 | 475 | " field_cast = '::numeric' \n",
|
464 | 476 | "\n",
|
465 |
| - " index = len(params)+1\n", |
466 |
| - " param_name = f\"${index}\"\n", |
467 | 477 | " where_conditions.append(f\"(metadata->>'{field}'){field_cast} {operator} {param_name}\")\n",
|
468 | 478 | " params.append(value) \n",
|
469 | 479 | "\n",
|
|
830 | 840 | "text/markdown": [
|
831 | 841 | "---\n",
|
832 | 842 | "\n",
|
833 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L321){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 843 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L475){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
834 | 844 | "\n",
|
835 | 845 | "### QueryBuilder.get_create_query\n",
|
836 | 846 | "\n",
|
|
841 | 851 | "text/plain": [
|
842 | 852 | "---\n",
|
843 | 853 | "\n",
|
844 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L321){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 854 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L475){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
845 | 855 | "\n",
|
846 | 856 | "### QueryBuilder.get_create_query\n",
|
847 | 857 | "\n",
|
|
1137 | 1147 | "text/markdown": [
|
1138 | 1148 | "---\n",
|
1139 | 1149 | "\n",
|
1140 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L653){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1150 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L843){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1141 | 1151 | "\n",
|
1142 | 1152 | "### Async.create_tables\n",
|
1143 | 1153 | "\n",
|
|
1148 | 1158 | "text/plain": [
|
1149 | 1159 | "---\n",
|
1150 | 1160 | "\n",
|
1151 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L653){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1161 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L843){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1152 | 1162 | "\n",
|
1153 | 1163 | "### Async.create_tables\n",
|
1154 | 1164 | "\n",
|
|
1176 | 1186 | "text/markdown": [
|
1177 | 1187 | "---\n",
|
1178 | 1188 | "\n",
|
1179 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L653){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1189 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L843){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1180 | 1190 | "\n",
|
1181 | 1191 | "### Async.create_tables\n",
|
1182 | 1192 | "\n",
|
|
1187 | 1197 | "text/plain": [
|
1188 | 1198 | "---\n",
|
1189 | 1199 | "\n",
|
1190 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L653){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1200 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L843){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1191 | 1201 | "\n",
|
1192 | 1202 | "### Async.create_tables\n",
|
1193 | 1203 | "\n",
|
|
1227 | 1237 | "text/markdown": [
|
1228 | 1238 | "---\n",
|
1229 | 1239 | "\n",
|
1230 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L753){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1240 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L944){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1231 | 1241 | "\n",
|
1232 | 1242 | "### Async.search\n",
|
1233 | 1243 | "\n",
|
|
1250 | 1260 | "text/plain": [
|
1251 | 1261 | "---\n",
|
1252 | 1262 | "\n",
|
1253 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L753){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1263 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L944){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1254 | 1264 | "\n",
|
1255 | 1265 | "### Async.search\n",
|
1256 | 1266 | "\n",
|
|
1490 | 1500 | " (uuid_from_time(specific_datetime), {\"key\": \"val\"}, \"the brown fox\", [1.0, 1.2])\n",
|
1491 | 1501 | "])\n",
|
1492 | 1502 | "assert not await vec.table_is_empty()\n",
|
1493 |
| - "rec = await vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(specific_datetime-timedelta(days=7), specific_datetime+timedelta(days=7)))\n", |
1494 |
| - "assert len(rec) == 1\n", |
1495 |
| - "rec = await vec.search([1.0, 2.0], limit=4, filter={\"__start_date\": specific_datetime-timedelta(days=7), \"__end_date\": specific_datetime+timedelta(days=7)})\n", |
1496 |
| - "assert len(rec) == 1\n", |
1497 |
| - "rec = await vec.search([1.0, 2.0], limit=4, filter={\"__start_date\": str(specific_datetime-timedelta(days=7)), \"__end_date\": str(specific_datetime+timedelta(days=7))})\n", |
1498 |
| - "assert len(rec) == 1\n", |
1499 |
| - "rec = await vec.search([1.0, 2.0], limit=4, filter={\"__start_date\": str(specific_datetime-timedelta(days=7))})\n", |
1500 |
| - "assert len(rec) == 2\n", |
1501 |
| - "rec = await vec.search([1.0, 2.0], limit=4, filter={\"__end_date\": str(specific_datetime+timedelta(days=7))})\n", |
1502 |
| - "assert len(rec) == 1\n", |
1503 |
| - "rec = await vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(specific_datetime-timedelta(days=7), specific_datetime-timedelta(days=2)))\n", |
1504 |
| - "assert len(rec) == 0\n", |
1505 |
| - "rec = await vec.search([1.0, 2.0], limit=4, filter={\"__start_date\": specific_datetime-timedelta(days=7), \"__end_date\": specific_datetime-timedelta(days=2)})\n", |
1506 |
| - "assert len(rec) == 0\n", |
1507 |
| - "rec = await vec.search([1.0, 2.0], limit=4, filter={\"__start_date\": str(specific_datetime-timedelta(days=7)), \"__end_date\": str(specific_datetime-timedelta(days=2))})\n", |
1508 |
| - "assert len(rec) == 0\n", |
1509 |
| - "rec = await vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(specific_datetime-timedelta(days=7)))\n", |
1510 |
| - "assert len(rec) == 2\n", |
| 1503 | + "\n", |
| 1504 | + "#check all the possible ways to specify a date range\n", |
| 1505 | + "async def search_date(start_date, end_date, expected):\n", |
| 1506 | + " #using uuid_time_filter\n", |
| 1507 | + " rec = await vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(start_date, end_date))\n", |
| 1508 | + " assert len(rec) == expected\n", |
| 1509 | + " \n", |
| 1510 | + " #using filters\n", |
| 1511 | + " filter = {}\n", |
| 1512 | + " if start_date is not None:\n", |
| 1513 | + " filter[\"__start_date\"] = start_date\n", |
| 1514 | + " if end_date is not None:\n", |
| 1515 | + " filter[\"__end_date\"] = end_date\n", |
| 1516 | + " rec = await vec.search([1.0, 2.0], limit=4, filter=filter)\n", |
| 1517 | + " assert len(rec) == expected\n", |
| 1518 | + " #using filters with string dates\n", |
| 1519 | + " filter = {}\n", |
| 1520 | + " if start_date is not None:\n", |
| 1521 | + " filter[\"__start_date\"] = str(start_date)\n", |
| 1522 | + " if end_date is not None:\n", |
| 1523 | + " filter[\"__end_date\"] = str(end_date)\n", |
| 1524 | + " rec = await vec.search([1.0, 2.0], limit=4, filter=filter)\n", |
| 1525 | + " assert len(rec) == expected\n", |
| 1526 | + " #using predicates\n", |
| 1527 | + " predicates = []\n", |
| 1528 | + " if start_date is not None:\n", |
| 1529 | + " predicates.append((\"__uuid_timestamp\", \">=\", start_date))\n", |
| 1530 | + " if end_date is not None:\n", |
| 1531 | + " predicates.append((\"__uuid_timestamp\", \"<\", end_date))\n", |
| 1532 | + " rec = await vec.search([1.0, 2.0], limit=4, predicates=Predicates(*predicates))\n", |
| 1533 | + " assert len(rec) == expected\n", |
| 1534 | + " #using predicates with string dates\n", |
| 1535 | + " predicates = []\n", |
| 1536 | + " if start_date is not None:\n", |
| 1537 | + " predicates.append((\"__uuid_timestamp\", \">=\", str(start_date)))\n", |
| 1538 | + " if end_date is not None:\n", |
| 1539 | + " predicates.append((\"__uuid_timestamp\", \"<\", str(end_date)))\n", |
| 1540 | + " rec = await vec.search([1.0, 2.0], limit=4, predicates=Predicates(*predicates))\n", |
| 1541 | + " assert len(rec) == expected\n", |
| 1542 | + "\n", |
| 1543 | + "await search_date(specific_datetime-timedelta(days=7), specific_datetime+timedelta(days=7), 1)\n", |
| 1544 | + "await search_date(specific_datetime-timedelta(days=7), None, 2)\n", |
| 1545 | + "await search_date(None, specific_datetime+timedelta(days=7), 1)\n", |
| 1546 | + "await search_date(specific_datetime-timedelta(days=7), specific_datetime-timedelta(days=2), 0)\n", |
| 1547 | + "\n", |
| 1548 | + "#check timedelta handling\n", |
1511 | 1549 | "rec = await vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(start_date=specific_datetime, time_delta=timedelta(days=7)))\n",
|
1512 | 1550 | "assert len(rec) == 1\n",
|
1513 | 1551 | "#end is exclusive\n",
|
|
1877 | 1915 | "text/markdown": [
|
1878 | 1916 | "---\n",
|
1879 | 1917 | "\n",
|
1880 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L955){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1918 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1147){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1881 | 1919 | "\n",
|
1882 | 1920 | "### Sync.create_tables\n",
|
1883 | 1921 | "\n",
|
|
1888 | 1926 | "text/plain": [
|
1889 | 1927 | "---\n",
|
1890 | 1928 | "\n",
|
1891 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L955){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1929 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1147){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1892 | 1930 | "\n",
|
1893 | 1931 | "### Sync.create_tables\n",
|
1894 | 1932 | "\n",
|
|
1916 | 1954 | "text/markdown": [
|
1917 | 1955 | "---\n",
|
1918 | 1956 | "\n",
|
1919 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L935){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1957 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1127){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1920 | 1958 | "\n",
|
1921 | 1959 | "### Sync.upsert\n",
|
1922 | 1960 | "\n",
|
|
1932 | 1970 | "text/plain": [
|
1933 | 1971 | "---\n",
|
1934 | 1972 | "\n",
|
1935 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L935){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 1973 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1127){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1936 | 1974 | "\n",
|
1937 | 1975 | "### Sync.upsert\n",
|
1938 | 1976 | "\n",
|
|
1965 | 2003 | "text/markdown": [
|
1966 | 2004 | "---\n",
|
1967 | 2005 | "\n",
|
1968 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1072){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 2006 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1262){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1969 | 2007 | "\n",
|
1970 | 2008 | "### Sync.search\n",
|
1971 | 2009 | "\n",
|
|
1988 | 2026 | "text/plain": [
|
1989 | 2027 | "---\n",
|
1990 | 2028 | "\n",
|
1991 |
| - "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1072){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
| 2029 | + "[source](https://github.com/timescale/python-vector/blob/main/timescale_vector/client.py#L1262){target=\"_blank\" style=\"float:right; font-size:smaller\"}\n", |
1992 | 2030 | "\n",
|
1993 | 2031 | "### Sync.search\n",
|
1994 | 2032 | "\n",
|
|
2205 | 2243 | " #time in 2018\n",
|
2206 | 2244 | " (uuid_from_time(specific_datetime), {\"key\": \"val\"}, \"the brown fox\", [1.0, 1.2])\n",
|
2207 | 2245 | "])\n",
|
| 2246 | + "\n", |
| 2247 | + "def search_date(start_date, end_date, expected):\n", |
| 2248 | + " #using uuid_time_filter\n", |
| 2249 | + " rec = vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(start_date, end_date))\n", |
| 2250 | + " assert len(rec) == expected\n", |
| 2251 | + " \n", |
| 2252 | + " #using filters\n", |
| 2253 | + " filter = {}\n", |
| 2254 | + " if start_date is not None:\n", |
| 2255 | + " filter[\"__start_date\"] = start_date\n", |
| 2256 | + " if end_date is not None:\n", |
| 2257 | + " filter[\"__end_date\"] = end_date\n", |
| 2258 | + " rec = vec.search([1.0, 2.0], limit=4, filter=filter)\n", |
| 2259 | + " assert len(rec) == expected\n", |
| 2260 | + " #using filters with string dates\n", |
| 2261 | + " filter = {}\n", |
| 2262 | + " if start_date is not None:\n", |
| 2263 | + " filter[\"__start_date\"] = str(start_date)\n", |
| 2264 | + " if end_date is not None:\n", |
| 2265 | + " filter[\"__end_date\"] = str(end_date)\n", |
| 2266 | + " rec = vec.search([1.0, 2.0], limit=4, filter=filter)\n", |
| 2267 | + " assert len(rec) == expected\n", |
| 2268 | + " #using predicates\n", |
| 2269 | + " predicates = []\n", |
| 2270 | + " if start_date is not None:\n", |
| 2271 | + " predicates.append((\"__uuid_timestamp\", \">=\", start_date))\n", |
| 2272 | + " if end_date is not None:\n", |
| 2273 | + " predicates.append((\"__uuid_timestamp\", \"<\", end_date))\n", |
| 2274 | + " rec = vec.search([1.0, 2.0], limit=4, predicates=Predicates(*predicates))\n", |
| 2275 | + " assert len(rec) == expected\n", |
| 2276 | + " #using predicates with string dates\n", |
| 2277 | + " predicates = []\n", |
| 2278 | + " if start_date is not None:\n", |
| 2279 | + " predicates.append((\"__uuid_timestamp\", \">=\", str(start_date)))\n", |
| 2280 | + " if end_date is not None:\n", |
| 2281 | + " predicates.append((\"__uuid_timestamp\", \"<\", str(end_date)))\n", |
| 2282 | + " rec = vec.search([1.0, 2.0], limit=4, predicates=Predicates(*predicates))\n", |
| 2283 | + " assert len(rec) == expected\n", |
| 2284 | + "\n", |
2208 | 2285 | "assert not vec.table_is_empty()\n",
|
2209 |
| - "rec = vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(specific_datetime-timedelta(days=7), specific_datetime+timedelta(days=7)))\n", |
2210 |
| - "assert len(rec) == 1\n", |
2211 |
| - "rec = vec.search([1.0, 2.0], limit=4, filter={\"__start_date\": specific_datetime-timedelta(days=7), \"__end_date\": specific_datetime+timedelta(days=7)})\n", |
2212 |
| - "assert len(rec) == 1\n", |
2213 |
| - "rec = vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(specific_datetime-timedelta(days=7), specific_datetime-timedelta(days=2)))\n", |
2214 |
| - "assert len(rec) == 0\n", |
2215 |
| - "rec = vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(specific_datetime-timedelta(days=7)))\n", |
2216 |
| - "assert len(rec) == 2\n", |
| 2286 | + "\n", |
| 2287 | + "search_date(specific_datetime-timedelta(days=7), specific_datetime+timedelta(days=7), 1)\n", |
| 2288 | + "search_date(specific_datetime-timedelta(days=7), None, 2)\n", |
| 2289 | + "search_date(None, specific_datetime+timedelta(days=7), 1)\n", |
| 2290 | + "search_date(specific_datetime-timedelta(days=7), specific_datetime-timedelta(days=2), 0)\n", |
| 2291 | + "\n", |
| 2292 | + "#check timedelta handling\n", |
2217 | 2293 | "rec = vec.search([1.0, 2.0], limit=4, uuid_time_filter=UUIDTimeRange(start_date=specific_datetime, time_delta=timedelta(days=7)))\n",
|
2218 | 2294 | "assert len(rec) == 1\n",
|
2219 | 2295 | "#end is exclusive\n",
|
|
0 commit comments