Skip to content

Commit

Permalink
Continued changes to decouple core lib from http interface. Added met…
Browse files Browse the repository at this point in the history
…adata support on object.
  • Loading branch information
Christopher Mancini committed Sep 14, 2015
1 parent cb6b6ae commit b501542
Show file tree
Hide file tree
Showing 11 changed files with 71 additions and 48 deletions.
14 changes: 12 additions & 2 deletions src/Riak/Api/Http.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
namespace Basho\Riak\Api;

use Basho\Riak\Api;
use Basho\Riak\Api\Http\Translators\SecondaryIndexHeaderTranslator;
use Basho\Riak\Api\Http\Translators\SecondaryIndexTranslator;
use Basho\Riak\ApiInterface;
use Basho\Riak\Bucket;
use Basho\Riak\Command;
Expand All @@ -36,6 +36,7 @@ class Http extends Api implements ApiInterface
// Header keys
const VCLOCK_KEY = 'X-Riak-Vclock';
const CONTENT_TYPE_KEY = 'Content-Type';
const METADATA_PREFIX = 'X-Riak-Meta-';

/**
* cURL connection handle
Expand Down Expand Up @@ -146,6 +147,10 @@ protected function buildPath()
case 'Basho\Riak\Command\Object\Fetch':
case 'Basho\Riak\Command\Object\Store':
case 'Basho\Riak\Command\Object\Delete':
// to allow siblings
if ($this->command->getMethod() == 'GET') {
$this->headers['Accept'] = 'multipart/mixed, */*';
}
$this->path = sprintf('/types/%s/buckets/%s/keys/%s', $bucket->getType(), $bucket->getName(), $key);
break;
case 'Basho\Riak\Command\DataType\Counter\Fetch':
Expand Down Expand Up @@ -361,11 +366,16 @@ protected function prepareRequestHeaders()
}

// setup index headers
$translator = new SecondaryIndexHeaderTranslator();
$translator = new SecondaryIndexTranslator();
$indexHeaders = $translator->createHeadersFromIndexes($object->getIndexes());
foreach ($indexHeaders as $value) {
$curl_headers[] = sprintf('%s: %s', $value[0], $value[1]);
}

// setup metadata headers
foreach($object->getMetaData() as $key => $value) {
$curl_headers[] = sprintf('%s%s: %s', self::METADATA_PREFIX, $key, $value);
}
}

// set the request headers on the connection
Expand Down
2 changes: 1 addition & 1 deletion src/Riak/Api/Http/Translators/SecondaryIndexTranslator.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
/**
* @author Alex Moore <amoore at basho d0t com>
*/
class SecondaryIndexHeaderTranslator
class SecondaryIndexTranslator
{
const INT_INDEX_SUFFIX = '_int';
const STR_IDX_SUFFIX = '_bin';
Expand Down
1 change: 0 additions & 1 deletion src/Riak/Command.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ public function __construct(Builder $builder)
{
$this->riak = $builder->getConnection();
$this->parameters = $builder->getParameters();
$this->headers = $builder->getHeaders();
$this->verbose = $builder->getVerbose();
}

Expand Down
19 changes: 0 additions & 19 deletions src/Riak/Command/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,20 +92,6 @@ public function withParameters($parameters = [])
return $this;
}

public function withHeader($key, $value = true)
{
$this->headers[$key] = $value;

return $this;
}

public function withHeaders($headers = [])
{
$this->headers = $headers;

return $this;
}

public function withVerboseMode($verbose = true)
{
$this->verbose = $verbose;
Expand All @@ -118,11 +104,6 @@ public function getParameters()
return $this->parameters;
}

public function getHeaders()
{
return $this->headers;
}

public function getConnection()
{
return $this->riak;
Expand Down
2 changes: 0 additions & 2 deletions src/Riak/Command/Builder/FetchObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ class FetchObject extends Command\Builder implements Command\BuilderInterface
public function __construct(Riak $riak)
{
parent::__construct($riak);

$this->headers['Accept'] = 'multipart/mixed, */*';
}

/**
Expand Down
5 changes: 4 additions & 1 deletion src/Riak/Command/Builder/ObjectTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ trait ObjectTrait
*/
protected $object = NULL;

/**
* @return Object|null
*/
public function getObject()
{
return $this->object;
Expand Down Expand Up @@ -78,4 +81,4 @@ public function buildJsonObject($data)

return $this;
}
}
}
7 changes: 6 additions & 1 deletion src/Riak/Command/Object/Store.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@
*/
class Store extends Command\Object implements CommandInterface
{
/**
* Type of operation
*
* @var string
*/
protected $method = 'POST';

public function __construct(Command\Builder\StoreObject $builder)
Expand All @@ -42,4 +47,4 @@ public function __construct(Command\Builder\StoreObject $builder)
$this->method = 'PUT';
}
}
}
}
39 changes: 35 additions & 4 deletions src/Riak/Object.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
namespace Basho\Riak;

use Basho\Riak;
use Basho\Riak\Api\Http\Translators\SecondaryIndexHeaderTranslator;
use Basho\Riak\Api\Http\Translators\SecondaryIndexTranslator;

/**
* Main class for data objects in Riak
Expand All @@ -44,6 +44,8 @@ class Object

protected $charset = 'utf-8';

protected $metadata = [];

/**
* @param mixed|null $data
* @param array|null $headers DEPRECATED
Expand All @@ -56,7 +58,7 @@ public function __construct($data = null, $headers = [])
return;
}

$translator = new SecondaryIndexHeaderTranslator();
$translator = new SecondaryIndexTranslator();
$this->indexes = $translator->extractIndexesFromHeaders($headers);

// to prevent breaking the interface, parse $headers and place important stuff in new home
Expand All @@ -74,6 +76,13 @@ public function __construct($data = null, $headers = [])
if (!empty($headers[Riak\Api\Http::VCLOCK_KEY])) {
$this->content_type = $headers[Riak\Api\Http::VCLOCK_KEY];
}

// pull out metadata headers
foreach($headers as $key => $value) {
if (strpos($key, Riak\Api\Http::METADATA_PREFIX) !== false) {
$this->metadata[substr($key, strlen(Riak\Api\Http::METADATA_PREFIX))] = $value;
}
}
}

public function getData()
Expand Down Expand Up @@ -176,8 +185,8 @@ private function validateIndexNameAndValue($indexName, $value)
"'index. Expecting '*_int' for an integer index, or '*_bin' for a string index.");
}

$isIntIndex = SecondaryIndexHeaderTranslator::isIntIndex($indexName);
$isStringIndex = SecondaryIndexHeaderTranslator::isStringIndex($indexName);
$isIntIndex = SecondaryIndexTranslator::isIntIndex($indexName);
$isStringIndex = SecondaryIndexTranslator::isStringIndex($indexName);

if (!$isIntIndex && !$isStringIndex) {
throw new \InvalidArgumentException("Invalid index type for '" . $indexName .
Expand Down Expand Up @@ -213,4 +222,26 @@ public function removeValueFromIndex($indexName, $value)

return $this;
}

public function setMetaDataValue($key, $value = '')
{
$this->metadata[$key] = $value;
return $this;
}

public function getMetaDataValue($key)
{
return $this->metadata[$key];
}

public function removeMetaDataValue($key)
{
unset($this->metadata[$key]);
return $this;
}

public function getMetaData()
{
return $this->metadata;
}
}
6 changes: 3 additions & 3 deletions tests/unit/Riak/Api/Translators/SecondaryIndexHeaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SecondaryIndexHeaderTest extends TestCase
public function testExtractIndexes()
{
$headers = ['My-Header' => 'cats', 'x-riak-index-foo_bin' => 'bar, baz', 'x-riak-index-foo_int' => '42, 50'];
$translator = new Api\Http\Translators\SecondaryIndexHeaderTranslator();
$translator = new Api\Http\Translators\SecondaryIndexTranslator();

$indexes = $translator->extractIndexesFromHeaders($headers);

Expand All @@ -47,7 +47,7 @@ public function testExtractIndexes()
public function testExtractIndexesNoHeaders()
{
$headers = [];
$translator = new Api\Http\Translators\SecondaryIndexHeaderTranslator();
$translator = new Api\Http\Translators\SecondaryIndexTranslator();
$indexes = $translator->extractIndexesFromHeaders($headers);

// Check that we get an empty array back.
Expand All @@ -58,7 +58,7 @@ public function testExtractIndexesNoHeaders()
public function testCreateHeaders()
{
$indexes = ['foo_bin' => ['bar', 'baz'], 'foo_int' => [42, 50]];
$translator = new Api\Http\Translators\SecondaryIndexHeaderTranslator();
$translator = new Api\Http\Translators\SecondaryIndexTranslator();

$headers = $translator->createHeadersFromIndexes($indexes);

Expand Down
6 changes: 1 addition & 5 deletions tests/unit/Riak/Command/Builder/FetchObjectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ public function testFetch($riak)
$command = $builder->build();

$this->assertEquals('some_type', $command->getBucket()->getType());

$headers = $builder->getHeaders();
$this->assertTrue(isset($headers['Accept']));
$this->assertEquals('multipart/mixed, */*', $headers['Accept']);
}

/**
Expand All @@ -73,4 +69,4 @@ public function testValidateLocation($riak)
$builder->buildBucket('some_bucket');
$builder->build();
}
}
}
18 changes: 9 additions & 9 deletions tests/unit/Riak/Command/Builder/StoreObjectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

namespace Basho\Tests\Riak\Command\Builder;

use Basho\Riak\Api\Http;
use Basho\Riak\Command;
use Basho\Tests\TestCase;

Expand Down Expand Up @@ -112,22 +113,21 @@ public function testValidateBucket($riak)
*/
public function testStoreObjectWithIndexGeneratesHeaders($riak)
{
$inputHeaders = ['My-Header' => 'cats', 'x-riak-index-foo_bin' => 'bar, baz', 'x-riak-index-foo_int' => '42, 50'];
$inputHeaders = [Http::METADATA_PREFIX . 'My-Header' => 'cats', 'x-riak-index-foo_bin' => 'bar, baz', 'x-riak-index-foo_int' => '42, 50'];
$builder = new Command\Builder\StoreObject($riak);
$builder->buildObject('some_data', $inputHeaders);
$builder->buildBucket('some_bucket');
$command = $builder->build();

$this->assertInstanceOf('Basho\Riak\Command\Object\Store', $command);
$headers = $command->getHeaders();

$this->assertNotNull($headers);
$this->assertEquals(5, count($headers));
$this->assertEquals(['My-Header', 'cats'], $headers[0]);
$this->assertEquals(['x-riak-index-foo_bin', 'bar'], $headers[1]);
$this->assertEquals(['x-riak-index-foo_bin', 'baz'], $headers[2]);
$this->assertEquals(['x-riak-index-foo_int', '42'], $headers[3]);
$this->assertEquals(['x-riak-index-foo_int', '50'], $headers[4]);
$this->assertArrayHasKey('My-Header', $command->getObject()->getMetaData());
$this->assertEquals($command->getObject()->getMetaData()['My-Header'], 'cats');

$this->assertArrayHasKey('foo_bin', $command->getObject()->getIndexes());
$this->assertCount(2, $command->getObject()->getIndex('foo_bin'));

$this->assertArrayHasKey('foo_int', $command->getObject()->getIndexes());
$this->assertCount(2, $command->getObject()->getIndex('foo_int'));
}
}

0 comments on commit b501542

Please sign in to comment.