|
5. Colecciones y Vectores
De a poco vamos avanzando hacia el procesamiento de data en tiempo real instalando sensores en nuestro auto y recolectando su salida.
package com.db4o.f1.chapter3;
import java.util.*;
public class SensorReadout {
private double[] values;
private Date time;
private Car car;
public SensorReadout(double[] values,Date time,Car car) {
this.values=values;
this.time=time;
this.car=car;
}
public Car getCar() {
return car;
}
public Date getTime() {
return time;
}
public int getNumValues() {
return values.length;
}
public double getValue(int idx) {
return values[idx];
}
public String toString() {
StringBuffer str=new StringBuffer();
str.append(car.toString())
.append(" : ")
.append(time.getTime())
.append(" : ");
for(int idx=0;idx<values.length;idx++) {
if(idx>0) {
str.append(',');
}
str.append(values[idx]);
}
return str.toString();
}
}
| |
Un auto puede levar a cabo la lectura de su sensor actual cuando se le pide y mantener una lista de las lecturas tomadas durante una carrera.
package com.db4o.f1.chapter3;
import java.util.*;
public class Car {
private String model;
private Pilot pilot;
private List history;
public Car(String model) {
this(model,new ArrayList());
}
public Car(String model,List history) {
this.model=model;
this.pilot=null;
this.history=history;
}
public Pilot getPilot() {
return pilot;
}
public void setPilot(Pilot pilot) {
this.pilot=pilot;
}
public String getModel() {
return model;
}
public SensorReadout[] getHistory() {
return (SensorReadout[])history.toArray(
new SensorReadout[history.size()]);
}
public void snapshot() {
history.add(new SensorReadout(poll(),new Date(),this));
}
protected double[] poll() {
int factor=history.size()+1;
return new double[]{0.1d*factor,0.2d*factor,0.3d*factor};
}
public String toString() {
return model+"["+pilot+"]/"+history.size();
}
}
| |
Vamos a limitarnos a informacion algo estática por el momento y agregaremos flexibilidad durante el próximo capítulo.
5.1. Almacenando
A esta altura esto debería ser muy simple.
[storeFirstCar]
Car car1=new Car("Ferrari");
Pilot pilot1=new Pilot("Michael Schumacher",100);
car1.setPilot(pilot1);
db.set(car1);
| |
El segundo auto tendrá dos capturas desde su creación.
[storeSecondCar]
Pilot pilot2=new Pilot("Rubens Barrichello",99);
Car car2=new Car("BMW");
car2.setPilot(pilot2);
car2.snapshot();
car2.snapshot();
db.set(car2);
| |
5.2. Recuperando
5.2.1. QBE
Primero verifiquemos que se han tomado las capturas.
[retrieveAllSensorReadouts]
SensorReadout proto=new SensorReadout(null,null,null);
ObjectSet result=db.get(proto);
listResult(result);
| |
Como prototipo para un vector, utilizamos un vector del mismo tipo que contiene los valores que esperamos que tenga el resultado.
[retrieveSensorReadoutQBE]
SensorReadout proto=new SensorReadout(
new double[]{0.3,0.1},null,null);
ObjectSet result=db.get(proto);
listResult(result);
| |
Nótese que la posición real de los elementos dados en el prototipo es irrelevante.
Para recuperar un auto por las lecturas almacenadas de su sensor instalamos un historial que contiene los valores a buscar.
[retrieveCarQBE]
SensorReadout protoreadout=new SensorReadout(
new double[]{0.6,0.2},null,null);
List protohistory=new ArrayList();
protohistory.add(protoreadout);
Car protocar=new Car(null,protohistory);
ObjectSet result=db.get(protocar);
listResult(result);
| |
También podemos consultar directamente por las colecciones, ya que son objetos de primera clase.
[retrieveCollections]
ObjectSet result=db.get(new ArrayList());
listResult(result);
| |
Sin embargo esto no funciona para los vectores.
[retrieveArrays]
ObjectSet result=db.get(new double[]{0.6,0.4});
listResult(result);
| |
5.2.2. API de consulta
El manejo de vectores y colecciones es análogo al ejemplo anterior.
[retrieveSensorReadoutQuery]
Query query=db.query();
query.constrain(SensorReadout.class);
Query valuequery=query.descend("values");
valuequery.constrain(new Double(0.3));
valuequery.constrain(new Double(0.1));
ObjectSet result=query.execute();
listResult(result);
| |
[retrieveCarQuery]
Query query=db.query();
query.constrain(Car.class);
Query historyquery=query.descend("history");
historyquery.constrain(SensorReadout.class);
Query valuequery=historyquery.descend("values");
valuequery.constrain(new Double(0.3));
valuequery.constrain(new Double(0.1));
ObjectSet result=query.execute();
listResult(result);
| |
5.3. Actualizando y eliminando
Esto debería ser conocido, simplemente debemos recordar de encargarnos de la profundidad de actualización.
[updateCarPart1]
Db4o.configure().objectClass(Car.class)
.cascadeOnUpdate(true);
| |
[updateCarPart2]
ObjectSet result=db.get(new Car("BMW",null));
Car car=(Car)result.next();
car.snapshot();
db.set(car);
retrieveAllSensorReadouts(db);
| |
La eliminación de vectores y colecciones tampoco tiene nada en particular.
Por supuesto que borrar un objeto de una colección es también una actualización.
[updateCollection]
Query query=db.query();
query.constrain(Car.class);
ObjectSet result=query.descend("history").execute();
List coll=(List)result.next();
coll.remove(0);
db.set(coll);
Car proto=new Car(null,null);
result=db.get(proto);
while(result.hasNext()) {
Car car=(Car)result.next();
for (int idx=0;idx<car.getHistory().length;idx++) {
System.out.println(car.getHistory()[idx]);
}
}
| |
(Este ejemplo tambien demuestra que con db4o es muy facil acceder a las partes privadas del objeto que se supone no deberiamos ver. Por favor recuerde esto y tengo cuidado.)
Eliminemos todos los autos de la base de datos para prepararnos para el proximo capitulo.
[deleteAllPart1]
Db4o.configure().objectClass(Car.class)
.cascadeOnDelete(true);
| |
[deleteAllPart2]
ObjectSet result=db.get(new Car(null,null));
while(result.hasNext()) {
db.delete(result.next());
}
ObjectSet readouts=db.get(
new SensorReadout(null,null,null));
while(readouts.hasNext()) {
db.delete(readouts.next());
}
| |
5.4. Colecciones propias de db4o
db4o tambien provee implementaciones propias de colecciones, modificadas para ser usadas con db4o. Tambien hablaremos sobre ellas en un capitulo posterior cuando hallamos terminado nuestro primer paseo.
5.5. Conclusión
Ok, las colecciones son solo objetos. Pero porque tenemos que especificar el tipo concreto de ArrayList completo ?
Es necesario ? Como maneja db4o la herencia ? Cubriremos todo esto en el siguiente capítulo .
5.6. Fuente completo
package com.db4o.f1.chapter3;
import java.io.*;
import java.util.*;
import com.db4o.*;
import com.db4o.f1.*;
import com.db4o.query.*;
public class CollectionsExample extends Util {
public static void main(String[] args) {
new File(Util.YAPFILENAME).delete();
ObjectContainer db=Db4o.openFile(Util.YAPFILENAME);
try {
storeFirstCar(db);
storeSecondCar(db);
retrieveAllSensorReadouts(db);
retrieveSensorReadoutQBE(db);
retrieveCarQBE(db);
retrieveCollections(db);
retrieveArrays(db);
retrieveSensorReadoutQuery(db);
retrieveCarQuery(db);
db.close();
updateCarPart1();
db=Db4o.openFile(Util.YAPFILENAME);
updateCarPart2(db);
updateCollection(db);
db.close();
deleteAllPart1();
db=Db4o.openFile(Util.YAPFILENAME);
deleteAllPart2(db);
retrieveAllSensorReadouts(db);
}
finally {
db.close();
}
}
public static void storeFirstCar(ObjectContainer db) {
Car car1=new Car("Ferrari");
Pilot pilot1=new Pilot("Michael Schumacher",100);
car1.setPilot(pilot1);
db.set(car1);
}
public static void storeSecondCar(ObjectContainer db) {
Pilot pilot2=new Pilot("Rubens Barrichello",99);
Car car2=new Car("BMW");
car2.setPilot(pilot2);
car2.snapshot();
car2.snapshot();
db.set(car2);
}
public static void retrieveAllSensorReadouts(
ObjectContainer db) {
SensorReadout proto=new SensorReadout(null,null,null);
ObjectSet result=db.get(proto);
listResult(result);
}
public static void retrieveSensorReadoutQBE(
ObjectContainer db) {
SensorReadout proto=new SensorReadout(
new double[]{0.3,0.1},null,null);
ObjectSet result=db.get(proto);
listResult(result);
}
public static void retrieveCarQBE(ObjectContainer db) {
SensorReadout protoreadout=new SensorReadout(
new double[]{0.6,0.2},null,null);
List protohistory=new ArrayList();
protohistory.add(protoreadout);
Car protocar=new Car(null,protohistory);
ObjectSet result=db.get(protocar);
listResult(result);
}
public static void retrieveCollections(ObjectContainer db) {
ObjectSet result=db.get(new ArrayList());
listResult(result);
}
public static void retrieveArrays(ObjectContainer db) {
ObjectSet result=db.get(new double[]{0.6,0.4});
listResult(result);
}
public static void retrieveSensorReadoutQuery(
ObjectContainer db) {
Query query=db.query();
query.constrain(SensorReadout.class);
Query valuequery=query.descend("values");
valuequery.constrain(new Double(0.3));
valuequery.constrain(new Double(0.1));
ObjectSet result=query.execute();
listResult(result);
}
public static void retrieveCarQuery(ObjectContainer db) {
Query query=db.query();
query.constrain(Car.class);
Query historyquery=query.descend("history");
historyquery.constrain(SensorReadout.class);
Query valuequery=historyquery.descend("values");
valuequery.constrain(new Double(0.3));
valuequery.constrain(new Double(0.1));
ObjectSet result=query.execute();
listResult(result);
}
public static void updateCarPart1() {
Db4o.configure().objectClass(Car.class)
.cascadeOnUpdate(true);
}
public static void updateCarPart2(ObjectContainer db) {
ObjectSet result=db.get(new Car("BMW",null));
Car car=(Car)result.next();
car.snapshot();
db.set(car);
retrieveAllSensorReadouts(db);
}
public static void updateCollection(ObjectContainer db) {
Query query=db.query();
query.constrain(Car.class);
ObjectSet result=query.descend("history").execute();
List coll=(List)result.next();
coll.remove(0);
db.set(coll);
Car proto=new Car(null,null);
result=db.get(proto);
while(result.hasNext()) {
Car car=(Car)result.next();
for (int idx=0;idx<car.getHistory().length;idx++) {
System.out.println(car.getHistory()[idx]);
}
}
}
public static void deleteAllPart1() {
Db4o.configure().objectClass(Car.class)
.cascadeOnDelete(true);
}
public static void deleteAllPart2(ObjectContainer db) {
ObjectSet result=db.get(new Car(null,null));
while(result.hasNext()) {
db.delete(result.next());
}
ObjectSet readouts=db.get(
new SensorReadout(null,null,null));
while(readouts.hasNext()) {
db.delete(readouts.next());
}
}
}
| |
-- generated by Doctor courtesy of db4objecs Inc.
|