Snippets

Steve Adams Determine Dates from Ids

Created by Steve Adams
<?php

$listingBuckets = getFromRedisCache("listing_days_and_ids");
// OR
$listingBuckets = query("SELECT * FROM listing_days_and_ids WHERE day > NOW() - INTERVAL 45 DAY");

/**
 * We'd want to get these buckets and format them such that they fit this structure
 *
 * [
 *     2016-09-26 -> [
 *         id -> 1,
 *         listing_id_min -> 1
 *         listing_id_max -> 98
 *     ],
 *     2016-09-27 -> [
 *         id -> 2,
 *         listing_id_min -> 101,
 *         listing_id_max -> 205
 *     ]
 *     2016-09-28 -> [
 *         id -> 3,
 *         listing_id_min -> 211,
 *         listing_id_max -> 334
 *     ]
 * ]
 *
 * Something like
 *
 * $result = [];
 * foreach (listingDays as d) {
 *     $result[d["day"] = d;
 * }
 */

foreach ($resobj->results as $val) {
    $listingBucketsChanged = false;

    if ($val->date) {
        // If we have a new date to work with...
        if (in_array($val->date, $listingBuckets) && isLessThan45DaysOld($val->date)) {
            minId = $listingBuckets[$val->date]["listing_id_min"];
            maxId = $listingBuckets[$val->date]["listing_id_max"];

            // If this is a new max id for this day, insert it
            if ($val->id > $maxId) {
                minIdNextDay = $listingBuckets[$val->date + 1]["listing_id_min"];

                if ($val->id < minIdNextDay) {
                    query("INSERT INTO listing_days_and_ids (listing_id_max)
                        VALUES ({$val->id})
                        WHERE day = ${$val->date}
                    ");

                    $listingBuckets[$val->date]["listing_id_min"] = $val->id;
                    $listingBucketsChanged = true;
                }
            } elseif ($val->id < $minId) {
                // If this is a new min id for this day, insert it
                query("INSERT INTO listing_days_and_ids (listing_id_min)
                    VALUES ({$val->id})
                    WHERE day = ${$val->date}
                ");

                $listingBuckets[$val->date]["listing_id_max"] = $val->id;
                $listingBucketsChanged = true;
            }
        } else {
            // Add this new date, setting the min_id and max_id as this $val's ID
            query("INSERT INTO listing_days_and_ids (day, listing_id_min, listing_id_max)
                VALUES ({$val->date}, {$val->id}, {$val->id})
            ");

            $listingBuckets[$val->date] = [
                "listing_id_min" => $val->id,
                "listing_id_max" => $val->id
            ];
            $listingBucketsChanged = true;
        }
    } else {
        $val->date = getListingDateByIdRange($val, $listingBuckets);
    }

    if ($listingBucketsChanged) {
        cacheInRedis($listingBuckets);
    }
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.