Goran Dumić
Autor:
Goran Dumić

Oracle guru

Pretraga u obliku dinamičke forme

Želio sam podijeliti jedan tehnički izazov i rješenje koje smo nedavno imali prilike implementirati na projektu.

Izazov

Korisnički zahtjev bio je podržati tražilicu dinamičkom formom koja:

  • sadrži padajuću listu "skupina" s 14 mogućih vrijednosti
  • uz padajuću listu sadrži još jedan zajednički parametar (jedinstveni broj)
  • ovisno o izabranoj skupini prikazuje 2-5 dodatnih parametara

U praksi, to izgleda nešto poput ovoga - tri imaginarna primjera:

            .....

Važno je uočiti kako atributi skupine nemaju gotovo ništa zajedničko. Promatrajući model baze, dolazimo do sličnog zaključka: zasebni su entiteti, a time i atributi. Ovo je noćna mora za arhitekta rješenja. S jedne strane, obzirom na model, najbrže i najjednostavnije bilo bi implementirati 14 pretraga (procedura), za svaku skupinu posebno.

Ali to povlači i posljedice - redundancije koda koje se moraju održavati. A tko bi želio održavati toliki broj objekata koji podržavaju jednu jedinu pretragu? Stoga smo se zapitali možemo li sve ove kombinacije parametara podržati u jednoj proceduri bez dodavanja 70 parametara ( 14 x 5 ) ? Ako je forma dinamička, nije optimalno da pretraga bude drugačija.

Parametrizacija

Ideja je za početak popisati sve moguće kombinacije skupine i dodatnih parametara, iz više razloga. Neki od njih su svakako parametrizacija i jednostavnost održavanja (dodavanja novih uvjeta), te mogućnost vezanja pojedine kombinacije na dinamički uvjet (filter) koji bi se inače statički hardkodirao u upitu pretrage. Primjer za skupinu 01 dan je u nastavku. 

Kolona uvjet može sadržavati i složenije SQL uvjete, primjerice (atm.MODEL = :MODEL OR atm.MODEL = LTRIM(:MODEL,'0') )  -  tražimo pojavu unesenog modela ili modela bez vodeće nule, u istom koraku.

Enkapsulacija parametara

Sada smo stvorili preduvjete za krajnji cilj parametrizacije - optimizacije broja parametara koji se šalju u pretragu. Umjesto 70, planiramo poslati samo jedan. 

Temeljem parametara forme koje je korisnik izabrao (npr. marke i modela), u kombinaciji s parametarskom tablicom generiramo novi parametar P_DODATNI_PARAMETRI kao dugačak string koji sadrži key-value zapise.

Dakle, aplikacija je "zapakirala" parametre u jedan. Sada slijede koraci na strani baze podataka:

  • baza ih za početak mora raspakirati i parsirati, radimo poveznicu s konfiguracijskom tablicom
  • temeljem konfiguracijske tablice mapiramo ih u dinamičke uvjete (npr.  AND atm.MARKA_ID = :MARKA_ID)
  • uvjete vežemo uz "core" select upit koji je zajednički svim skupinama (ako takav postoji)
  • najzad, radimo bind varijabli kako bismo primjerice mapirali vrijednost ST106 -> :MODEL

Grafički prikaz dan je u nastavku.

Napomena: Dinamički core upit može biti uvjetovan skupinom po principu:  ako je skupina 01, onda " inner join tablicaXY on .... ". Nadogradnja ovog pristupa bila bi parametrizacija i samih joinova.

Kad smo odradili sve korake dobivamo upit koji je optimalan (minimalan skup entiteta), siguran i spreman za izvođenje pretrage. Postigli smo cilj - imamo jednu pretragu s tri fiksna parametra (skupina, jedinstveni broj, te string dodatnih parametara) umjesto 14 s varijabilnim brojem parametara. 

Održavanje ovakvog rješenja je centralizirano i jednostavno - dodavanje novih parametara zapravo ne zahtjeva izmjenu u kodu, ukoliko se ne dodaju novi joinovi na dodatne entitete.

Popularne teme
.NET ABAP ADFS Agile Always On Anemic Model Angular Azure Backbone BI BI projekti Bootstrap building people business inteligence Business Intelligence Change Chrome CI CITCON Claims compile Continuous Delivery continuous deployment Continuous Integration CSR d3js data data visualization Data visualization alati DDD dekompozicija dependency injection dinamička forma dinamički parametri dinamički query distribuirani razvoj Domain-Driven design DOP društvena odgovornost edge-based video analytics Eliminating waste enkapsulacija enterprise razvoj softvera ERP ETL Excel FIORI Frontend game Geopackage GPKG GIS Git Groovy heat map HICCUPS Hichert HTML IBCS interoperability invision IoT IPSO izvještavanje java java lambde benchmark JavaFX Javascript Jazz Build Engine JBE Jenkins jquery jqueryui jsfiddle JVM Kaizen Kanban KING ICT Kingovci Knockout kvaliteta leadership Lean M language Management Maven Metodologija microservices Microsoft mobile Mobility mockups moć monday game NetWeaver network nodejs OGC OKR open source optimizacija organizacija organizacijska struktura OutOfMemoryError outsourcing paginacija Performance performanse PERT PMI podatkovni skup pouzdanost Power BI Power Map Power Pivot Power Query Power View pretraga proces procjena Product Owner programming proizvod Project manager projektni plan radar Rational Team Concert razvoj tima Release resize responsive charts REST retrospektiva Rich-Domain model Roko Roić rolling wave planning RTC SAP scale scatterplot chart Scrum scrum team scrum tim service boundaries single responsibility principle Single Sign-On smart metering SoapUI social responsibility softver Software software prototyping Software Testing Club Spring Boot SQL standard sustav videonadzora svg Team team building team development Team Foundation Server terminski plan Testing tim timesheet timovi Toggl.com touch transakcijski nadzor tražilica Uspjeh Visual Studio vodstvo vodstvo leadership moć društvena odgovornost DOP social responsibility CSR vođenje projekata WBS Web Zagreb STC

PRIJAVA NA NEWSLETTER

Najnovije novosti iz ICT svijeta