This checkin changes the underlying representation of TimelineTimes
objects, both in memory and in the database.  Both in the db and in
the TimelineTimes object, time sequences are compressed with deltas
and repeat counts.  To provide a way to get at the times in the
compressed sequence, and TimeCursor class is used to scan the
compressed bytes of the TimelineTimes object.

This checkin also eliminates the sampleNumber arg to processSamples()
and processOneSample().  That arg started at zero for each chunk
scanned, and so was not very useful now that it's no longer needed to
retrieve times.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineOpcode.java:
util/src/main/java/com/ning/arecibo/util/timeline/TimelineCoder.java:

    New units that define the opcodes and provide compression and
    decompression of time sequences.

util/src/test/java/com/ning/arecibo/util/timeline/TestTimelineCoder.java:

    A unit test for the TimelineCoder.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineTimes.java:

    Replace the List<Integer> times with byte[] compressedTimes, and
    add data member sampleCount.

    In both constructors, save the times as compressed bytes.

    Delete the getSampleTimestamp() method and replace getTimeArray()
    with getCompressedTimes().

collector/src/main/java/com/ning/arecibo/collector/persistent/TimelineAggregator.java:
util/src/main/java/com/ning/arecibo/util/timeline/DefaultTimelineDAO.java:

    Conform to the renaming of getTimeArray to getCompressedTimes().

collector/src/test/java/com/ning/arecibo/collector/TestEventCollectorServer.java:

    Get the times from the TimeCursors instead of calling
    getSampleTimestamp().

util/src/main/java/com/ning/arecibo/util/timeline/SampleProcessor.java:
util/src/main/java/com/ning/arecibo/util/timeline/TimeRangeSampleProcessor.java:

    Replace the TimelinesTime arg with a TimeCursor arg, and eliminate
    the sampleNumber arg.

util/src/main/java/com/ning/arecibo/util/timeline/DecimatingSampleFilter.java:

    Conform to the renaming of getTimeArray to getCompressedTimes(),
    and the processOneSample() signature, and keep a sampleNumber of
    our own.

util/src/main/java/com/ning/arecibo/util/timeline/SampleCoder.java:

    Conform to the processSamples() signature.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineChunkAndTimes.java:
util/src/test/java/com/ning/arecibo/util/timeline/TestDecimatingFilter.java:

    Conform to the processOneSample() signature.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineChunkAndTimesDecoded.java:

    Conform to the processSamples() signature.

util/src/test/java/com/ning/arecibo/util/timeline/TestTimelineChunkAccumulator.java:

    Conform to the processSamples() signature, and keep a sampleNumber of
    our own.

util/src/main/java/com/ning/arecibo/util/timeline/TimeCursor.java:

    Pass compressedTimes to the TimelineTimesConstructor.
This checkin stores the timeline_times compressed times and the
timeline_chunks compressed samples in the row if they are 400 bytes or
shorter, and in a blob otherwise.  It's an incompatible db schema
change.

collector/src/main/resources/collector.sql:

    In timeline_times, replace the times blob with a varbinary
    in_row_times and a blob called blob_times.

    In timeline_chunks, replace the sample_bytes blob with a varbinary
    in_row_samples and a blob called blob_samples.

util/src/main/java/com/ning/arecibo/util/timeline/DefaultTimelineDAO.java:

    In insertTimelineChunk() and insertTimelineTimes(), if the
    compressed samples are more than 400 bytes, insert into the blob;
    else insert into the in-row varbinary.

    In the three places where samples and times are queried, get both
    the in-row varbinary and the blob for each.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineChunk.java:

    In the currently-unused TimelineChunk mapper, use the in-row
    varbinary if it's not null, otherwise the blob.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineTimes.java:

    In the currently-unused TimelineTimes mapper, use the in-row
    varbinary if it's not null, otherwise the blob.

util/src/main/java/com/ning/arecibo/util/timeline/TimelineChunkAndTimes.java:

    The folder in this unit is where TimelineTimes and TimelineChunks
    result set values are mapped.  Use the in-row varbinaries if they
    are non-null; otherwise the blob.