protected function createPropertyValue(array $arr_field_def, $mix_value)
{
$obj_property_value = new \stdClass();
// Indexed?
$bol_index = TRUE;
if (isset($arr_field_def['index']) && FALSE === $arr_field_def['index']) {
$bol_index = FALSE;
}
$obj_property_value->excludeFromIndexes = !$bol_index;
switch ($arr_field_def['type']) {
case Schema::PROPERTY_STRING:
$obj_property_value->stringValue = (string) $mix_value;
break;
case Schema::PROPERTY_INTEGER:
$obj_property_value->integerValue = $mix_value;
break;
case Schema::PROPERTY_DATETIME:
if ($mix_value instanceof \DateTime) {
$obj_dtm = $mix_value;
} else {
$obj_dtm = new \DateTime($mix_value);
}
// A timestamp in RFC3339 UTC "Zulu" format, accurate to nanoseconds. Example: "2014-10-02T15:01:23.045123456Z".
$obj_property_value->timestampValue = $obj_dtm->format(self::DATETIME_FORMAT);
break;
case Schema::PROPERTY_DOUBLE:
case Schema::PROPERTY_FLOAT:
$obj_property_value->doubleValue = floatval($mix_value);
break;
case Schema::PROPERTY_BOOLEAN:
$obj_property_value->booleanValue = (bool) $mix_value;
break;
case Schema::PROPERTY_GEOPOINT:
if ($mix_value instanceof Geopoint) {
/** @var Geopoint $mix_value */
$obj_property_value->geoPointValue = (object) ["latitude" => $mix_value->getLatitude(), "longitude" => $mix_value->getLongitude()];
} elseif (is_array($mix_value)) {
$obj_property_value->geoPointValue = (object) ["latitude" => $mix_value[0], "longitude" => $mix_value[1]];
} else {
throw new \InvalidArgumentException('Geopoint property data not supported: ' . gettype($mix_value));
}
break;
case Schema::PROPERTY_STRING_LIST:
// Docs: "A Value instance that sets field arrayValue must not set fields meaning or excludeFromIndexes."
$arr_values = [];
foreach ((array) $mix_value as $str) {
$obj_value = (object) ['stringValue' => $str];
$obj_value->excludeFromIndexes = !$bol_index;
$arr_values[] = $obj_value;
}
$obj_property_value->arrayValue = (object) ['values' => $arr_values];
break;
default:
throw new \RuntimeException('Unable to process field type: ' . $arr_field_def['type']);
}
return $obj_property_value;
}