Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [geomesa-dev] Geomesa Feature Count always returning zero!!!

Hmm, looking into our cached stats calculations, I think there is a bug when there is no date field for the data. This may be why you're getting 0 back for the estimated count. Let me look into it some more.

Thanks,

Emilio

On 04/25/2017 06:16 AM, Suresh Prajapati wrote:
Hello Everyone

I am developing geomesa client to perform basic read write and delete operations. I have also created a function which will return matching feature count for specified query, however it always returns zero, i also tried DataStore stats for fetching the matching feature count but it is very slow. Below is my client code: 

package com.hps;


import java.io.FileInputStream;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

import java.util.Arrays;

import java.util.Map;


import org.geotools.data.DataStore;

import org.geotools.data.DataStoreFinder;

import org.geotools.data.FeatureSource;

import org.geotools.data.FeatureStore;

import org.geotools.data.Query;

import org.geotools.data.Transaction;

import org.geotools.data.shapefile.dbf.DbaseFileHeader;

import org.geotools.data.simple.SimpleFeatureIterator;

import org.geotools.data.simple.SimpleFeatureSource;

import org.geotools.factory.Hints;

import org.geotools.filter.text.cql2.CQL;

import org.geotools.filter.text.ecql.ECQL;

import org.geotools.geometry.jts.JTSFactoryFinder;

import org.locationtech.geomesa.accumulo.data.AccumuloAppendFeatureWriter;

import org.locationtech.geomesa.accumulo.data.AccumuloDataStore;

import org.locationtech.geomesa.index.utils.ExplainLogging;

import org.locationtech.geomesa.utils.interop.SimpleFeatureTypes;

import org.opengis.feature.simple.SimpleFeature;

import org.opengis.feature.simple.SimpleFeatureType;


import com.hps.schemas.Event;

import com.hps.schemas.QueryAdvanced;

import com.hps.schemas.QueryBasic;

import com.vividsolutions.jts.geom.Coordinate;


public class GeomesaClient {

  private AccumuloDataStore ds = null;

  private AccumuloAppendFeatureWriter fw = null;

  private SimpleFeatureSource sfs = null;

  private FeatureSource fs = null;

  private String tableName = "";

  private boolean isFlushed = true;

  private long lastFlushTs = 0;

  private FeatureStore fst = null;

  private SimpleFeatureType sft;


  public interface QueryListener {

    public void onFeature(SimpleFeature f);

  }


  public GeomesaClient(Map<String, String> dsConfthrows Exception {

    this.ds = (AccumuloDataStore) DataStoreFinder.getDataStore(dsConf);

    this.tableName = dsConf.get("tableName");


    sft = createFeatureType();


    if(!Arrays.asList(this.ds.getTypeNames()).contains(sft.getTypeName())){

      ds.createSchema(sft);

    }


    this.fw = (AccumuloAppendFeatureWriter) (this.ds.getFeatureWriterAppend(sft.getTypeName(),

        Transaction.AUTO_COMMIT));

    this.sfs = ds.getFeatureSource(sft.getTypeName());

    this.fs = ((DataStore) ds).getFeatureSource(sft.getTypeName());


    this.fst = (FeatureStoresfs;

  }


  private SimpleFeatureType createFeatureType() {

    try{

      StringBuilder simpleFeatureTypeBuilder = new StringBuilder();

      simpleFeatureTypeBuilder.append("r:Long:index=true:cardinality=high,");


      // device data

      // "*g:Point:srid=4326," + "di:Integer:index=full:cardinality=high," +

      // "al:Float:index=join:cardinality=low,"

      // + "s:Float:index=join:cardinality=low," +

      // "b:Float:index=join:cardinality=low,"

      // + "an:Float:index=join:cardinality=low," +

      // "he:Float:index=join:cardinality=low,"

      // + "ve:Float:index=join:cardinality=low," +

      // "t:Float:index=join:cardinality=low,"

      // + "m:Boolean:index=join:cardinality=low," +

      // "i:Boolean:index=join:cardinality=low,"

      // + "ts:Long:index=join:cardinality=low;" +

      // "geomesa.indexes.enabled='attr_idx,records,z2'";


      // simpleFeatureTypeBuilder.append("*g:Point:srid=4326,");

      // simpleFeatureTypeBuilder.append("di:Integer,");

      // simpleFeatureTypeBuilder.append("al:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("s:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("b:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("an:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("he:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("ve:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("t:Float:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("m:Boolean:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("i:Boolean:index=join:cardinality=low,");

      // simpleFeatureTypeBuilder.append("ts:Long:index=join:cardinality=low;");


      simpleFeatureTypeBuilder.append("*g:Point:srid=4326,");

      simpleFeatureTypeBuilder.append("di:Integer,");

      simpleFeatureTypeBuilder.append("al:Float,");

      simpleFeatureTypeBuilder.append("s:Float,");

      simpleFeatureTypeBuilder.append("b:Float,");

      simpleFeatureTypeBuilder.append("an:Float,");

      simpleFeatureTypeBuilder.append("he:Float,");

      simpleFeatureTypeBuilder.append("ve:Float,");

      simpleFeatureTypeBuilder.append("t:Float,");

      simpleFeatureTypeBuilder.append("m:Boolean,");

      simpleFeatureTypeBuilder.append("i:Boolean,");

      simpleFeatureTypeBuilder.append("ts:Long;");


      simpleFeatureTypeBuilder.append("geomesa.indexes.enabled='attr,records,z2'");

      return SimpleFeatureTypes.createType(tableNamesimpleFeatureTypeBuilder.toString());

    }

    catch(Exception ex){

      ex.printStackTrace();

      return null;

    }

  }


  public void insert(Event event) {

    try{

      SimpleFeature sf = fw.next();

      sf.getUserData().put(Hints.USE_PROVIDED_FID, java.lang.Boolean.FALSE);


      sf.setAttribute("r"event.rideid);

      sf.setAttribute("di"event.devid);

      sf.setAttribute("g", JTSFactoryFinder.getGeometryFactory().createPoint(new Coordinate(event.latevent.lng)));

      sf.setAttribute("al"event.alt);

      sf.setAttribute("s"event.spd);

      sf.setAttribute("b"event.brg);

      sf.setAttribute("an"event.ang);

      sf.setAttribute("he"event.hepe);

      sf.setAttribute("ve"event.vepe);

      sf.setAttribute("t"event.temp);

      sf.setAttribute("m"event.motion);

      sf.setAttribute("i"event.ignition);

      sf.setAttribute("ts"event.ts);


      fw.write();

      isFlushed = false;

      flush(false);

    }

    catch(Exception ex){

      ex.printStackTrace();

    }

  }


  public void flush(boolean force) {

    if(!isFlushed && System.currentTimeMillis() - lastFlushTs >= 1000){

      fw.flush();

      isFlushed = true;

      lastFlushTs = System.currentTimeMillis();

      System.out.println("flush success");

    }

    else if(force){

      System.out.println("flush failed");

      lastFlushTs = System.currentTimeMillis();

    }

  }


  public void query(String queryStr, Integer limit, Integer offset, QueryListener ql) {

    System.out.println("queryString : " + queryStr);

    System.out.println("limit : " + limit);

    System.out.println("offset : " + offset);

    SimpleFeatureIterator iterator = null;

    try{

      if(queryStr != null && !queryStr.isEmpty()){


        Query query = new Query(tableName, CQL.toFilter(queryStr));

        // FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();

        // SortBy[] sort = new SortBy[] { ff.sort("ts", SortOrder.DESCENDING) };

        // query.setSortBy(sort);

        if(limit != null && limit > 0)

          query.setMaxFeatures(limit);

        if(offset != null && offset > 0)

          query.setStartIndex(offset);

        System.out.println("Query : " + query.toString());

        iterator = sfs.getFeatures(query).features();

        System.out.println("Before iterator while");

        while(iterator.hasNext()){

          ql.onFeature(iterator.next());

        }

        System.out.println("Exiting iterator while");

      }

    }

    catch(Exception ex){

      ex.printStackTrace();

    }

    finally{

      if(iterator != null)

        iterator.close();

    }

  }


  public int getRideCount(Long rideIdthrows Exception {

    int count = 0;

    if(rideId != null){

      count = fs.getCount(new Query(tableName, CQL.toFilter("r="+rideId)));

      //count = ((Long) (ds.stats().getCount(sft, CQL.toFilter("r=" + rideId), true).get())).intValue();

    }

    return count;

  }


  public void delete(QueryBasic criteriathrows Exception {

    fst.removeFeatures(ECQL.toFilter(getQuery(criteria)));

  }


  /*

   * Query/Filter functions

   */

  private void appendQuery(StringBuilder original, String query) {

    if(original.length() > 0)

      original.append(" AND ");

    original.append(query);

  }


  public String getQuery(QueryBasic filter) {

    StringBuilder qryStrBldr = null;

    try{


      if(filter != null){

        qryStrBldr = new StringBuilder();

        if(filter.rideid != null && filter.rideid >= -1){

          appendQuery(qryStrBldr"r = " + filter.rideid);

        }

        if(filter.devid != null && filter.devid > 0){

          appendQuery(qryStrBldr"di = " + filter.devid);

        }

        if(filter.tsFr != null && filter.tsFr > 0){

          appendQuery(qryStrBldr"ts >= " + filter.tsFr);

        }

        if(filter.tsTo != null && filter.tsTo > 0){

          appendQuery(qryStrBldr"ts <= " + filter.tsTo);

        }

      }

    }

    catch(Exception ex){

      ex.printStackTrace();

    }

    return qryStrBldr.toString();

  }


  public String getQuery(QueryAdvanced advanceFilter) {

    try{

      if(advanceFilter != null){

        QueryBasic basic = advanceFilter.basic;

        StringBuilder qryStrBldr = new StringBuilder();

        qryStrBldr.append(getQuery(basic));

        if(qryStrBldr.length() > 0){

          if(advanceFilter.latFr != null && advanceFilter.latTo != null && advanceFilter.lngFr != null

              && advanceFilter.lngTo != null){

            appendQuery(qryStrBldr"BBOX(g, " + advanceFilter.latFr + ", " + advanceFilter.lngFr + ", "

                + advanceFilter.latTo + ", " + advanceFilter.lngTo + ")");

          }

          if(advanceFilter.altFr != null && advanceFilter.altFr > 0){

            appendQuery(qryStrBldr"al >= " + advanceFilter.altFr);

          }

          if(advanceFilter.altTo != null && advanceFilter.altTo > 0){

            appendQuery(qryStrBldr"al <= " + advanceFilter.altTo);

          }

          if(advanceFilter.spdFr != null && advanceFilter.spdFr > 0){

            appendQuery(qryStrBldr"s >= " + advanceFilter.spdFr);

          }

          if(advanceFilter.spdTo != null && advanceFilter.spdTo > 0){

            appendQuery(qryStrBldr"s <= " + advanceFilter.spdTo);

          }

          if(advanceFilter.brgFr != null && advanceFilter.brgFr > 0){

            appendQuery(qryStrBldr"b >= " + advanceFilter.brgFr);

          }

          if(advanceFilter.brgTo != null && advanceFilter.brgTo > 0){

            appendQuery(qryStrBldr"b <= " + advanceFilter.brgTo);

          }

          if(advanceFilter.angFr != null && advanceFilter.angFr > 0){

            appendQuery(qryStrBldr"an >= " + advanceFilter.angFr);

          }

          if(advanceFilter.angTo != null && advanceFilter.angTo > 0){

            appendQuery(qryStrBldr"an <= " + advanceFilter.angTo);

          }

          if(advanceFilter.hepeFr != null && advanceFilter.hepeFr > 0){

            appendQuery(qryStrBldr"he >= " + advanceFilter.hepeFr);

          }

          if(advanceFilter.hepeTo != null && advanceFilter.hepeTo > 0){

            appendQuery(qryStrBldr"he <= " + advanceFilter.hepeTo);

          }

          if(advanceFilter.vepeFr != null && advanceFilter.vepeFr > 0){

            appendQuery(qryStrBldr"ve >= " + advanceFilter.vepeFr);

          }

          if(advanceFilter.vepeTo != null && advanceFilter.vepeTo > 0){

            appendQuery(qryStrBldr"ve <= " + advanceFilter.vepeTo);

          }

          if(advanceFilter.tempFr != null && advanceFilter.tempFr > 0){

            appendQuery(qryStrBldr"t >= " + advanceFilter.tempFr);

          }

          if(advanceFilter.tempTo != null && advanceFilter.tempTo > 0){

            appendQuery(qryStrBldr"t <= " + advanceFilter.tempTo);

          }

          if(advanceFilter.motion != null){

            appendQuery(qryStrBldr"m = " + advanceFilter.motion);

          }

          if(advanceFilter.ignition != null){

            appendQuery(qryStrBldr"i = " + advanceFilter.ignition);

          }

        }

        return qryStrBldr.toString();

      }

      return "";

    }

    catch(Exception ex){

      ex.printStackTrace();

      return "";

    }

  }

}



I am using getRideCount(Long rideId) function for fetching count. Can anyone help me in finding why it returning 0 though features exists in feature collections. or there exists other preferred techniques to fetch the matching feature count?. Any suggestion or clarifications are welcomed.

Thank You

Suresh Prajapati



_______________________________________________
geomesa-dev mailing list
geomesa-dev@xxxxxxxxxxxxxxxx
To change your delivery options, retrieve your password, or unsubscribe from this list, visit
https://dev.locationtech.org/mailman/listinfo/geomesa-dev


Back to the top