21 kwietnia 2007

Struktura drzewiasta i funkcja connectby (PostgreSQL)

Prędzej czy później większość z nas stanie przed koniecznością przechowywania danych w strukturze drzewiastej. W sieci istnieje wiele przykładów obrazujących to zagadnienie. Poniższy opis ma na celu pokazanie jednego ze sposobów „wyciagania” danych przechowywanych w tejże strukturze za pomocą funkcji connectby. Przykładem struktury drzewiastej jest tzw. adjacency list model:

CREATE TABLE wypowiedz_tab (
id_wypowiedzi bigint NOT NULL,
temat character varying(255),
tresc character varying(255),
id_ojca_wypowiedzi bigint
);

ALTER TABLE ONLY wypowiedz_tab
ADD CONSTRAINT wypowiedz_tab_pkey PRIMARY KEY (id_wypowiedzi);

ALTER TABLE ONLY wypowiedz_tab
ADD CONSTRAINT wypowiedz_tab_fkey FOREIGN KEY (id_ojca_wypowiedzi) REFERENCES wypowiedz_tab(id_wypowiedzi);

Powyższa tabela zawiera wypowiedzi umieszczane na grupie dyskusyjnej. Jeśli id_ojca_wypowiedzi posiada wartość różną od null znaczy to, iż wypowiedź ta jest odpowiedzią . W innym wypadku mamy do czynienia z wypowiedzią rozpoczynającą nową dyskusję.

Po zapełnieniu tabeli danymi chcielibyśmy w łatwy sposób pobierać dane bez względu na jakim znajdujemy sie poziomie w hierarchii naszego drzewa. Serwer baz danych PostgreSQL oferuje do tego zadania gotową funkcję connectby, znajdującą się w pliku share\contrib\tablefunc.sql. Składnia funkcji jest nastepująca:

connectby('nazwa_tabeli','nazwa_pola_PK','nazwa_pola_FK', 'wartość_pola_PK' , głębokość)


gdzie głębokość oznacza głębokość przeszukiwania.

W przypadku gdy argument 'głębokość' ma wartość 0, oznacza to, iż zostanie zwrócony rekord od którego rozpoczęto przeszukiwanie oraz wszystkie względem niego rekordy potomne.

Przed przejściem do następnego etapu należy utworzyć funkcję:

CREATE OR REPLACE FUNCTION connectby(text,text,text,text,int)
RETURNS setof record
AS '$libdir/tablefunc','connectby_text'
LANGUAGE C STABLE STRICT;

Przykład zapytania realizującego pobieranie danych za pomocą funkcji connectby:

SELECT * FROM connectby('wypowiedz_tab','id_wypowiedzi','id_ojca_wypowiedzi', '2',0) AS t(keyid bigint, parent_keyid bigint, level int);

Należy zaznaczyć, iż typy keyid i parent_keyid nie mogą się różnić. W powyższym przypadku jest to bigint. Dla tabeli, gdzie wartości klucza głwównego i klucza obcego byłyby tekstem zapytanie wyglądałoby następująco:

SELECT * FROM connectby('wypowiedz_tab','id_wypowiedzi','id_ojca_wypowiedzi', '2',0) AS t(keyid text, parent_keyid text, level int);

Jeśli interesuje nas zwrócenie w wyniku wszystkich kolumn naszej tabeli należy użyć złączenia:

SELECT tt.* FROM connectby('wypowiedz_tab','id_wypowiedzi','id_ojca_wypowiedzi', '2',0) AS t(keyid text, parent_keyid text, level int), wypowiedz_tab as tt where t.keyid=tt.id_wypowiedzi;

W katalogu doc\contrib\README.tablefunc serwera PostgreSQL znajduje się dokładniejszy opis funkcji connectby uwzględniający uzyskanie dodatkowej funkcjonalności, takiej jak np. sortowanie rekordów potomnych.

23 marca 2007

I love Hibernate...

Mówić w tym wypadku o miłości to trochę za szybko, ale z pewnością jest to zauroczenie. Po zapoznaniu się z tym szkieletem zastanawiam się jak to było możliwe, że przez tak długi czas pisałem aplikacje używając gołego JDBC? Widocznie wcześniej musiałem doświadczyć EJB 2.1, żeby teraz jeszcze bardziej docenić ten framework. Jak to mój kolega ujął: „Hibernate powinien być obowiązkowym wykładem obok fizyki i matematyki”. [no chyba trochę przesadził ;]

12 marca 2007

W życiu nie może być za łatwo

Po bojach z dokumentacją Hibernate'a przyszedł czas na konfigurację IDE ( w moim wypadku Eclipse). Procedura w tym wypadku jest standardowa:
  1. Znajdź odpowiedni plugin.
  2. Zainstaluj go.
  3. Znajdź przyczynę dlaczego plugin nie działa.
Tak też było i tym razem. Pełen entuzjazmu zasiadłem do swojej maszyny, aby zassać Hibernate Tools. Po pomyślnej instalacji zrestartowałem środowisko w celu sprawdzenia poprawności instalacji. Na pierwszy rzut oka wszystko wyglądało poprawnie. Skuszony perspektywą dalszego ułatwienia sobie życia przeszedłem do bojów ze SpringIDE. Po skończonej czyności ponownie odpaliłem Eclipse. W menu kontekstowym pojawiła się nowa magiczna opcja: "Add Spring Project Nature". Zadowolony z odniesionych rezultatów postanowiłem rozpocząć testowanie pierwszego pluginu. I co się okazało? Plugin Hibernate Tools wyparował... Logi Eclipse zamilkły. Wszelkie próby wystartowania Eclipse z opcją clean nie przyniosły oczekiwanego rezultatu. Nie pomogła również ponowna instalacja owego plugina.
Pogooglam jeszcze jutro. Jeśli nie znajdę na sieci jakiegoś workaround to daję sobie spokój z Hibernate Tools. Mam na przyszłość nauczkę, żeby nie ufać pluginom w wersji beta ;)

28 lutego 2007

Blogger biega na Tomcacie

Prawdę mówiąc to nie planowałem dzisiaj wysyłać kolejnego posta, ale nie mogłem się powstrzymać, gdy podczas zmiany konfiguracji ustawień mojego bloggerowego konta na ekranie pojawił się pewien znajomy obraz (patrz obok ;-) Nie powiem, trochę się zdziwiłem. Nie przypuszczałem, że Blogger używa Tomcata i to jeszcze w wersji 4.1 (obecnie jest już 6). Podobny widok oglądam dosyć często, gdyż klepię moją magisterkę używając wspomnianego serwera, a że technologie JSF, Spring framework oraz Hibernate, które wybrałem do mojej pracy są w fazie "przyswajania", więc ja i errorPage Tomcata widzimy się prawie codziennie. Po chwilowym zastanowieniu doszedłem do wniosku, że nie powinienem się dziwić faktem, iż Blogger został napisany w Javie, ponieważ technologia JEE jest obecnie szeroko wykorzystywana w systemach informatycznych.
Zazwyczaj widząc takie obrazki jestem co najmniej nie pocieszony, ale tym razem zrobiło mi się miło ;-)

27 lutego 2007

Blogowania czas zaczynać

Wiele decyzji w moim życiu podejmowałem pod wpływem impulsu i tak było również w tym wypadku. Nigdy nie przypuszczałem, że najdzie mnie ochota na blogowanie... A to dlatego, iż sam nigdy nie czytałem blogów (no chyba, że związane były z programowaniem w języku Java). Życie jednak płata figle...
Leżąc sobie wczorajszej nocy doszedłem do wniosku, że MUSZĘ! Jak pomyślałem, tak też zrobiłem...