Jump to content

About This Club

Have some questions related to programming / security? Want to share something new? Want to tell us a funny joke related to programming? Welcome to the club!

  1. What's new in this club
  2. Pana la urma am ajuns la urmatorul model care pare sa isi indeplineasca scopu': { "endpoint": "rfc", "filter_by": ["change_ref", "change_i"], "limit_results_to": "2", "expression": { "item1": { "field": "first_name", "operator": "EQ", "value": "O'Neil" }, "operator": "AND", "item2": { "item1": { "field": "last_name", "operator": "NEQ", "value": "Smith" }, "operator": "AND", "item2": { "item1": { "field": "middle_name", "operator": "EQ", "value": "Sam" }, "operator": "OR", "item2": { "field": "middle_name", "operator": "EQ", "value": "Sam" } (...) } } } } Mersi all pentru recomandari
  3. In cazul asta, asta ar fi ideea mea: https://codeshare.io/G6AOyg Formatul JSONului (pe care in cod l-am lasat sub forma de array in php) este putin modificat fata de cum l-ai pus tu ca sa poata permite mai multe grupuri de conditii pe acelasi nivel cu acelasi operator (ex: nu poti avea in json doua chei "AND" ca altfel s-ar suprascrie una pe alta). Am pus si doua exemple, unu cu modelul tau de mai sus si unu cu mai multe conditii nested.
  4. Well, in principiu userul ar trebui sa poata sa aleaga intre cele doua variante. Asta e si problema mea, daca stai si iei fiecare edge case... o iei razna.
  5. In query-ul de mai sus, cum sunt puse parantezele? Asa: (age > 10 OR age < 17) AND first_name = 'Jack' sau asa: age > 10 OR (age < 17 AND first_name = 'Jack') Daca ambele variante ar putea exista, atunci jsonul cred ca va trebui sa fie mai complex ca sa permita tot felul de combinatii de conditii.
  6. Nu, utilizatorul va avea o lista de operatori disponibili. Probabil ca cei de mai jos: LOGICAL_OPERATORS = { 'AND': 'AND', 'OR': 'OR' } COMPARISON_OPERATORS = { 'LT': '<', 'GT': '>', 'LTE': '<=', 'GTE': '>=', 'EQ': '=', 'NEQ': '!=', 'CONTAINS': 'LIKE %{}%', 'STARTSWITH': 'LIKE {}%', 'ENDSWITH': 'LIKE %{}', 'NCONTAINS': 'NOT LIKE %{}%', 'NSTARTSWITH': 'NOT LIKE {}%', 'NENDSWITH': 'NOT LIKE %{}' } Nu vor exista JOIN-uri etc, pentru ca fiecare endpoint corespunde unui singur view din DB, deci toate datele is deja acolo.
  7. O implementare puerila, dar care ar trb sa faca treaba: SELECT * FROM table WHERE age > 10 OR age < 17 AND first_name='Jack'; { "operands": [ { "field": "age" }, { "field": "10" }, { "field": "age" }, { "field": "17" }, { "field": "first_name" }, { "field": "Jack" } "operators": [ { "type" = ">" }, { "type" = "OR" }, { "type" = "<" }, { "type" = "AND" }, { "type" = "=" } ] } Si ca sa generezi query-ul pt clauza 'where' int i = 0; String query = operand[i]; while( i < operands.size - 1 ) query += operators[i] + operands[++i] } Ar fi interesant de stiut la ce optiuni are acces utilizatorul. O sa fie si query-uri mai complexe gen care sa contina Group By, Order, inner Select ?
  8. Bun, de cateva zile ma chinui sa construiesc o schema JSON decenta, pentru ca mai tarziu sa o pot manipula cat mai usor posibil. Scenario: User-ul va face un POST request cu un JSON care va arata de cele ai multe ori, asa: { "endpoint": "ep", "expression": { "field": "first_name", "operator": "EQUALS", "value": "Jack" }, "query_limit": "2" } Acum, in principiu, `endpoint` si `query_limit` vor fi mereu stringuri. Partea unde am eu probleme este `expression`. Exemplul de expresie de mai jos este minimal dar de ajuns pentru a explica ceea ce vreau sa fac. Acea expresie va face parte din clauza WHERE dintr-un query MSSQL. Spre exemplu, cea de mai sus va deveni: SELECT * FROM table WHERE first_name='Jack'; E de la sine inteles ca va exista o mapare intre operatorii din JSON si cei din MSSQL. In python, maparea aia se va face prin doua dictionare simple: LOGICAL_OPERATORS = { 'AND': 'AND', 'OR': 'OR' } COMPARISON_OPERATORS = { 'LT': '<', 'GT': '>', 'LTE': '<=', 'GTE': '>=', 'EQ': '=', 'NEQ': '!=' } The problem: Acum, partea la care intampin probleme este aceea de a dezvolta mai departe acel expression din JSON, astfel incat va putea suporta query-uri mult mai complexe. Vreau sa incerc sa acopar cat mai multe scenarii, asa ca am nevoie de o schema cat mai bine pusa la punct. Un exemplu: 1. Userul doreste ca `first_name` sa fie 'Jack' SI `last_name` sa fie 'Lola'. In cazul acela, JSON-ul ar putea sa arate asa: { "endpoint": "rfc", "expression": { "AND": [ { "field": "first_name", "operator": "EQUALS", "value": "Jack" }, { "field": "last_name", "operator": "EQUALS", "value": "Lola" } ] }, "limit": "2" } Exemplul de mai sus, va fi transformat intr-un SQL care va fi de forma: SELECT * FROM table WHERE first_name='Jack' AND last_name='Lola'; User-ul doreste ca `age` sa fie mai mic decat 17 SAU `age` mai mare decat 10 SI `first_name` sa fie 'Dick'. SQL-ul pentru descrierea de mai sus va fi de forma: SELECT * FROM table WHERE age > 10 OR age < 17 AND first_name='Jack'; Ceva idei pentru cum ar trebui sa arate JSON-ul in acest caz? Ceva care sa fie usor de adaptat pentru cazuri si mai complexe (va trebui sa generalizez toata treaba pentru ca asa cum stim toti care lucram in industria IT, userul e foarte inventiv cand vine vorba de edge cases). Thanks!
  9.  
×