tw.flink.jcconf2016.streaming.taxipractice.datamodel.TaxiRide.java Source code

Java tutorial

Introduction

Here is the source code for tw.flink.jcconf2016.streaming.taxipractice.datamodel.TaxiRide.java

Source

/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package tw.flink.jcconf2016.streaming.taxipractice.datamodel;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.util.Locale;

/**
 * --------------- NOTE OF CODE ORIGIN FROM DATA-ARTISANS.COM ---------------
 * A duplicate of dataArtisans's implementation (https://github.com/dataArtisans/flink-training-exercises, ASL License).
 * --------------------------------------------------------------------------
 *
 * A TaxiRide is a taxi ride event. There are two types of events, a taxi ride start event and a
 * taxi ride end event. The isStart flag specifies the type of the event.
 *
 * A TaxiRide consists of
 * - the rideId of the event which is identical for start and end record
 * - the time of the event
 * - the longitude of the start location
 * - the latitude of the start location
 * - the longitude of the end location
 * - the latitude of the end location
 * - the passengerCnt of the ride
 * - the travelDistance which is -1 for start events
 *
 */
public class TaxiRide {

    private static transient DateTimeFormatter timeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
            .withLocale(Locale.US).withZoneUTC();

    public TaxiRide() {
    }

    public TaxiRide(long rideId, boolean isStart, DateTime startTime, DateTime endTime, float startLon,
            float startLat, float endLon, float endLat, short passengerCnt) {

        this.rideId = rideId;
        this.isStart = isStart;
        this.startTime = startTime;
        this.endTime = endTime;
        this.startLon = startLon;
        this.startLat = startLat;
        this.endLon = endLon;
        this.endLat = endLat;
        this.passengerCnt = passengerCnt;
    }

    public long rideId;
    public boolean isStart;
    public DateTime startTime;
    public DateTime endTime;
    public float startLon;
    public float startLat;
    public float endLon;
    public float endLat;
    public short passengerCnt;

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(rideId).append(",");
        sb.append(isStart ? "START" : "END").append(",");
        if (isStart) {
            sb.append(startTime.toString(timeFormatter)).append(",");
            sb.append(endTime.toString(timeFormatter)).append(",");
        } else {
            sb.append(endTime.toString(timeFormatter)).append(",");
            sb.append(startTime.toString(timeFormatter)).append(",");
        }
        sb.append(startLon).append(",");
        sb.append(startLat).append(",");
        sb.append(endLon).append(",");
        sb.append(endLat).append(",");
        sb.append(passengerCnt);

        return sb.toString();
    }

    public static TaxiRide fromString(String line) {

        String[] tokens = line.split(",");
        if (tokens.length != 9) {
            throw new RuntimeException("Invalid record: " + line);
        }

        TaxiRide ride = new TaxiRide();

        try {
            ride.rideId = Long.parseLong(tokens[0]);

            switch (tokens[1]) {
            case "START":
                ride.isStart = true;
                ride.startTime = DateTime.parse(tokens[2], timeFormatter);
                ride.endTime = DateTime.parse(tokens[3], timeFormatter);
                break;
            case "END":
                ride.isStart = false;
                ride.endTime = DateTime.parse(tokens[2], timeFormatter);
                ride.startTime = DateTime.parse(tokens[3], timeFormatter);
                break;
            default:
                throw new RuntimeException("Invalid record: " + line);
            }

            ride.startLon = tokens[4].length() > 0 ? Float.parseFloat(tokens[4]) : 0.0f;
            ride.startLat = tokens[5].length() > 0 ? Float.parseFloat(tokens[5]) : 0.0f;
            ride.endLon = tokens[6].length() > 0 ? Float.parseFloat(tokens[6]) : 0.0f;
            ride.endLat = tokens[7].length() > 0 ? Float.parseFloat(tokens[7]) : 0.0f;
            ride.passengerCnt = Short.parseShort(tokens[8]);

        } catch (NumberFormatException nfe) {
            throw new RuntimeException("Invalid record: " + line, nfe);
        }

        return ride;
    }

    @Override
    public boolean equals(Object other) {
        return other instanceof TaxiRide && this.rideId == ((TaxiRide) other).rideId;
    }

    @Override
    public int hashCode() {
        return (int) this.rideId;
    }

}