from base_import import get_session_factory from sqlalchemy import text as sqlalchemy_text session_factory = get_session_factory() session = session_factory() # Add LIMIT and OFFSET directly to the SQL query def query_to_run(limit: int, offset: int): return sqlalchemy_text(f""" SELECT a.id, a.uu_id, a.iban, a.bank_date, a.process_comment, a.payment_result_type, b.part_code, COUNT(a2.id) AS sum_a2_id FROM public.account_records AS a INNER JOIN public.build_parts b ON b.id = a.build_parts_id INNER JOIN public.api_enum_dropdown ae ON ae.id = a.payment_result_type INNER JOIN public.build_living_space bl ON bl.id = a.living_space_id INNER JOIN public.people p ON p.id = bl.person_id LEFT JOIN public.account_records_model_train a2 ON a2.account_records_id = a.id WHERE a.bank_date::date > '2023-06-30' and a2.id is null GROUP BY a.id, a.uu_id, a.iban, a.bank_date, a.process_comment, a.payment_result_type, b.part_code ORDER BY a.bank_date ASC LIMIT {int(limit)} OFFSET {int(offset)}; """) """ 52 56b75aec-d28f-4cd4-84e9-ea222cc1d9bd BuildTypes APT_KZN Apartman Kazan Dairesi 53 a9f854d1-d01d-4f2a-af5f-1ccf34193e0f BuildTypes APT_GRJ Apartman Garaj 54 ed7371a4-0a0a-491d-b1f9-015025b6ac91 BuildTypes APT_DP Apartman Depo 55 f6eb95dd-5ed0-407b-8205-4bc855199b06 BuildTypes DAIRE Apartman Dairesi 56 242bbe5e-44df-4f10-9583-9d80ff93c52d BuildTypes APT Apartman Binası 57 8920eb8b-a5aa-42c3-81d0-13afca85ba1f BuildTypes APT_YNT Apartman Yönetimi 58 a7b98daf-c83e-494d-8938-d716be131b5d BuildTypes APT_PRK Apartman Açık Park Alanı 59 628188d9-b5e3-493e-9a42-afac3f5bf816 BuildTypes APT_YSL Apartman Yeşil Alan 60 8b5bcca2-7702-4486-904c-d708248ccd4d BuildTypes APT_YOL Apartman Ara Yol 5 1b51381a-b5a9-485e-884e-fab07b4adf21 BuildDuesTypes BDT-S Service fee 6 4619b29f-7b60-4b95-9a97-50a4e5d40f94 BuildDuesTypes BDT-I Information 1 2d0127eb-899e-47c5-ad86-67a78174bf90 BuildDuesTypes BDT-D Bina Aidat 2 11656423-24b7-4ed9-96e7-1563f639da53 BuildDuesTypes BDT-A Bina Ek Aidat 3 c74c72f4-5e10-4d00-8016-4f9ddd50b3c4 BuildDuesTypes BDT-R Bina Tadilat 4 5edeb654-b7ce-4c1f-b7e3-2c717bb1d263 BuildDuesTypes BDT-L Bina Yasal Harcama 48 f14ae805-8238-438f-a522-d8ac6553f717 TimePeriod TP-W Weekly 49 184c3356-6397-476d-a965-45ddf26a4ff5 TimePeriod TP-M Monthly 50 ba36110f-7afe-4c41-bcad-f80ce71f626e TimePeriod TP-Q Quarterly 51 89ff94c6-126e-45c2-9bc7-6d1007d02528 TimePeriod TP-Y Yearly 32 3cf533a4-3947-4563-9a43-16ea2bab1119 PerComType 1 Person """ class Categories: APTKZN = "APTKZN" APTGRJ = "APTGRJ" APTDP = "APTDP" DAIRE = "DAIRE" APT = "APT" APTYNT = "APTYNT" APTPRK = "APTPRK" APTYSL = "APTYSL" APTYOL = "APTYOL" BDTI = "BDTI" BDTD = "BDTD" BDTA = "BDTA" BDTR = "BDTR" BDTL = "BDTL" TPW = "TPW" TPM = "TPM" TPQ = "TPQ" TPY = "TPY" PERSON = "PERSON" @classmethod def get_category_id(cls, category_name): category_dict = { "APTKZN": (52, "56b75aec-d28f-4cd4-84e9-ea222cc1d9bd"), "APTGRJ": (53, "a9f854d1-d01d-4f2a-af5f-1ccf34193e0f"), "APTDP": (54, "ed7371a4-0a0a-491d-b1f9-015025b6ac91"), "DAIRE": (55, "f6eb95dd-5ed0-407b-8205-4bc855199b06"), "APT": (56, "242bbe5e-44df-4f10-9583-9d80ff93c52d"), "APTYNT": (57, "8920eb8b-a5aa-42c3-81d0-13afca85ba1f"), "APTPRK": (58, "a7b98daf-c83e-494d-8938-d716be131b5d"), "APTYSL": (59, "628188d9-b5e3-493e-9a42-afac3f5bf816"), "APTYOL": (60, "8b5bcca2-7702-4486-904c-d708248ccd4d"), "BDTI": (5, "1b51381a-b5a9-485e-884e-fab07b4adf21"), "BDTD": (1, "2d0127eb-899e-47c5-ad86-67a78174bf90"), "BDTA": (2, "11656423-24b7-4ed9-96e7-1563f639da53"), "BDTR": (3, "c74c72f4-5e10-4d00-8016-4f9ddd50b3c4"), "BDTL": (4, "5edeb654-b7ce-4c1f-b7e3-2c717bb1d263"), "TPW": (48, "f14ae805-8238-438f-a522-d8ac6553f717"), "TPM": (49, "184c3356-6397-476d-a965-45ddf26a4ff5"), "TPQ": (50, "ba36110f-7afe-4c41-bcad-f80ce71f626e"), "TPY": (51, "89ff94c6-126e-45c2-9bc7-6d1007d02528"), "PERSON": (32, "3cf533a4-3947-4563-9a43-16ea2bab1119"), } if not category_name in category_dict: raise ValueError(f"Invalid category name: {category_name}") return category_dict.get(category_name) def get_model_train_query(): """ Returns a SQLAlchemy text object for inserting model train data. Parameters will be bound when executing the query. """ return sqlalchemy_text(""" INSERT INTO public.account_records_model_train ( account_records_id, account_records_uu_id, search_text, start_index, end_index, category_id, category_uu_id ) VALUES ( :account_records_id, :account_records_uu_id, :search_text, :start_index, :end_index, :category_id, :category_uu_id ); """) def find_indices(search_text: str, target_text: str, offset: int = 1): """ Returns start and end indices of the search_text within target_text Args: search_text (str): The text to search for target_text (str): The text to search within offset (int, optional): Which occurrence to find (1 for first, 2 for second, etc). Defaults to 1. Returns: tuple: (start_index, end_index) of the found text, or (-1, -1) if not found or offset is too large """ if offset < 1: offset = 1 current_pos = 0 occurrence_count = 0 while occurrence_count < offset: start_index = target_text.find(search_text, current_pos) if start_index == -1: # Not found return -1, -1 occurrence_count += 1 if occurrence_count == offset: end_index = start_index + len(search_text) - 1 return start_index, end_index + 1 # Move past this occurrence to find the next one current_pos = start_index + 1 raise Exception("Offset is too large") class AccountRecord: def __init__(self, id, uu_id, iban, bank_date, process_comment, payment_result_type, part_code, sum_a2_id): self.id = id self.uu_id = str(uu_id) self.iban = iban self.bank_date = bank_date self.process_comment = process_comment self.payment_result_type = payment_result_type self.part_code = part_code self.sum_a2_id = sum_a2_id def to_dict(self): return { "id": self.id, "uu_id": self.uu_id, "iban": self.iban, "bank_date": self.bank_date, "process_comment": self.process_comment, "payment_result_type": self.payment_result_type, "part_code": self.part_code, "sum_a2_id": self.sum_a2_id, } # Execute the query and process results directly results = session.execute(query_to_run(limit=1, offset=0)) account_record_dict = dict() for result in results: """ (791, UUID('9d276cc8-289f-45c1-9805-44464af5d7bf'), 'TR400006400000142450093333', datetime.datetime(2023, 7, 1, 12, 22, 27, tzinfo=datetime.timezone.utc), '2 NOLU DAİRE TEMMUZ Ç3 AİDAT*SONGÜL VAR*Hİ7748686973', 1, 'DAIRE_2', 4) """ account_record = AccountRecord(*result) account_record_dict = account_record.to_dict() """ "APTKZN": (52, "56b75aec-d28f-4cd4-84e9-ea222cc1d9bd"), "APTGRJ": (53, "a9f854d1-d01d-4f2a-af5f-1ccf34193e0f"), "APTDP": (54, "ed7371a4-0a0a-491d-b1f9-015025b6ac91"), "DAIRE": (55, "f6eb95dd-5ed0-407b-8205-4bc855199b06"), "APT": (56, "242bbe5e-44df-4f10-9583-9d80ff93c52d"), "APTYNT": (57, "8920eb8b-a5aa-42c3-81d0-13afca85ba1f"), "APTPRK": (58, "a7b98daf-c83e-494d-8938-d716be131b5d"), "APTYSL": (59, "628188d9-b5e3-493e-9a42-afac3f5bf816"), "APTYOL": (60, "8b5bcca2-7702-4486-904c-d708248ccd4d"), "BDTI": (5, "1b51381a-b5a9-485e-884e-fab07b4adf21"), "BDTD": (6, "4619b29f-7b60-4b95-9a97-50a4e5d40f94"), "BDTA": (2, "11656423-24b7-4ed9-96e7-1563f639da53"), "BDTR": (3, "c74c72f4-5e10-4d00-8016-4f9ddd50b3c4"), "BDTL": (4, "5edeb654-b7ce-4c1f-b7e3-2c717bb1d263"), "TPW": (48, "f14ae805-8238-438f-a522-d8ac6553f717"), "TPM": (49, "184c3356-6397-476d-a965-45ddf26a4ff5"), "TPQ": (50, "ba36110f-7afe-4c41-bcad-f80ce71f626e"), "TPY": (51, "89ff94c6-126e-45c2-9bc7-6d1007d02528"), "PCT": (32, "3cf533a4-3947-4563-9a43-16ea2bab1119"), """ print(account_record_dict['id']) print(account_record_dict['uu_id']) print(account_record_dict['process_comment']) account_records_id = int(219) account_records_uuid = str("5d301273-806c-47d6-aeeb-e056dc119494") sample_text = "GÜNEŞ APARTMANI AİDAT EYLÜL*HASAN CİHAN ŞENKÜÇÜK*Hİ9021822604" search_text = "HASAN CİHAN ŞENKÜÇÜK" start_index, end_index = find_indices(search_text, sample_text, offset=1) #exit() print("start_index", start_index) print("end_index", end_index) category_id, category_uuid = Categories.get_category_id(Categories.PERSON) write_dict = dict( account_records_id=account_records_id, account_records_uu_id=account_records_uuid, search_text=search_text, start_index=start_index, end_index=end_index, category_id=category_id, category_uu_id=category_uuid ) print('write_dict', write_dict) # Prepare the parameters for the query params = { "account_records_id": account_records_id, "account_records_uu_id": account_records_uuid, "search_text": search_text, "start_index": start_index, "end_index": end_index, "category_id": category_id, "category_uu_id": category_uuid } # Get the parameterized query template query_template = get_model_train_query() # Print parameters for debugging print("Parameters:", params) # Execute the query with parameters session.execute(query_template, params) session.commit()