{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "e02ccafe-e04d-4312-acba-e41cf7b1c021", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/smgr/.pyenv/versions/co4/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] } ], "source": [ "import vegetables" ] }, { "cell_type": "markdown", "id": "c0914069-7f3c-4213-8d34-f7566033e054", "metadata": {}, "source": [ "## Development notes\n", "- No registry actually needs to take place if there's a default type2component map or one supplied on creation. Can just collect right out of the gate\n", "- Need connective function (type to collation) and attribute map. Do we need to this with a subclass? If a func is passed in on init, I can type it appropriately I guess `Callable[[type[CO3],str,str|None],dict]`" ] }, { "cell_type": "markdown", "id": "ef733715-bb75-4263-b216-45e778a06b21", "metadata": {}, "source": [ "## Usage\n", "The Mapper's primary job is to associate class hierarchies with database components. This can be done in a few ways:\n", "\n", "1. Manually attaching a type reference to a Component\n", "2. Attaching a type reference to a Component's name as registered in a schema\n", "3. Automatically register the CO3 heirarchy to matching schema component names (through transformation)" ] }, { "cell_type": "markdown", "id": "d2672422-3596-4eab-ac44-5da617f74b80", "metadata": {}, "source": [ "## Explicit example steps" ] }, { "cell_type": "code", "execution_count": 2, "id": "7d80f7b9-7458-4ad4-8c1a-3ea56e796b4e", "metadata": {}, "outputs": [], "source": [ "from co3 import Mapper\n", "\n", "vegetable_mapper = Mapper(\n", " vegetables.Vegetable,\n", " vegetables.vegetable_schema\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "id": "d24d31b4-c4a6-4a1e-8bea-c44378aadfdd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'\\nvegetable_mapper.attach(\\n vegetables.Vegetable,\\n vegetables.vegetable_table,\\n)\\n'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# not valid; tables need to be wrapped in CO3 Components\n", "'''\n", "vegetable_mapper.attach(\n", " vegetables.Vegetable,\n", " vegetables.vegetable_table,\n", ")\n", "'''" ] }, { "cell_type": "code", "execution_count": 4, "id": "f9408562-bf50-4522-909c-318557f85948", "metadata": {}, "outputs": [], "source": [ "# manually attach component\n", "vegetable_mapper.attach(\n", " vegetables.Tomato,\n", " vegetables.vegetable_schema.get_component('tomato'),\n", " coll_groups={\n", " 'aging': vegetables.vegetable_schema.get_component('tomato_aging_states'),\n", " 'cooking': vegetables.vegetable_schema.get_component('tomato_cooking_states'),\n", " },\n", ")" ] }, { "cell_type": "code", "execution_count": 5, "id": "05fdd404-87ee-4187-832f-2305272758ae", "metadata": {}, "outputs": [], "source": [ "# attach by name in schema\n", "vegetable_mapper.attach(\n", " vegetables.Tomato,\n", " 'tomato',\n", " coll_groups={\n", " 'aging': 'tomato_aging_states',\n", " 'cooking': 'tomato_cooking_states',\n", " },\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "id": "e9b6af49-a69d-41cc-beae-1b6f171cd2f5", "metadata": {}, "outputs": [], "source": [ "# attach entire type hierarchy w/ type->name map\n", "vegetable_mapper.attach_hierarchy(\n", " # this might make more sense during init\n", " vegetables.Vegetable,\n", " lambda x:x.__name__.lower()\n", ")" ] }, { "cell_type": "code", "execution_count": 9, "id": "0fb45a86-5c9b-41b1-a3ab-5691444f175e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vegetable_mapper.get_collation_comp(vegetables.Tomato, 'cooking')" ] }, { "cell_type": "code", "execution_count": 7, "id": "2e4336ab-5b5f-484d-815d-164d4b6f40a0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'co3_root': vegetables.Vegetable,\n", " 'schema': ,\n", " 'collector': ,\n", " 'composer': ,\n", " 'attribute_comps': {vegetables.Tomato: },\n", " 'collation_groups': defaultdict(dict,\n", " {vegetables.Tomato: {'aging': ,\n", " 'cooking': }})}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vars(vegetable_mapper)" ] }, { "cell_type": "markdown", "id": "47859e25-b803-4459-a581-f10bbcfac716", "metadata": {}, "source": [ "## Holistic attachment" ] }, { "cell_type": "code", "execution_count": 2, "id": "70c9baed-b870-4021-8949-9b713d863de6", "metadata": {}, "outputs": [], "source": [ "def attr_name_map(cls):\n", " return f'{cls.__name__.lower()}'\n", "\n", "def coll_name_map(cls, action_group):\n", " return f'{cls.__name__.lower()}_{action_group}_states'\n", "\n", "vegetables.vegetable_mapper.attach_many(\n", " vegetables.type_list,\n", " attr_name_map,\n", " coll_name_map,\n", ")" ] }, { "cell_type": "code", "execution_count": 3, "id": "c16786d4-0b71-42d9-97f7-7893c542104e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'age': 4}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# create new CO3 descendant\n", "tomato = vegetables.Tomato('t1', 5)\n", "\n", "# test a register collation action\n", "tomato.collate('ripe')" ] }, { "cell_type": "code", "execution_count": 4, "id": "d7fa94ca-3ecd-4ee3-b0dc-f3b2b65ee47c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ " tomato" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vegetables.vegetable_mapper.get_attribute_comp(vegetables.Tomato)" ] }, { "cell_type": "code", "execution_count": 5, "id": "1adc3bc5-957f-4b5a-bc2c-2d172675826d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'schema': ,\n", " 'collector': ,\n", " 'composer': ,\n", " 'attribute_comps': {vegetables.Vegetable: vegetable,\n", " vegetables.Tomato: tomato},\n", " 'collation_groups': defaultdict(dict,\n", " {vegetables.Vegetable: {},\n", " vegetables.Tomato: {'aging': tomato_aging_states,\n", " 'cooking': tomato_cooking_states}})}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vars(vegetables.vegetable_mapper)" ] }, { "cell_type": "code", "execution_count": 6, "id": "f32d1f65-9b1d-4600-b396-8551fbd1fcf7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['3bf42abc-8a12-452f-baf6-38a05fc5d420',\n", " '271b7b84-846e-4d1d-87f6-bcabc90a7b55',\n", " 'f9fc5d16-c5cb-47a7-9eca-7df8a3ba5d10']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vegetables.vegetable_mapper.collect(tomato, ['ripe'])" ] }, { "cell_type": "code", "execution_count": 7, "id": "380dfbea-90cc-49fc-aef1-ebb342872632", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "defaultdict(.()>,\n", " {'3bf42abc-8a12-452f-baf6-38a05fc5d420': ( vegetable,\n", " {'name': 't1', 'color': 'red'}),\n", " '271b7b84-846e-4d1d-87f6-bcabc90a7b55': ( tomato,\n", " {'name': 't1', 'radius': 5}),\n", " 'f9fc5d16-c5cb-47a7-9eca-7df8a3ba5d10': ( tomato_aging_states,\n", " {'name': 't1', 'state': 'ripe', 'age': 1})})" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vegetables.vegetable_mapper.collector._inserts" ] }, { "cell_type": "code", "execution_count": 8, "id": "905bb2a9-9c22-4187-be15-3dd32d206e26", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{ vegetable: [{'name': 't1', 'color': 'red'}],\n", " tomato: [{'name': 't1', 'radius': 5}],\n", " tomato_aging_states: [{'name': 't1',\n", " 'state': 'ripe',\n", " 'age': 1}]}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vegetables.vegetable_mapper.collector.inserts" ] }, { "cell_type": "code", "execution_count": null, "id": "d166b9af-e3ba-4750-9dcb-d8d4e08fe4d3", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "co3", "language": "python", "name": "co3" }, "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.12.2" } }, "nbformat": 4, "nbformat_minor": 5 }