query_handlers.py 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import sqlite3
  2. # Refactor out? NO, for now!
  3. import pandas as pd
  4. # Just for historical memory!
  5. def simpleQueryHandlerV0(data, path):
  6. theSimpleQuery = "SELECT norm FROM form WHERE norm LIKE '" + data + "'"
  7. con = sqlite3.connect(path + "/db/test_x.db")
  8. cur = con.cursor()
  9. queryReponse = cur.execute(theSimpleQuery)
  10. results = queryReponse.fetchall()
  11. return results
  12. # Actual thing, first version
  13. class queryHandlerBasicSqlite:
  14. def __init__(self, dbpath):
  15. self.dbpath = dbpath
  16. def query(self, queryData, pandas=False):
  17. # Formerly the query string was pre-generated outside and
  18. # sent here in lieu of the query data
  19. # Now the method processes a query data OBJECT and creates the query
  20. # accordingly
  21. queryString = prepareQueryString(queryData)
  22. dbpath = self.dbpath
  23. con = sqlite3.connect(f"file:{dbpath}?mode=ro", uri=True)
  24. # PANDAS?
  25. if pandas:
  26. answer_table = pd.read_sql(queryString, con)
  27. return answer_table
  28. else:
  29. con.row_factory = dict_factory
  30. cur = con.cursor()
  31. queryReponse = cur.execute(queryString)
  32. results = queryReponse.fetchall()
  33. return results
  34. # Utilities
  35. def prepareQueryString(queryData):
  36. queryType = queryData['queryType']
  37. if queryType=='forma':
  38. joinedQueryData = " OR spec LIKE ".join(queryData['data'])
  39. if len(queryData['dataNorm'])==0:
  40. return f"SELECT spec AS forma, nocc AS occ, cod FROM form WHERE spec LIKE {joinedQueryData} ORDER BY idfor"
  41. else:
  42. joinedQueryDataNorm = " OR norm LIKE ".join(queryData['dataNorm'])
  43. return f"SELECT DISTINCT spec AS forma, nocc AS occ, cod FROM form WHERE (spec LIKE {joinedQueryData}) OR (norm LIKE {joinedQueryDataNorm}) ORDER BY idfor"
  44. elif queryType=='lemma':
  45. joinedQueryData = " OR spec LIKE ".join(queryData['data'])
  46. if len(queryData['dataNorm'])==0:
  47. return f"SELECT spec AS lemma, cat AS cat_gr, omo AS disambiguatore, nocc AS occ, cod FROM lem WHERE spec LIKE {joinedQueryData} ORDER BY idlem"
  48. else:
  49. joinedQueryDataNorm = " OR norm LIKE ".join(queryData['dataNorm'])
  50. return f"SELECT DISTINCT spec AS lemma, cat AS cat_gr, omo AS disambiguatore, nocc AS occ, cod FROM lem WHERE (spec LIKE {joinedQueryData}) OR (norm LIKE {joinedQueryDataNorm}) ORDER BY idlem"
  51. elif queryType=='lemmaForma':
  52. joinedQueryData = " OR form.spec LIKE ".join(queryData['data'])
  53. if len(queryData['dataNorm'])==0:
  54. return f"SELECT lem.spec AS lemma, lem.cat AS cat_gr, form.spec AS forma, lem.omo AS disambiguatore, pfl.nocc AS occ, lem.cod FROM pfl INNER JOIN form ON form.cod = pfl.forma INNER JOIN lem ON lem.cod != 0 AND lem.cod = pfl.lemma WHERE lem.spec LIKE {joinedQueryData} ORDER BY lem.idlem"
  55. else:
  56. joinedQueryData = " OR lem.spec LIKE ".join(queryData['data'])
  57. joinedQueryDataNorm = " OR lem.norm LIKE ".join(queryData['dataNorm'])
  58. return f"SELECT DISTINCT lem.spec AS lemma, lem.cat AS cat_gr, form.spec AS forma, lem.omo AS disambiguatore, pfl.nocc AS occ, lem.cod FROM pfl INNER JOIN form ON form.cod = pfl.forma INNER JOIN lem ON lem.cod = pfl.lemma WHERE (lem.spec LIKE {joinedQueryData}) OR (lem.norm LIKE {joinedQueryDataNorm}) ORDER BY lem.idlem"
  59. elif queryType=='formaLemma':
  60. joinedQueryData = " OR form.spec LIKE ".join(queryData['data'])
  61. if len(queryData['dataNorm'])==0:
  62. return f"SELECT form.spec AS forma, lem.spec AS lemma, lem.cat AS cat_gr, lem.omo AS disambiguatore, pfl.nocc AS occ, form.cod FROM pfl INNER JOIN form ON form.cod = pfl.forma INNER JOIN lem ON lem.cod = pfl.lemma WHERE form.spec LIKE {joinedQueryData} ORDER BY form.idfor"
  63. else:
  64. joinedQueryDataNorm = " OR form.norm LIKE ".join(queryData['dataNorm'])
  65. return f"SELECT DISTINCT form.spec AS forma, lem.spec AS lemma, lem.cat AS cat_gr, lem.omo AS disambiguatore, pfl.nocc AS occ, form.cod FROM pfl INNER JOIN form ON form.cod = pfl.forma INNER JOIN lem ON lem.cod = pfl.lemma WHERE (form.spec LIKE {joinedQueryData}) OR (form.norm LIKE {joinedQueryDataNorm}) ORDER BY form.idfor"
  66. else:
  67. raise ValueError('Unrecognized query type')
  68. def dict_factory(cursor, row):
  69. fields = [column[0] for column in cursor.description]
  70. return {key: value for key, value in zip(fields, row)}