Welcome Guest Search | Active Topics | Members | Log In

Podstawienie na nieistniejący obiekt Options · View
subieta
Posted: Tuesday, July 14, 2009 8:15:28 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
Na dzisiejszej obronie pracy magisterskiej p. Adam Joka zwrócił uwagę na pewną uciążliwość programowania w SBQL. Chodzi o dane typowane przez liczność [0..1] lub inną liczność z dolnym ograniczeniem 0. Jeżeli mamy taką daną, to nie można na nią bezpośrednio podstawić - trzeba najpierw zbadać czy istnieje, jeżeli jej nie ma, to założyć, a następnie podstawić. Jezeli danych kwalifikowanych licznością [0..1] jest wiele, to programowanie staje się bardzo uciążliwe.

Pomysł jest taki, aby rozszerzyć działanie operatora podstawienia := (i ewentualnie innych operatorów podstawienia). Jezeli podstawienie jest wykonywane na danej z licznością [0..1], to operator ten najpierw sprawdza, czy taka dana istnieje, następnie jeżeli jej nie ma, to ją zakłada i podstawia na nią odpowiednią wartość. Taki kod można wygenerować podczas kontroli typologicznej, gdyz w tym momencie wiadomo, jaka jest liczność i jaki kod sprawdzający liczność należy wstawić do generowanego AST.

Nie wydaje mi się, aby do tego celu należało wprowadzić nowy operator. Może to poprawiłoby skuteczność mocnej kontroli typologicznej, ale podobieństwo dwóch operatorów prawdopodobnie spowodowałoby mętlik w głowach programistów, co także zaowocowałoby błędami.
subieta
Posted: Friday, July 17, 2009 5:33:01 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
Po przemyśleniu sprawa nie wygląda całkiem prosto. Załóżmy, że deklaracja wewnątrz obiektu Emp ma postać
Code:
salary: real[0..1];
Rozważmy podstawienie
Code:
(Emp where name = ”Brown”).salary := 5000;
Jezeli salary u Browna jest nieobecne, to lewa część zapytanie ewaluuje się do pustego bagu, zatem nie mamy szansy na odzyskanie identyfikatora obiektu nadrzędnego. Czyli dla tego zapytania kompilator musi skonstruować zapytanie identyfikujace obiekt nadrzędnych, i dopiero wtedy dać odpowiedni kod
Code:
refB := (Emp where name = ”Brown”); //identyfikacja obiektu nadrzędnego
if exists refB.salary then refB.salary := 5000
else refB :<<  5000 as salary;
}
W ogólnym przypadku może to być jakieś wyzwanie.

Są pomysły jak to rozwiązać?
stencel
Posted: Friday, July 17, 2009 7:47:29 PM

Rank: Advanced Member

Joined: 12/7/2004
Posts: 598
Points: 74
Location: Raszyn
Takie podejscie jest calkowicie zgodne z duchem półmocnej kontroli, więc na pewno popieram.

Rozwiazanie, ktore mi sie nasuwa, nie bedzie dzialalo we wszystkich przypadkach, ale tak jak w innych sytuacjach polmocne podejscie pozwala rozwiazac znaczna czesc problemow praktycznych.

Po pierwsze, bedzie to dzialac tylko, gdy jest kontrola typologiczna.
Po drugie, zapytanie wskazujace opcjonalny obiekt do podstawienia, musi byc nazwą.
Po trzecie, nazwa ta musi miec sygnature referencyjna o licznosci [0..1].
Po czwarte, nazwa ta jest wiazana na stosie, wiec jest tez do zidentyfikowania (statycznie!) zapytanie o sygnaturze referencyjnej, do ktorej zastosowano nested i otrzymano nasza nazwe, na ktora jest podstawienie. To zapytanie daje obiekt bedacy parentem.

Sprobuje bardziej systematycznie:

Code:
(Q1 o Q2 o Q3) niealg N := Q


N jest nazwa, Q2 to zapytanie, ktorego nested daje wlasnie nasze N na stosie. Przepisujemy to tak:

Code:
(Q2 groupas aux).((Q1 o aux o Q3) niealg (if count(N) = 0 then aux :< N(Q) else N := Q)

subieta
Posted: Saturday, July 18, 2009 6:38:30 AM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
Ogólny przypadek jest bardzo złożony i prawdododobnie nie ma rozwiązania na gruncie prostych modeli składu AS0-AS3. Można sobie wyobrazić zapytanie, w którym to, na co się podstawia, jest dowolnie uwikłane w inne operatory, np. zapytanie wykorzystuje funkcję lub view, do których nie mamy dostępu podczas kompilacji.

W tej sytuacji jedynym ogólnym rozwiązaniem jest poprawienie modelu skladu w taki sposób, aby obiekty z licznością [0..1] (albo [0..n]) były reprezentowane w składzie jako dummyobjects, jeżeli aktualnie nie istnieją. Przykładowo, nieobecne salary byłoby reprezentowane w skladzie jako dummyobject <jakies_tam_id, salary, jakas_wyrozniona_wartosc>. Wartość jakas_wyrozniona_wartosc nie jest tym samym co null, bo nigdy jej nie zwracamy na stos QRES, wiec programista nie będzie miał szansy jej użyć. Jest ona tylko znacznikiem nieobecnego obiektu. Ale dzieki temu możemy na ten stos zwrócić jakies_tam_id i następnie przenawigować do obiektu nadrzędnego. Obiekty dummyobjects wstawiamy jezeli kontrola typologiczna wskaże, że liczność danej ma dolną granicę 0. Przy próbie podstawienia na taki dummyobject następuje utworzenie normalnego obiektu wewnątrz obiektu nadrzędnego i wstawienie do niego wymaganej wartości. I odwrotnie, w momencie usunięcia ostatniej wartości z czegoś, co jest typowane kardynalnością [0..n] wstawiamy tam dummyobject.

Cos mi się kojarzy, że na początku Michał Lentner zrobił podobnie przy konstrukcji skladu, ale nie wiem jak jest teraz.

subieta
Posted: Saturday, July 18, 2009 8:03:47 AM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
A w sumie jeszcze ciekawiej się robi jeżeli taki dummyobject umieścimy nie w składzie, ale w klasie (runtimowej). Jezeli taki obiekt będzie nieobecny, to jego nazwa zwiąże się w klasie, a ponieważ klasa jest wtedy na stosie, to referencja do aktualnie przetwarzanego obiektu powinna być w sekcji na czubku stosu ENVS (np. pod nazwą self). I robimy to co mamy zrobić. Konieczne będzie jednak trochę bardziej leniwe zwijanie tego stosu, aby ta informacja nam nie uciekła.

Zaletą takiego rozwiązania jest to, że taki obiekt może istnieć w klasie zawsze, jeżeli tylko odpowiadająca mu dana jest typowana z dolną kardynalnością 0. Jezeli obiekt taki istnieje w skladzie, to przesłoni on ten obiekt w klasie i jest OK.

To rozwiązania pasuje również do innej opcji znanej jako wartości domyślne (default values). W tym przypadku jakas_wyrozniona_wartosc bedzie po prostu wartością domyślną deklarowaną w ramach klasy.

Chciałby ktoś takie defaulty zaimplementować w ODRA?
stencel
Posted: Saturday, July 18, 2009 3:34:49 PM

Rank: Advanced Member

Joined: 12/7/2004
Posts: 598
Points: 74
Location: Raszyn
Czy ten dummy object nie zaczyna przypominac za bardzo klopotliwego NULLa z relacyjnych baz danych? Tam go nie lubimy, a tu?
subieta
Posted: Saturday, July 18, 2009 5:32:07 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
stencel wrote:
Czy ten dummy object nie zaczyna przypominac za bardzo klopotliwego NULLa z relacyjnych baz danych? Tam go nie lubimy, a tu?

Nie przypomina. Jego rola polega tylko na tym, aby umozliwić wiązanie i nawigację do właściwej referencji. Dereferencja referencji do dummy object zwróci po prostu pusty bag, więc semantyka nieistniejącego obiektu będzie zachowana. Programista z dummy object ani tez z wartością dummy nie będzie miał nigdy nic do czynienia, jest to wewnątrzna sprawa mechanizmu wiązania.
subieta
Posted: Thursday, July 23, 2009 12:49:01 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
Zmotywowany dyskusją zakonczylem pisac rozdzial na temat nieregularnych danych w SBA pod http://www.sbql.pl/SBA_SBQL_description.html . Wszelkie narzekania mile widziane.

Storing and processing irregular data (semi-structured data)
· Null Values
· Variants
· Current Proposals Concerning Irregular Data
· Irregular Data in Theories
· Irregular Data in Object Databases
· Date’s Default Values
· SBA - Approach to Irregular Data
· Querying Optional Data, Variants and Repeating Data
· Capabilities Equivalent to Outer Joins
· Default Values in SBA
· Possibility of False Binding
· Assignment to Absent Object
· Typing Irregular Data in SBQL
· Irregular Queries

stencel
Posted: Thursday, July 23, 2009 1:42:01 PM

Rank: Advanced Member

Joined: 12/7/2004
Posts: 598
Points: 74
Location: Raszyn
subieta wrote:
Zmotywowany dyskusją zakonczylem pisac rozdzial na temat nieregularnych danych w SBA pod http://www.sbql.pl/SBA_SBQL_description.html. Wszelkie narzekania mile widziane.


No wiec zaczne od narzekania na to ze ten link nie dziala.

EDIT: Juz dziala. Dzieki. Artykul dlugi, wiec troche to zajmie, ale przeczytam i sprobouje cos poprawic ;)
subieta
Posted: Thursday, July 23, 2009 2:48:05 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
stencel wrote:
subieta wrote:
Zmotywowany dyskusją zakonczylem pisac rozdzial na temat nieregularnych danych w SBA pod http://www.sbql.pl/SBA_SBQL_description.html. Wszelkie narzekania mile widziane.


No wiec zaczne od narzekania na to ze ten link nie dziala.

No bo kropka na koncu. Juz ją odsunąłem.
subieta
Posted: Thursday, July 23, 2009 8:39:51 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
stencel wrote:
Juz dziala. Dzieki. Artykul dlugi, wiec troche to zajmie, ale przeczytam i sprobouje cos poprawic ;)

Materiał nie był publikowany. Może ktoś chciałby z niego zrobić artykuł? Jakby troche popracowac, to i doktorat można by z tego upichcić. Na tle tzw. niekompletnej informacji powstała masa doktoratów. W wiekszości albo i w całości do dupy, o czym piszę w tym tekście. Może ten doktorat zmieni regułę?
stencel
Posted: Friday, July 24, 2009 10:51:16 PM

Rank: Advanced Member

Joined: 12/7/2004
Posts: 598
Points: 74
Location: Raszyn
subieta wrote:
Materiał nie był publikowany. Może ktoś chciałby z niego zrobić artykuł? Jakby troche popracowac, to i doktorat można by z tego upichcić. Na tle tzw. niekompletnej informacji powstała masa doktoratów. W wiekszości albo i w całości do dupy, o czym piszę w tym tekście. Może ten doktorat zmieni regułę?


Wlasnie jestem po lekturze i mialem to napisac. To kompletny material na artykul, ktory warto wyslac moze nawet do jakiegos czasopisma. Chetnie sie tym zajme (choc w zasadzie to jest autorskie dzielo Szefa), ale nie chce doktoratu nikomu odbierac. Doktoranci! To istny samograj jest.

Jakas literowka jest przy przykladzie z not (salary > 1000). W HTMLu wyszedl znak funta.

W Conclusions uwaga However, in this chapter we present simple methods to incorporate default values into classes. moze byc zle zrozumiana przez czytelnika. Bo jest tam krytyka koncecji default values as nulls, a potem piszemy oczywista prawde ze mamy tez default values w klasach. Proponuje po prostu to zdanie odlaczyc od tego akapitu i umiescic je w innym miejscu Conclusions.
subieta
Posted: Saturday, July 25, 2009 8:11:39 PM

Rank: Advanced Member

Joined: 12/22/2004
Posts: 675
Points: 704
Location: Legionowo
stencel wrote:
To kompletny material na artykul, ktory warto wyslac moze nawet do jakiegos czasopisma. Chetnie sie tym zajme (choc w zasadzie to jest autorskie dzielo Szefa), ale nie chce doktoratu nikomu odbierac. Doktoranci! To istny samograj jest.

Dla uściślenia: nie interesuje mnie publikowanie. Interesuje mnie wyłacznie promowanie idei i młodych ludzi. Jeżeli więc ktoś chciałby dopracować z tego artykuł gdziekolwiek, to ma zielone światło.
Users browsing this topic
Guest


Forum Jump
You cannot post new topics in this forum.
You cannot reply to topics in this forum.
You cannot delete your posts in this forum.
You cannot edit your posts in this forum.
You cannot create polls in this forum.
You cannot vote in polls in this forum.

Main Forum RSS : RSS

Powered by Yet Another Forum.net version 1.9.1.6 (NET v2.0) - 11/14/2007
Copyright © 2003-2006 Yet Another Forum.net. All rights reserved.
This page was generated in 0.137 seconds.