Persistentní objekty a Java projekce

V minulém díle jsme si ukázali, jakým způsobem se provádí připojení k databázi Caché. Dnes budeme pokračovat a budeme předpokládat, že již existují třídy, které mají v sobě zabudováno rozhraní pro persistenci jejich instancí. Takovéto třídy je možné vygenerovat v prostředí Caché pomocí postupu zvaného java projekce. V principu to funguje takto. V prostředí Caché se nadefinují persistentní třídy, jejichž konkrétní instance chceme do databáze uložit. Mezi těmito třídami mohou existovat různé komplikované vazby, obdobně jako v javě. Důležité je, že při definici tříd se ve zdrojovém kódu uvede i parametr Projection, definující složku do které se má vygenerovat zdrojový kód v javě, mající všechny metody persistentní třídy Caché. Při kompilaci třídy pak Caché vygeneruje kód použitelný v prostředí JVM. Ukázka takové jednoduché třídy je uvedena níže:

Class JCP.Person Extends %Persistent
{
Projection JavaProjection As %Projection.Java(ROOTDIR =
"c:\Home\Java\CP");

Property Name As %String;

Property SSN As %String;

ClassMethod populate(pCount As %Integer) As %Status
{
// zde se nachazi kod pro vytvareni instanci
// . . . . . . .

quit tSC
}
Method myToString() As %String
{
quit "Class: "_..%ClassName(1)
}
}

Modul napsaný v Jythonu pak výše definovanou třídu volá takto:

# import trid z balicku CacheDB.jar
from com.intersys.objects import *
from JCP import *

# definice funkce pracujici s tridou Person
def workWithPerson():
# vytvotreni instance pripojeni ke Cache

dbconnection=CacheDatabase.getDatabase("jdbc:Cache://localhost:56773/DEV","_system","sys")

# zavolam statickou metodu pro vygenerovani instanci Person
print "Generuji 5 instanci do db:"
Person.populate(dbconnection,5)

# vytvorim instanci tridy Person
print "\nvytvarim instanci rucne a ukladam ji:"
person = Person(dbconnection)
person.setName("Doe, Joe A")
person.setSSN("111-12-1111")

# vypisu jeji vlastnosti
print "\nziskam jeji vlastnosti:"
print "Name: " + person.getName()
print "SSN: " + person.getSSN()

# ulozim instanci do db
person.save()

# zavru instanci a spojeni s db
dbconnection.closeObject(person.getOref())
dbconnection.close()

#
if __name__=="__main__":
workWithPerson()

Výsledek je viditelný níže:


C:\Home\Java\CP>jython CPTest03.py
Generuji 10 instanci do db:
Name: Eagleman,Brenda E.
Name: Lee,Ashley Y.
Name: Munt,Diane I.
Name: Ng,Barbara F.
Name: Umansky,Janice P.

vytvarim instanci rucne a ukladam ji:
ziskam jeji vlastnosti:
Name: Doe, Joe A
SSN: 111-12-1111

Z ukázky je patrné že jsme najednou získali silný nástroj, který nejenže je schopný díky nástrojům v Caché vygenerovat použitelné vzorky dat, ale je i schopný vytvořit na základě definice persistentních tříd tyto vystavit navenek a zpřístupnit je prostředí JVM a pomocí Jythonu velice jednoduchým a efektivním způsobem s těmito definicemi pracovat.

Pokud se nám podařilo uložit instance třídy Person do databáze, očekávali bychom, že existuje i způsob, jak se k uloženým instancím dostat. První nejednodušší způsob je, pomocí metody open(), která identifikuje uloženou instanci na základě její vlastnosti zvané object id.

Podívejme se nyní jak je možné pracovat s výše uvedenou třídou interaktivně za pomocí konzole Jythonu. Z příkazové řádky si otevřeme konzoli Jythonu příkazem jython. Otevře se nám okno, do kterého je možné psát příkazy Jythonu, jaké bychom psali do modulu. Rozdíl je ten, že zde okamžitě vidíme výsledek každého příkazu:


C:\Home\Java\CP>jython
Jython 2.2.1 on java1.6.0_04
Type "copyright", "credits" or "license" for more information.
>>> from com.intersys.objects import *
>>> from JCP import *
>>>
>>>
dbconnection=CacheDatabase.getDatabase("jdbc:Cache://localhost:56773/DEV","_system","sys")
>>>
>>> id = Id(1)
>>> person = Person._open(dbconnection, id)
>>>
>>> print person.myToString()
Class: JCP.Person
>>>
>>> print "ID: ", person.getId()
ID: 1
>>>
>>> print "Name: ", person.getName()
Name: Doe, Joe A
>>>
>>> print "SSN: ", person.getSSN()
SSN: 111-12-1111
>>>

Toto je situace, kdy víme kterou konkrétní instanci požadujeme. Pokud však potřebujeme pracovat s kolekcí instancí, jejichž množinu můžeme vyjádřit efektivně SQL dotazem, můžeme postupovat následujícím způsobem:


>>> sql ="SELECT ID, Name, SSN FROM JCP.Person WHERE Name %STARTSWITH ?"
>>>
>>> cq = CacheQuery(dbconnection, sql)
>>>
>>> selectionCond = "B"
>>>
>>> rs = cq.execute(selectionCond)
>>>
>>> rs.next()
1
>>> rs.getMetaData().getColumnCount()
3
>>>
>>> rs.getString(1)
'14'
>>> rs.getString(2)
'Bach,Mark
Q.'
>>> rs.getString(3)
'805-84-9703'
>>>
>>>
>>> rs.next()
0
>>>

V případě modulu pak výsledek může vypadat například takto:

C:\Home\Java\CP>jython CPTest06.py
Conected.
Creating resultset with dynamic query.
SQL: SELECT ID, Name, SSN FROM JCP.Person WHERE Name %STARTSWITH ?

Enter chars: B

Selected instances:
14: Bach,Mark Q.: 805-84-9703
# of instances: 1