It is currently 26 May 2020, 0:43 Advanced search

Cicli su collection e flag hidden

Domande e risposte su come utilizzare Instant Developer Foundation al meglio

Cicli su collection e flag hidden

Postby theguru » 25 January 2020, 3:58

Curioso caso.

Prendiamo questo ciclo, che dovrebbe nascondere gli elementi di una collection secondo un criterio di ugaglianza:
Schermata 2020-01-25 alle 04.18.30.png
Schermata 2020-01-25 alle 04.18.30.png (31.87 KiB) Viewed 501 times
(Nota: il booleano viene sempre passato a false, quindi lo showhidden non ha effetto.)

A livello logico non fa una piega, in realtà, se gli do in pasto 1000 docs, che dovrebbero essere tutti nascosti, ne nasconde solo 500
In pratica è come se il framework, all'atto della mascheratura (hidden=true), quindi dentro il ciclo, saltasse sul record successivo.
Nel momento in cui riceve il moveNext(), viene saltato dalla elaborazione il record successivo, che riprende su quello dopo.
Scorretto, a mio avviso, ma tutto sommato accettabile.

Quindi modifichiamo il ciclo così:
Schermata 2020-01-25 alle 04.43.02.png
Schermata 2020-01-25 alle 04.43.02.png (34.05 KiB) Viewed 501 times

ovvero chiamiamo il move next solo se il doc attuale non è stato impostato come .hidden, a rigor di logica dovremmo esserci.
Ed invece:
Schermata 2020-01-25 alle 04.49.25.png
Schermata 2020-01-25 alle 04.49.25.png (26.95 KiB) Viewed 501 times

In pratica non soltanto la collection non avanza sul record successivo, ma addirittura interpreta come null quello nascosto, su cui punta.

Ne segue a questo punto che la istruzione .moveNext(), se chiamata dopo ave nascosto il doc a cui la collection punta, esegue un doppio salto in avanti, al posto di uno singolo.
Comportamento che mi sembra ragionevolmente scorretto. è possibile correggerlo?
User avatar
theguru
 
Posts: 782
Joined: 29 January 2014, 13:01

Re: Cicli su collection e flag hidden

Postby theguru » 25 January 2020, 4:16

UPDATE:
per tutti voi numerosi, che vi siete interessati alla sfida, aggiungo che anche questa configurazione non funziona:
Schermata 2020-01-25 alle 05.08.57.png
Schermata 2020-01-25 alle 05.08.57.png (32.75 KiB) Viewed 500 times

L'idea era muovere il puntatore di collection PRIMA di nascondere il doc puntato.
Nisba, sempre 500 fatti e 500 scartati...
User avatar
theguru
 
Posts: 782
Joined: 29 January 2014, 13:01

Re: Cicli su collection e flag hidden

Postby t.simoncini » 27 January 2020, 7:46

Domanda stupida: c'è un motivo per il quale non usi un for each?
Se imposti lo ShowHidden a True, funziona correttamente?
t.simoncini
 
Posts: 1059
Joined: 5 March 2012, 14:00

Re: Cicli su collection e flag hidden

Postby r.bianco » 27 January 2020, 7:53

Se nn ricordo male, anni fa abbiamo pensato di creare un meccanismo di cancellazione logica utilizzando la proprietà hidden del documento.
Non ha funzionato perché il framework di inde usa e modifica quella proprietà al suo interno.
Magari nn centra, ma magari sì.
Ci dovrebbe essere un post nel forum su questo.
only work and no play makes jack a dull boy
r.bianco
 
Posts: 4133
Joined: 8 November 2010, 16:46

Re: Cicli su collection e flag hidden

Postby geraci » 27 January 2020, 10:02

Mi associo a @t.simoncini...
Noi non abbiamo mai utilizzato quella sintassi, ci muoviamo con il for each all'interno delle collection per nascondere i documenti e non abbiamo mai avuto problemi.
Davide
User avatar
geraci
 
Posts: 648
Joined: 8 July 2013, 7:23
Location: Fossano

Re: Cicli su collection e flag hidden

Postby theguru » 28 January 2020, 6:24

t.simoncini wrote:Domanda stupida: c'è un motivo per il quale non usi un for each?
Se imposti lo ShowHidden a True, funziona correttamente?

Performance.
Nell'ultimo mese sono andato davvero in scimmia per i benchmark su INDE, mi sono creato un app apposta per studiare il comportamento dei vari costrutti.
Tra le tante scoperte, un ciclo foreach puro impiega leggermente più del doppio rispetto al costrutto while di cui sopra.
Per dare un valore di riferimento, un passaggio su 10^6 doc costa 160ms utilizzando il ciclo while, 325ms utilizzando il foreach.
Al che direte: ma è irrilevante: si, ed in effetti continuerò normalmente ad usare il foreach laddove mi servono loop "quotidiani", che non verranno innestati in altri alzando la O a n^2

Ma nel caso (ad esempio) di una procedura che esegua giusto un lookup su gli elementi di una collection, che creo una tantum ed utilizzerò in molti contesti, e che spesso verrà richiamata all'interno di altri cicli di decodifica... beh, che mi costa implementare la soluzione più veloce?
Per capirci ho usato queste due procedure nei benchmark:
foreach (tempo medio 325ms/10^6 step)
Schermata 2020-01-28 alle 07.04.45.png
Schermata 2020-01-28 alle 07.04.45.png (22.85 KiB) Viewed 418 times

while-next (tempo medio 160ms/10^6 step)
Schermata 2020-01-28 alle 07.02.45.png
Schermata 2020-01-28 alle 07.02.45.png (27.58 KiB) Viewed 418 times

Purtroppo, come evidenziato al primo post, non sembra essere utilizzabile per impostare i flag .hidden.
Continuerò quindi ad usare i foreach, senza disperazione alcuna.
User avatar
theguru
 
Posts: 782
Joined: 29 January 2014, 13:01

Re: Cicli su collection e flag hidden

Postby lucabaldini » 24 March 2020, 15:40

Da quel che vedo, cambiare il valore di hidden obbliga la collection in cui è contenuto ad "aggiornarsi" ovvero, per esempio, a ricalcolare l'ordinamento, a rigenerare la lookup che viene usata internamente per la visualizzazione in videate (dove i nascosti e cancellati non si vedono)... così, ad occhio, direi che dovrebbe succedere solo se c'è un'ordinamento... però dovrei replicare il caso e studiarlo meglio per capire cosa succede.
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4319
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Cicli su collection e flag hidden

Postby lucabaldini » 24 March 2020, 15:45

Con un for-each su collection non dovrebbe succedere...

Credo che la causa sia analoga a quello che avresti in Java se provi a modificare un arraylist mentre la stai scorrendo:
Code: Select all
  for (Book book : library) {
    if (book.getTitle().equals("Gone Girl"))
      library.remove(book);
  }

dove library è un ArrayList e Book è il nome della classe contenuta nell'ArrayList. In questo caso ottieni una ConcurrentModificationException dovuta al fatto che l'iteratore interno non è correttamente posizionato dopo la rimozione.

Nel nostro caso cambiare HIDDEN è "simile" (quand'anche non uguale) alla rimozione... l'oggetto non viene tolto ma viene "tolto" dalla mappa usata per visualizzare la collection nei pannelli a video.

Quindi il problema dovrebbe capitare se la collection è a video e, guardando il codice, se c'è un ordinamento attivo... ma, come dicevo prima, dovrei studiare meglio il caso...
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4319
Joined: 1 October 2010, 17:03
Location: Bologna

Re: Cicli su collection e flag hidden

Postby theguru » 25 March 2020, 9:17

Ciao Luca, grazie della risposta.
Sono stato un po' offline dal forum, mi hanno coinvolto in progetto su vuejs che ha spostato un po' le mie attenzioni :)

Quanto chiesto sopra, rientrava in un mio.. progetto di refactoring del codice su inde, che mi ha portato ad analizzare un po' di performance in alcune funzioni critiche.
Ho deciso di liberarmi completamente dall'uso delle IMDB, ti ricorderai un nostro topic a riguardo in cui chiedevo lumi sulla loro implementazione.... che in seguito delle mie prove su strada non si è rivelata per nulla ottima (eufemismo). Praticamente in tutte le situazioni (select, order, cicli, etc) le collection risultano più veloci e stabili (oltre a dare meno errori di out of memory, ed essere più "stateless")
Quindi mi sono creato delle funzioni generalizzate di base per interagire con le collection, che utilizzano il metodo move_next, più veloce.
Arrivati al filtraggio, come esposto al post 1, si sviluppano i problemi descritti.
Ti dirò, dalle prove fatte, ho avuto come un impressione/intuizione che si tratti di un errore logico, ma di poco conto (sul livello degli off-by-one), che abbia poco a che fare con l'aggiornamento delle interfacce collegate.
Vedi tu, credo che indagare e risolvere questo problema sarebbe cosa buona per la "consistenza" del framework a basso livello.
Ovviamente so che le cose da fare sono tante..
User avatar
theguru
 
Posts: 782
Joined: 29 January 2014, 13:01

Re: Cicli su collection e flag hidden

Postby lucabaldini » 25 March 2020, 10:58

Appena ho tempo gli do' un'occhiata... magari riesco a tenere le cose a posto anche mentre si sta girando sulla collection ;-)
User avatar
lucabaldini
Pro Gamma
Pro Gamma
 
Posts: 4319
Joined: 1 October 2010, 17:03
Location: Bologna


Return to Tips & Tricks - Foundation

Who is online

Users browsing this forum: No registered users and 11 guests

cron