package app.database.odb.core;
import java.util.Vector;
import app.database.odb.bridge.ODBBridge;
import app.database.odb.utils.Constants;
import org.neodatis.odb.ODB;
import org.neodatis.odb.OID;
import org.neodatis.odb.Objects;
import org.neodatis.odb.core.query.IQuery;
import org.neodatis.odb.core.query.criteria.Where;
import org.neodatis.odb.impl.core.query.criteria.CriteriaQuery;
/**
*
* @author ACME
*/
public class Search implements ODBBridge {
private float wspX;
private float wspY;
/**
*
* @return
*/
@Override
public Vector<String> getCategories() {
Vector<String> v = new Vector<String>();
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return v;
}
Objects categories = odb.getObjects(Category.class);
if (!categories.isEmpty()) {
while (categories.hasNext()) {
Category c = (Category) categories.next();
v.add((String) c.getName());
}
} else {
System.err.println(getClass().getCanonicalName()+" No categories avaliable!");
}
return v;
}
/**
*
* @param category
* @return
*/
@Override
public Vector<String> getSubcategories(String category) {
Vector<String> v = new Vector<String>();
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return v;
}
IQuery query1 = new CriteriaQuery(Category.class, Where.equal("name", category));
Objects categories = odb.getObjects(query1);
if (!categories.isEmpty()) {
Category c = (Category) categories.getFirst();
if (!c.getSubcategories().isEmpty() && c.getSubcategories() != null) {
for (Object obj : c.getSubcategories()) {
Subcategory sub = (Subcategory) obj;
v.add((String) sub.getName());
}
} else {
System.err.println(getClass().getCanonicalName()+" Subcategories empty or null!");
}
} else {
System.err.println(getClass().getCanonicalName()+" Category doesn't exist!");
}
return v;
}
/**
*
* @param category
* @return
*/
@Override
public Vector<String> getSubcategories(Vector<String> category) {
Vector<String> v = new Vector<String>();
for (String string : category) {
Vector<String> tmpVec = getSubcategories(string);
if (!tmpVec.isEmpty()) {
v.addAll(tmpVec);
}
}
return v;
}
/**
*
* @param category
* @param x
* @param y
* @param radius
* @return
*/
@Override
public Vector<ServiceCore> searchCategoryRadius(Vector category, double x, double y, double radius) {
Vector v = new Vector();
ODB odb = null;
try{
odb = Constants.getDbConnection();
}catch(NullPointerException ex){
System.err.println(""+ex.getMessage());
return v;
}
for (int i = 0; i < category.size(); i++) {
IQuery query1 = new CriteriaQuery(ServiceDescription.class, Where.equal("category.name", category.get(i)));
Objects res = odb.getObjects(query1);
while (res.hasNext()) {
Object object = res.next();
ServiceDescription obj = (ServiceDescription) object;
ServiceAttributes sa = obj.getServiceCore().getServiceAttributes();
if (Math.pow(sa.getX() - x, 2) + Math.pow(sa.getY() - y, 2) <= Math.pow(radius, 2)) {
ServiceCore sc = obj.getServiceCore();
OID oid = odb.getObjectId(obj.getServiceCore());
sc.setOID(oid);
v.add(sc);
}
}
}
return v;
}
}