Commit 55c024e5aed2865bbb2a6fa8f8ebc70ec8fe7cf1
1 parent
b1ffa9d4
add get_relation to get final type in relation A <-> B, just choose which side …
…you need and provide the type get_all function
Showing
3 changed files
with
60 additions
and
2 deletions
Show diff stats
controller/hk_controller.anubis
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | 8 | ||
| 9 | read tools/basis.anubis | 9 | read tools/basis.anubis |
| 10 | transmit hayamiki_lib/types/hayamiki.anubis | 10 | transmit hayamiki_lib/types/hayamiki.anubis |
| 11 | -transmit hayamiki_lib/controller/hk_delete.anubis | 11 | +//transmit hayamiki_lib/controller/hk_delete.anubis |
| 12 | transmit hayamiki_lib/controller/hk_trigger.anubis | 12 | transmit hayamiki_lib/controller/hk_trigger.anubis |
| 13 | 13 | ||
| 14 | transmit kayamiki_lib/controller/hk_rows_import.anubis | 14 | transmit kayamiki_lib/controller/hk_rows_import.anubis |
| @@ -31,6 +31,7 @@ public type HK_Table_controller: | @@ -31,6 +31,7 @@ public type HK_Table_controller: | ||
| 31 | (SQLite3DataBase db, List(Web_arg) lwa) -> Maybe(Int) write_from_fields, | 31 | (SQLite3DataBase db, List(Web_arg) lwa) -> Maybe(Int) write_from_fields, |
| 32 | //Read | 32 | //Read |
| 33 | (SQLite3DataBase db, String clause) -> Int get_count, | 33 | (SQLite3DataBase db, String clause) -> Int get_count, |
| 34 | + //(SQLite3DataBase db, String clause) -> List($T) get_all_by_clause_to_list_type, | ||
| 34 | (SQLite3DataBase db, List(String) columns, Bool resolve_fk, DB_id) -> JsonValue get_one_json, | 35 | (SQLite3DataBase db, List(String) columns, Bool resolve_fk, DB_id) -> JsonValue get_one_json, |
| 35 | (SQLite3DataBase db, List(String) columns, Bool resolve_fk, HK_Referer referer, String clause, String order_by) -> JsonValue get_rows_json, | 36 | (SQLite3DataBase db, List(String) columns, Bool resolve_fk, HK_Referer referer, String clause, String order_by) -> JsonValue get_rows_json, |
| 36 | //Update | 37 | //Update |
controller/hk_sql_utils.anubis
| @@ -9,6 +9,7 @@ | @@ -9,6 +9,7 @@ | ||
| 9 | read data_base/sqlite.anubis | 9 | read data_base/sqlite.anubis |
| 10 | read calexium_lib/database/db_utils.anubis | 10 | read calexium_lib/database/db_utils.anubis |
| 11 | read hayamiki_lib/types/hayamiki.anubis | 11 | read hayamiki_lib/types/hayamiki.anubis |
| 12 | +transmit hayamiki_lib/controller/hk_controller.anubis | ||
| 12 | 13 | ||
| 13 | public define String | 14 | public define String |
| 14 | referer_to_sql_clause | 15 | referer_to_sql_clause |
| @@ -95,6 +96,62 @@ public define List(Int) | @@ -95,6 +96,62 @@ public define List(Int) | ||
| 95 | } | 96 | } |
| 96 | . | 97 | . |
| 97 | 98 | ||
| 99 | +public define List(Int) | ||
| 100 | + get_ids_by_clause | ||
| 101 | + ( | ||
| 102 | + SQLite3DataBase db, | ||
| 103 | + String table_name, | ||
| 104 | + String id_col, | ||
| 105 | + String clause | ||
| 106 | + )= | ||
| 107 | + with final_clause = if clause = "" then | ||
| 108 | + "" | ||
| 109 | + else | ||
| 110 | + "WHERE "+clause, | ||
| 111 | + | ||
| 112 | + if sql_query_timeout(db, "SELECT \""+id_col+"\" FROM "+table_name+" "+final_clause+";", [], "get_ids_by_clause") is | ||
| 113 | + { | ||
| 114 | + error(_) then [], | ||
| 115 | + ok(_, cursor, _) then db_get_integer_list(cursor) | ||
| 116 | + } | ||
| 117 | +. | ||
| 118 | + relation_table | ||
| 119 | + id = id of that relation | ||
| 120 | + source_id = id of the first record in relation | ||
| 121 | + target_id = id of the second record in relation | ||
| 122 | + | ||
| 123 | + for example we search the all record targeted by source id | ||
| 124 | + | ||
| 125 | + relation_id | source_id | target_id | ||
| 126 | + ----------------------------------- | ||
| 127 | + 0 | 1 | 1 | ||
| 128 | + 1 | 1 | 2 | ||
| 129 | + 2 | 1 | 4 | ||
| 130 | + 3 | 0 | 2 | ||
| 131 | + | ||
| 132 | + if we want to get all relation from source matching with id 1 we will get a list of ids [1, 2, 4] | ||
| 133 | + | ||
| 134 | + | ||
| 135 | +public define List($T) | ||
| 136 | + get_relation | ||
| 137 | + ( | ||
| 138 | + SQLite3DataBase db, | ||
| 139 | + String relation_table, | ||
| 140 | + String relation_source_id_col, | ||
| 141 | + String relation_target_id_col, | ||
| 142 | + String relation_condition, //only the right part atfer = in SQL format. This means the SQL query will be constructed with "relation_source_id_col = " relation_condition | ||
| 143 | + String foreign_order, | ||
| 144 | + (SQLite3DataBase db, String clause) -> List($T) get_all_by_clause_to_list_type | ||
| 145 | + )= | ||
| 146 | + //get | ||
| 147 | + with ids = get_ids_by_clause(db, relation_table, relation_target_id_col, relation_source_id_col+" = "+relation_condition), | ||
| 148 | + if length(ids) = 0 then | ||
| 149 | + [] | ||
| 150 | + else | ||
| 151 | + with the_clause = " id IN ("+join(", ", to_List_String(ids))+") "+foreign_order, | ||
| 152 | + get_all_by_clause_to_list_type(db, the_clause) | ||
| 153 | +. | ||
| 154 | + | ||
| 98 | public define Maybe(Int) | 155 | public define Maybe(Int) |
| 99 | insert_or_update | 156 | insert_or_update |
| 100 | ( | 157 | ( |
view/view_table_renderer.anubis
| @@ -655,7 +655,7 @@ public define List(CXM_Form_Field) | @@ -655,7 +655,7 @@ public define List(CXM_Form_Field) | ||
| 655 | foreign_text(s_name, c_name, value, foreign_table_name, select, help) then | 655 | foreign_text(s_name, c_name, value, foreign_table_name, select, help) then |
| 656 | with uid = "_"+generate_random_string(20)+"_", | 656 | with uid = "_"+generate_random_string(20)+"_", |
| 657 | with refresh_func = uid+foreign_table_name+"_"+c_name+"_selector_refresh", | 657 | with refresh_func = uid+foreign_table_name+"_"+c_name+"_selector_refresh", |
| 658 | - with load_script = script("text/javascript","function "+refresh_func+"() { CalexiumToolBox.ajax_load_content('"+uid+foreign_table_name+"_"+c_name+"_selector', '?aws_controller=hk_c&aws_action=selector&table_name="+foreign_table_name+"&fk_filter="+fk_clause+"&selected="+value+"');} "+refresh_func+"(); "), | 658 | + with load_script = script("text/javascript","function "+refresh_func+"() { CalexiumToolBox.ajax_load_content('"+uid+foreign_table_name+"_"+c_name+"_selector', '?aws_controller=hk_c&aws_action=selector&table_name="+foreign_table_name+"&fk_filter="+fk_clause+"&selected="+value+"&"+to_Web_arg(table_referer, "")+"');} "+refresh_func+"(); "), |
| 659 | [ | 659 | [ |
| 660 | partial(jq_dialog_create(dialog_id(uid+foreign_table_name+"_dlg_ajax"), ajax(controller_action("hk_c", "ajax_edit_table&dialog_id="+uid+foreign_table_name+"_dlg_ajax&sub_dialog=true&table_name="+foreign_table_name+"&after_close_cb="+refresh_func)))), | 660 | partial(jq_dialog_create(dialog_id(uid+foreign_table_name+"_dlg_ajax"), ajax(controller_action("hk_c", "ajax_edit_table&dialog_id="+uid+foreign_table_name+"_dlg_ajax&sub_dialog=true&table_name="+foreign_table_name+"&after_close_cb="+refresh_func)))), |
| 661 | one_line_fields([ | 661 | one_line_fields([ |