static function lookup($exhibit_id, $address_field, $datum_id, $address)
 {
     global $wpdb;
     $table = WpExhibitConfig::table_name(WpExhibitConfig::$GEOCODE_TABLE_KEY);
     $sql = "SELECT lat, lng FROM {$table} WHERE exhibit_id = %d AND addressField = %s AND datum_id = %s AND address = %s;";
     $query = $wpdb->prepare($sql, $exhibit_id, $address_field, $datum_id, $address);
     $row = $wpdb->get_row($query, ARRAY_A);
     if ($row != NULL) {
         return array($row['lat'], $row['lng']);
     } else {
         try {
             // Delete any old address for <ExhibitID, AddressField, DatumID, *>
             $deleteSQL = "DELETE FROM {$table} WHERE exhibit_id = %d AND addressField = %s AND datum_id = %s;";
             $deleteQuery = $wpdb->prepare($deleteSQL, $exhibit_id, $address_field, $datum_id);
             $wpdb->query($deleteQuery);
             $geo_results = json_decode(WpExhibitGeocoder::geocode($address), true);
             $latlng = $geo_results['results'][0]['geometry']['location'];
             if ($latlng['lat'] == 0 && $latlng['lng'] == 0) {
                 return false;
             }
             $query = "INSERT INTO {$table}(lat, lng, exhibit_id, addressField, datum_id, address) VALUES(%f, %f, %d, %s, %s, %s)";
             $query = $wpdb->prepare($query, $latlng['lat'], $latlng['lng'], $exhibit_id, $address_field, $datum_id, $address);
             $wpdb->query($query);
         } catch (Exception $e) {
             return null;
         }
         return $latlng;
     }
 }