404 lines
11 KiB
Plaintext
404 lines
11 KiB
Plaintext
{
|
|
"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": [
|
|
"<co3.components.SQLTable at 0x7f2012b23f80>"
|
|
]
|
|
},
|
|
"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': <co3.schemas.SQLSchema at 0x732074224aa0>,\n",
|
|
" 'collector': <co3.collector.Collector at 0x7320757da120>,\n",
|
|
" 'composer': <co3.composer.Composer at 0x7320757da9c0>,\n",
|
|
" 'attribute_comps': {vegetables.Tomato: <co3.components.SQLTable at 0x732074224cb0>},\n",
|
|
" 'collation_groups': defaultdict(dict,\n",
|
|
" {vegetables.Tomato: {'aging': <co3.components.SQLTable at 0x732074224ce0>,\n",
|
|
" 'cooking': <co3.components.SQLTable at 0x732074224d10>}})}"
|
|
]
|
|
},
|
|
"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": [
|
|
"<Component (SQLTable)> 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': <co3.schemas.SQLSchema at 0x7ab568224e60>,\n",
|
|
" 'collector': <co3.collector.Collector at 0x7ab568225190>,\n",
|
|
" 'composer': <co3.composer.Composer at 0x7ab5682251c0>,\n",
|
|
" 'attribute_comps': {vegetables.Vegetable: <Component (SQLTable)> vegetable,\n",
|
|
" vegetables.Tomato: <Component (SQLTable)> tomato},\n",
|
|
" 'collation_groups': defaultdict(dict,\n",
|
|
" {vegetables.Vegetable: {},\n",
|
|
" vegetables.Tomato: {'aging': <Component (SQLTable)> tomato_aging_states,\n",
|
|
" 'cooking': <Component (SQLTable)> 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(<function co3.collector.Collector.__init__.<locals>.<lambda>()>,\n",
|
|
" {'3bf42abc-8a12-452f-baf6-38a05fc5d420': (<Component (SQLTable)> vegetable,\n",
|
|
" {'name': 't1', 'color': 'red'}),\n",
|
|
" '271b7b84-846e-4d1d-87f6-bcabc90a7b55': (<Component (SQLTable)> tomato,\n",
|
|
" {'name': 't1', 'radius': 5}),\n",
|
|
" 'f9fc5d16-c5cb-47a7-9eca-7df8a3ba5d10': (<Component (SQLTable)> 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": [
|
|
"{<Component (SQLTable)> vegetable: [{'name': 't1', 'color': 'red'}],\n",
|
|
" <Component (SQLTable)> tomato: [{'name': 't1', 'radius': 5}],\n",
|
|
" <Component (SQLTable)> 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
|
|
}
|