package org.hadatac.entity.pojo; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.beans.Field; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.FacetField; import org.apache.solr.client.solrj.response.FacetField.Count; import org.apache.solr.client.solrj.response.PivotField; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.hadatac.console.models.FacetHandler; import org.hadatac.console.models.Pivot; import org.hadatac.data.model.AcquisitionQueryResult; import org.hadatac.utils.Collections; import play.Play; public class Measurement { @Field("uri") private String uri; @Field("owner_uri") private String ownerUri; @Field("acquisition_uri") private String acquisitionUri; @Field("study_uri") private String studyUri; @Field("object_uri") private String objectUri; @Field("timestamp") private String timestamp; @Field("value") private String value; @Field("unit") private String unit; @Field("unit_uri") private String unitUri; @Field("entity") private String entity; @Field("entity_uri") private String entityUri; @Field("characteristic") private String characteristic; @Field("characteristic_uri") private String characteristicUri; @Field("instrument_model") private String instrumentModel; @Field("instrument_uri") private String instrumentUri; @Field("platform_name") private String platformName; @Field("platform_uri") private String platformUri; @Field("location") private String location; @Field("elevation") private double elevation; @Field("dataset_uri") private String datasetUri; public String getOwnerUri() { return ownerUri; } public void setOwnerUri(String ownerUri) { this.ownerUri = ownerUri; } public String getAcquisitionUri() { return acquisitionUri; } public void setAcquisitionUri(String acquisitionUri) { this.acquisitionUri = acquisitionUri; } public String getStudyUri() { return studyUri; } public void setStudyUri(String studyUri) { this.studyUri = studyUri; } public String getObjectUri() { return objectUri; } public void setObjectUri(String objectUri) { this.objectUri = objectUri; } public String getInstrumentModel() { return instrumentModel; } public void setInstrumentModel(String instrumentModel) { this.instrumentModel = instrumentModel; } public String getInstrumentUri() { return instrumentUri; } public void setInstrumentUri(String instrumentUri) { this.instrumentUri = instrumentUri; } public String getPlatformName() { return platformName; } public void setPlatformName(String platformName) { this.platformName = platformName; } public String getPlatformUri() { return platformUri; } public void setPlatformUri(String platformUri) { this.platformUri = platformUri; } public String getUri() { return uri; } public void setUri(String uri) { this.uri = uri; } public String getTimestamp() { return timestamp; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } public void setTimestampXsd(String timestamp) { this.timestamp = timestamp; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public String getUnitUri() { return unitUri; } public void setUnitUri(String unitUri) { this.unitUri = unitUri; } public String getEntity() { return entity; } public void setEntity(String entity) { this.entity = entity; } public String getEntityUri() { return entityUri; } public void setEntityUri(String entityUri) { this.entityUri = entityUri; } public String getCharacteristic() { return characteristic; } public void setCharacteristic(String characteristic) { this.characteristic = characteristic; } public String getCharacteristicUri() { return characteristicUri; } public void setCharacteristicUri(String characteristicUri) { this.characteristicUri = characteristicUri; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } public double getElevation() { return elevation; } public void setElevation(double elevation) { this.elevation = elevation; } public String getDatasetUri() { return datasetUri; } public void setDatasetUri(String datasetUri) { this.datasetUri = datasetUri; } public int save() { SolrClient solr = new HttpSolrClient( Play.application().configuration().getString("hadatac.solr.data") + Collections.DATA_ACQUISITION); try { int status = solr.addBean(this).getStatus(); solr.commit(); solr.close(); return status; } catch (IOException | SolrServerException e) { System.out.println("[ERROR] Measurement.save - e.Message: " + e.getMessage()); return -1; } } public static int delete(String datasetUri) { SolrClient solr = new HttpSolrClient( Play.application().configuration().getString("hadatac.solr.data") + Collections.DATA_ACQUISITION); try { UpdateResponse response = solr.deleteByQuery("dataset_uri:\"" + datasetUri + "\""); solr.commit(); solr.close(); return response.getStatus(); } catch (SolrServerException e) { System.out.println("[ERROR] Measurement.delete - SolrServerException message: " + e.getMessage()); } catch (IOException e) { System.out.println("[ERROR] Measurement.delete - IOException message: " + e.getMessage()); } catch (Exception e) { System.out.println("[ERROR] Measurement.delete - Exception message: " + e.getMessage()); } return -1; } public static String buildQuery(String user_uri, String study_uri, String subject_uri, String char_uri) { String acquisition_query = ""; String facet_query = ""; String q = ""; List<String> listURI = DataAcquisition.findAllAccessibleDataAcquisition(user_uri); Iterator<String> iter_uri = listURI.iterator(); while(iter_uri.hasNext()){ String uri = iter_uri.next(); acquisition_query += "acquisition_uri" + ":\"" + uri + "\""; if(iter_uri.hasNext()){ acquisition_query += " OR "; } } if(!study_uri.equals("")){ facet_query += "study_uri" + ":\"" + study_uri + "\""; } if(!subject_uri.equals("")){ if(!study_uri.equals("")){ facet_query += " AND "; } facet_query += "object_uri" + ":\"" + subject_uri + "\""; } if(!char_uri.equals("")){ if(!study_uri.equals("") || !subject_uri.equals("")){ facet_query += " AND "; } facet_query += "characteristic_uri" + ":\"" + char_uri + "\""; } if (facet_query.trim().equals("")) { q = acquisition_query; } else { q = "(" + acquisition_query + ") AND (" + facet_query + ")"; } return q; } public static AcquisitionQueryResult findForViews(String user_uri, String study_uri, String subject_uri, String char_uri) { AcquisitionQueryResult result = new AcquisitionQueryResult(); SolrClient solr = new HttpSolrClient( Play.application().configuration().getString("hadatac.solr.data") + Collections.DATA_ACQUISITION); SolrQuery query = new SolrQuery(); String q = buildQuery(user_uri, study_uri, subject_uri, char_uri); query.setQuery(q); query.setRows(10000000); query.setFacet(false); try { QueryResponse queryResponse = solr.query(query, SolrRequest.METHOD.POST); solr.close(); SolrDocumentList results = queryResponse.getResults(); System.out.println("SolrDocumentList: " + results.size()); Iterator<SolrDocument> m = results.iterator(); while (m.hasNext()) { result.documents.add(convertFromSolr(m.next())); } } catch (SolrServerException e) { System.out.println("[ERROR] Measurement.findForViews() - SolrServerException message: " + e.getMessage()); } catch (IOException e) { System.out.println("[ERROR] Measurement.findForViews() - IOException message: " + e.getMessage()); } catch (Exception e) { System.out.println("[ERROR] Measurement.findForViews() - Exception message: " + e.getMessage()); } return result; } public static String buildQuery(String user_uri, int page, int qtd, FacetHandler handler) { String acquisition_query = ""; String facet_query = ""; String q = ""; List<String> listURI = DataAcquisition.findAllAccessibleDataAcquisition(user_uri); Iterator<String> iter_uri = listURI.iterator(); while(iter_uri.hasNext()){ String uri = iter_uri.next(); acquisition_query += "acquisition_uri" + ":\"" + uri + "\""; if(iter_uri.hasNext()){ acquisition_query += " OR "; } } if (handler != null) { facet_query = handler.toSolrQuery(); } if (acquisition_query.equals("")) { if (facet_query.trim().equals("")) { q = "*:*"; } else { q = facet_query; } } else { if (facet_query.trim().equals("") || facet_query.trim().equals("*:*")) { q = acquisition_query; } else { q = "(" + acquisition_query + ") AND (" + facet_query + ")"; } } return q; } public static AcquisitionQueryResult find(String user_uri, int page, int qtd, FacetHandler handler) { AcquisitionQueryResult result = new AcquisitionQueryResult(); int docSize = 0; SolrClient solr = new HttpSolrClient( Play.application().configuration().getString("hadatac.solr.data") + Collections.DATA_ACQUISITION); SolrQuery query = new SolrQuery(); String q = buildQuery(user_uri, page, qtd, handler); System.out.println("q: " + q); query.setQuery(q); query.setStart((page - 1) * qtd + 1); System.out.println("Starting at: " + ((page - 1)* qtd + 1) + " page: " + page + " qtd: " + qtd); query.setRows(qtd); query.setFacet(true); query.setFacetLimit(-1); query.addFacetField("unit"); query.addFacetPivotField("study_uri,acquisition_uri"); query.addFacetPivotField("entity,characteristic"); query.addFacetPivotField("platform_name,instrument_model"); try { QueryResponse queryResponse = solr.query(query, SolrRequest.METHOD.POST); solr.close(); SolrDocumentList results = queryResponse.getResults(); System.out.println("SolrDocumentList: " + results.size()); Iterator<SolrDocument> m = results.iterator(); while (m.hasNext()) { result.documents.add(convertFromSolr(m.next())); } if (queryResponse.getFacetFields() != null) { Iterator<FacetField> f = queryResponse.getFacetFields().iterator(); while (f.hasNext()) { FacetField field = f.next(); result.field_facets.put(field.getName(), new HashMap<String, Long>()); Iterator<Count> v = field.getValues().iterator(); while (v.hasNext()) { Count count = v.next(); Map<String, Long> map = result.field_facets.get(field.getName()); map.put(count.getName(), count.getCount()); } } } if (queryResponse.getFacetPivot() != null) { Iterator<Entry<String, List<PivotField>>> iter = queryResponse.getFacetPivot().iterator(); while (iter.hasNext()) { Entry<String, List<PivotField>> entry = iter.next(); List<Pivot> parents = new ArrayList<Pivot>(); result.pivot_facets.put(entry.getKey(), parents); System.out.println("PIVOT: " + entry.getKey()); List<PivotField> listPivotField = entry.getValue(); System.out.println("List<PivotField> size: " + listPivotField.size()); Iterator<PivotField> iterParents = listPivotField.iterator(); while (iterParents.hasNext()) { PivotField pivot = iterParents.next(); Pivot parent = new Pivot(); if (pivot.getField().equals("study_uri")) { docSize += pivot.getCount(); } parent.field = pivot.getField(); parent.value = pivot.getValue().toString(); parent.count = pivot.getCount(); parents.add(parent); System.out.println("PIVOT FIELD: " + pivot.getField()); System.out.println("PIVOT VALUE: " + pivot.getValue().toString()); System.out.println("PIVOT COUNT: " + pivot.getCount()); List<PivotField> subPivotFiled = pivot.getPivot(); if(null != subPivotFiled){ Iterator<PivotField> iterChildren = subPivotFiled.iterator(); while (iterChildren.hasNext()) { pivot = iterChildren.next(); Pivot child = new Pivot(); child.field = pivot.getField(); child.value = pivot.getValue().toString(); child.count = pivot.getCount(); parent.children.add(child); System.out.println("PIVOT FIELD: " + pivot.getField()); System.out.println("PIVOT VALUE: " + pivot.getValue().toString()); System.out.println("PIVOT COUNT: " + pivot.getCount()); } } } } } } catch (SolrServerException e) { System.out.println("[ERROR] Measurement.find() - SolrServerException message: " + e.getMessage()); } catch (IOException e) { System.out.println("[ERROR] Measurement.find() - IOException message: " + e.getMessage()); } catch (Exception e) { System.out.println("[ERROR] Measurement.find() - Exception message: " + e.getMessage()); } result.setDocumentSize((long)docSize); return result; } public static long getNumByDataAcquisition(DataAcquisition dataAcquisition) { SolrClient solr = new HttpSolrClient( Play.application().configuration().getString("hadatac.solr.data") + Collections.DATA_ACQUISITION); SolrQuery query = new SolrQuery(); query.set("q", "acquisition_uri:\"" + dataAcquisition.getUri() + "\""); query.set("rows", "10000000"); try { QueryResponse response = solr.query(query); solr.close(); SolrDocumentList results = response.getResults(); // Update the data set URI list dataAcquisition.deleteAllDatasetURIs(); Iterator<SolrDocument> iter = results.iterator(); while (iter.hasNext()) { SolrDocument doc = iter.next(); if (doc.getFieldValue("dataset_uri") != null) { dataAcquisition.addDatasetUri(doc.getFieldValue("dataset_uri").toString()); } } return results.getNumFound(); } catch (Exception e) { System.out.println("[ERROR] Measurement.findByDataAcquisitionUri(acquisition_uri) - Exception message: " + e.getMessage()); } return 0; } public static List<Measurement> findByDataAcquisitionUri(String acquisition_uri) { List<Measurement> listMeasurement = new ArrayList<Measurement>(); SolrClient solr = new HttpSolrClient( Play.application().configuration().getString("hadatac.solr.data") + Collections.DATA_ACQUISITION); SolrQuery query = new SolrQuery(); query.set("q", "acquisition_uri:\"" + acquisition_uri + "\""); query.set("rows", "10000000"); try { QueryResponse response = solr.query(query); solr.close(); SolrDocumentList results = response.getResults(); Iterator<SolrDocument> i = results.iterator(); while (i.hasNext()) { Measurement measurement = convertFromSolr(i.next()); listMeasurement.add(measurement); } } catch (Exception e) { System.out.println("[ERROR] Measurement.findByDataAcquisitionUri(acquisition_uri) - Exception message: " + e.getMessage()); } return listMeasurement; } public static Measurement convertFromSolr(SolrDocument doc) { Measurement m = new Measurement(); m.setUri(doc.getFieldValue("uri").toString()); m.setOwnerUri(doc.getFieldValue("owner_uri").toString()); m.setAcquisitionUri(doc.getFieldValue("acquisition_uri").toString()); m.setStudyUri(doc.getFieldValue("study_uri").toString()); m.setObjectUri(doc.getFieldValue("object_uri").toString()); if (doc.getFieldValue("timestamp") != null) { m.setTimestamp(doc.getFieldValue("timestamp").toString()); } m.setValue(doc.getFieldValue("value").toString()); m.setUnit(doc.getFieldValue("unit").toString()); m.setUnitUri(doc.getFieldValue("unit_uri").toString()); m.setEntity(doc.getFieldValue("entity").toString()); m.setEntityUri(doc.getFieldValue("entity_uri").toString()); m.setCharacteristic(doc.getFieldValue("characteristic").toString()); m.setCharacteristicUri(doc.getFieldValue("characteristic_uri").toString()); m.setInstrumentModel(doc.getFieldValue("instrument_model").toString()); m.setInstrumentUri(doc.getFieldValue("instrument_uri").toString()); m.setPlatformName(doc.getFieldValue("platform_name").toString()); m.setPlatformUri(doc.getFieldValue("platform_uri").toString()); if (doc.getFieldValue("location") !=null) { m.setLocation(doc.getFieldValue("location").toString()); } if (doc.getFieldValue("elevation") !=null) { m.setElevation(Double.parseDouble(doc.getFieldValue("elevation").toString())); } m.setDatasetUri(doc.getFieldValue("dataset_uri").toString()); return m; } }