예제 #1
0
  @Override
  public void saveSignalInfo(List<SignalMetadata> signalInfo) {
    PersistenceManager manager = PMF.getManager();
    try {
      List<SignalInfo> signals = new ArrayList<SignalInfo>();
      List<SignalInfoAvg> signalsAvg = new ArrayList<SignalInfoAvg>();
      Extent<SignalInfoAvg> allSignalInfoAvg = manager.getExtent(SignalInfoAvg.class);

      for (SignalInfoAvg savg : allSignalInfoAvg) {
        signalsAvg.add(savg);
      }

      for (SignalMetadata s : signalInfo) {
        signals.add(
            new SignalInfo(
                s.getClientId(),
                s.getCarrier(),
                s.getLatitude(),
                s.getLongitude(),
                s.getAccuracy(),
                s.getPhoneType(),
                s.getTime(),
                s.getSignal()));

        // Do not add datapoint to consolidated datastore if accuracy is poor or faulty
        if (s.getAccuracy() < 20.0 && s.getAccuracy() > 0) {
          // Longitude and latitude are multiples of 0.001, roughly 100m by 100m
          DecimalFormat threeForm = new DecimalFormat("#.###");
          double longitude = Double.valueOf(threeForm.format(s.getLongitude()));
          double latitude = Double.valueOf(threeForm.format(s.getLatitude()));
          SignalInfoAvg signal =
              new SignalInfoAvg(longitude, latitude, s.getCarrier(), s.getPhoneType());
          int index = signalsAvg.indexOf(signal);

          if (index == -1) {
            signal.setSignal(s.getSignal());
            signalsAvg.add(signal);
          } else {
            signalsAvg.get(index).update(s.getSignal());
          }
        }
      }
      manager.makePersistentAll(signals);
      manager.makePersistentAll(signalsAvg);
    } finally {
      manager.close();
    }
  }
예제 #2
0
  @Override
  public List<SignalMetadata> getAllSignalListAvg() {
    PersistenceManager manager = PMF.getManager();
    try {
      ArrayList<SignalMetadata> signalInfo = new ArrayList<SignalMetadata>();
      Extent<SignalInfoAvg> allSignalInfoAvg = manager.getExtent(SignalInfoAvg.class);

      for (SignalInfoAvg s : allSignalInfoAvg) {
        signalInfo.add(s.getSignalMetadata());
      }

      return signalInfo;

    } finally {
      manager.close();
    }
  }
예제 #3
0
  @Override
  public List<SignalMetadata> getSignalList(
      Double minLatitude,
      Double minLongitude,
      Double maxLatitude,
      Double maxLongitude,
      List<String> carrierParams,
      List<String> phoneTypes,
      String clientId) {
    PersistenceManager manager = PMF.getManager();

    // If no carrier is specified, show points from all carriers
    if (carrierParams == null) {
      String[] carrierList = {"att", "verizon", "tmobile", "sprint"};
      carrierParams = Arrays.asList(carrierList);
    }

    // If no phoneType is specified, show points from all phoneTypes
    if (phoneTypes == null) {
      String[] phoneList = {"0", "1", "2", "3"};
      phoneTypes = Arrays.asList(phoneList);
    }

    // If user requests data for a region of size larger than 1.0000 by 1.0000 (about 11km by 11km),
    // only the center 1.0000 by 1.0000 of data will be returned
    if (maxLatitude - minLatitude > 1.0) {
      Double center = (maxLatitude + minLatitude) / 2.0;
      maxLatitude = center + .5;
      minLatitude = center - .5;
    }
    if (maxLongitude - minLongitude > 1.0) {
      Double centerl = (maxLongitude + minLongitude) / 2.0;
      maxLongitude = centerl + .5;
      minLongitude = centerl - .5;
    }

    try {
      ArrayList<SignalMetadata> signalInfo = new ArrayList<SignalMetadata>();

      // If clientId is absent, returns data within the given geographic box
      // for the given phoneType and carrier from the consolidated datastore
      if (clientId == null) {
        Query q = manager.newQuery(SignalInfoAvg.class);
        q.declareImports("import java.util.List");
        Object[] parameters = {minLatitude, maxLatitude, carrierParams, phoneTypes};
        q.declareParameters(
            "Double minLatitude, Double maxLatitude, List carrierParams, List phoneTypes");
        q.setFilter(
            "latitude >= minLatitude && latitude <= maxLatitude && carrierParams.contains(carrier) && phoneTypes.contains(phoneType)");

        List<SignalInfoAvg> allSignalInfo = (List<SignalInfoAvg>) q.executeWithArray(parameters);
        // Extent<SignalInfo> allSignalInfo = manager.getExtent(SignalInfo.class);

        ArrayList<SignalInfoAvg> filtered = new ArrayList<SignalInfoAvg>();
        for (SignalInfoAvg savg : allSignalInfo) {
          if (savg.getLongitude() >= minLongitude && savg.getLongitude() <= maxLongitude) {
            filtered.add(savg);
          }
        }

        for (SignalInfoAvg s : filtered) {
          signalInfo.add(s.getSignalMetadata());
        }

      } else {
        // If clientId is present, returns raw data of the given clientId,
        // phoneType, and carrier within the given geographic box
        Query q = manager.newQuery(SignalInfo.class);
        q.declareImports("import java.util.List");
        Object[] parameters = {minLatitude, maxLatitude, carrierParams, phoneTypes, clientId};
        q.declareParameters(
            "Double minLatitude, Double maxLatitude, List<String> carrierParams, List<String> phoneTypes, String myClientId");
        q.setFilter(
            "clientId == myClientId && latitude >= minLatitude && latitude <= maxLatitude && carrier == carrierParams && phoneType == phoneTypes");

        List<SignalInfo> allSignalInfo = (List<SignalInfo>) q.executeWithArray(parameters);
        // Extent<SignalInfo> allSignalInfo = manager.getExtent(SignalInfo.class);

        ArrayList<SignalInfo> filtered = new ArrayList<SignalInfo>();
        for (SignalInfo s : allSignalInfo) {
          if (s.getLongitude() >= minLongitude && s.getLongitude() <= maxLongitude) {
            filtered.add(s);
          }
        }

        for (SignalInfo s : filtered) {
          signalInfo.add(s.getSignalMetadata());
        }
      }

      return signalInfo;
    } finally {
      manager.close();
    }
  }