/**
  *  @covers WindowsAzure\Table\Models\BatchOperations::addInsertEntity
  *  @covers WindowsAzure\Table\Models\BatchOperations::addOperation
  *  @covers WindowsAzure\Table\Models\BatchOperations::getOperations
  */
 public function testAddInsertEntity()
 {
     // Setup
     $table = 'mytable';
     $entity = new Entity();
     $operations = new BatchOperations();
     // Test
     $operations->addInsertEntity($table, $entity);
     // Assert
     $this->assertCount(1, $operations->getOperations());
 }
 private function doOneTimeSetup()
 {
     $table = TableServiceFunctionalTestData::$testTableNames[0];
     self::$entitiesInTable = self::getEntitiesToQueryOver();
     $parts = array();
     foreach (self::$entitiesInTable as $entity) {
         if (array_key_exists($entity->getPartitionKey(), $parts) === false) {
             $parts[$entity->getPartitionKey()] = array();
         }
         array_push($parts[$entity->getPartitionKey()], $entity);
     }
     foreach ($parts as $part) {
         $batch = new BatchOperations();
         foreach ($part as $entity) {
             $batch->addInsertEntity($table, $entity);
         }
         $this->restProxy->batch($batch);
     }
 }
 public static function setUpBeforeClass()
 {
     parent::setUpBeforeClass();
     $table = TableServiceFunctionalTestData::$TEST_TABLE_NAMES[0];
     self::$entitiesInTable = self::getEntitiesToQueryOver();
     $baseWithRestProxy = new FunctionalTestBase();
     $parts = array();
     foreach (self::$entitiesInTable as $entity) {
         if (array_key_exists($entity->getPartitionKey(), $parts) === false) {
             $parts[$entity->getPartitionKey()] = array();
         }
         array_push($parts[$entity->getPartitionKey()], $entity);
     }
     foreach ($parts as $part) {
         $batch = new BatchOperations();
         foreach ($part as $entity) {
             $batch->addInsertEntity($table, $entity);
         }
         $baseWithRestProxy->restProxy->batch($batch);
     }
 }
 /**
  * @covers WindowsAzure\Table\TableRestProxy::batch
  * @covers WindowsAzure\Table\TableRestProxy::_createBatchRequestBody
  * @covers WindowsAzure\Table\TableRestProxy::_getOperationContext
  * @covers WindowsAzure\Table\TableRestProxy::_createOperationsContexts
  * @covers WindowsAzure\Table\TableRestProxy::_constructPutOrMergeEntityContext
  * @covers WindowsAzure\Table\Internal\MimeReaderWriter::encodeMimeMultipart
  * @covers WindowsAzure\Table\Internal\MimeReaderWriter::decodeMimeMultipart
  * @covers WindowsAzure\Table\Models\BatchResult::create
  * @covers WindowsAzure\Table\Models\BatchResult::_constructResponses
  * @covers WindowsAzure\Table\Models\BatchResult::_compareUsingContentId
  * @covers WindowsAzure\Common\Internal\ServiceRestProxy::sendContext
  */
 public function testBatchWithMultipleOperations()
 {
     // Setup
     $name = 'batchwithwithmultipleoperations';
     $this->createTable($name);
     $partitionKey = '123';
     $rk1 = '456';
     $rk2 = '457';
     $rk3 = '458';
     $delete = TestResources::getTestEntity($partitionKey, $rk1);
     $insert = TestResources::getTestEntity($partitionKey, $rk2);
     $update = TestResources::getTestEntity($partitionKey, $rk3);
     $this->restProxy->insertEntity($name, $delete);
     $this->restProxy->insertEntity($name, $update);
     $result = $this->restProxy->queryEntities($name);
     $entities = $result->getEntities();
     $delete = $entities[0];
     $update = $entities[1];
     $update->addProperty('CustomerPlace', EdmType::STRING, 'Redmond');
     $operations = new BatchOperations();
     $operations->addInsertEntity($name, $insert);
     $operations->addUpdateEntity($name, $update);
     $operations->addDeleteEntity($name, $delete->getPartitionKey(), $delete->getRowKey(), $delete->getETag());
     // Test
     $result = $this->restProxy->batch($operations);
     // Assert
     $this->assertTrue(true);
 }
Esempio n. 5
0
 /**
  * {@inheritdoc}
  */
 protected function addToTransaction($record = null, $id = null, $extras = null, $rollback = false, $continue = false, $single = false)
 {
     $ssFilters = ArrayUtils::get($extras, 'ss_filters');
     $fields = ArrayUtils::get($extras, ApiOptions::FIELDS);
     $requireMore = ArrayUtils::get($extras, 'require_more');
     $updates = ArrayUtils::get($extras, 'updates');
     $partitionKey = ArrayUtils::get($extras, static::PARTITION_KEY);
     if (!is_array($id)) {
         $id = [static::ROW_KEY => $id, static::PARTITION_KEY => $partitionKey];
     }
     if (!empty($partitionKey)) {
         $id[static::PARTITION_KEY] = $partitionKey;
     }
     if (!empty($updates)) {
         foreach ($id as $field => $value) {
             if (!isset($updates[$field])) {
                 $updates[$field] = $value;
             }
         }
         $record = $updates;
     } elseif (!empty($record)) {
         if (!empty($partitionKey)) {
             $record[static::PARTITION_KEY] = $partitionKey;
         }
     }
     if (!empty($record)) {
         $forUpdate = false;
         switch ($this->getAction()) {
             case Verbs::PUT:
             case Verbs::MERGE:
             case Verbs::PATCH:
                 $forUpdate = true;
                 break;
         }
         $record = $this->parseRecord($record, $this->tableFieldsInfo, $ssFilters, $forUpdate);
         if (empty($record)) {
             throw new BadRequestException('No valid fields were found in record.');
         }
         $entity = static::parseRecordToEntity($record);
     } else {
         $entity = static::parseRecordToEntity($id);
     }
     $partKey = $entity->getPartitionKey();
     if (empty($partKey)) {
         throw new BadRequestException('No valid partition key found in request.');
     }
     $rowKey = $entity->getRowKey();
     if (empty($rowKey)) {
         throw new BadRequestException('No valid row key found in request.');
     }
     // only allow batch if rollback and same partition
     $batch = $rollback && !empty($partitionKey);
     $out = [];
     switch ($this->getAction()) {
         case Verbs::POST:
             if ($batch) {
                 if (!isset($this->batchOps)) {
                     $this->batchOps = new BatchOperations();
                 }
                 $this->batchOps->addInsertEntity($this->transactionTable, $entity);
                 // track record for output
                 return parent::addToTransaction($record);
             }
             /** @var InsertEntityResult $result */
             $result = $this->parent->getConnection()->insertEntity($this->transactionTable, $entity);
             if ($rollback) {
                 $this->addToRollback($entity);
             }
             $out = static::parseEntityToRecord($result->getEntity(), $fields);
             break;
         case Verbs::PUT:
             if ($batch) {
                 if (!isset($this->batchOps)) {
                     $this->batchOps = new BatchOperations();
                 }
                 $this->batchOps->addUpdateEntity($this->transactionTable, $entity);
                 // track record for output
                 return parent::addToTransaction($record);
             }
             if ($rollback) {
                 $old = $this->parent->getConnection()->getEntity($this->transactionTable, $entity->getRowKey(), $entity->getPartitionKey());
                 $this->addToRollback($old);
             }
             /** @var UpdateEntityResult $result */
             $this->parent->getConnection()->updateEntity($this->transactionTable, $entity);
             $out = static::parseEntityToRecord($entity, $fields);
             break;
         case Verbs::MERGE:
         case Verbs::PATCH:
             if ($batch) {
                 if (!isset($this->batchOps)) {
                     $this->batchOps = new BatchOperations();
                 }
                 $this->batchOps->addMergeEntity($this->transactionTable, $entity);
                 // track id for output
                 return parent::addToTransaction(null, $rowKey);
             }
             if ($rollback || $requireMore) {
                 $old = $this->parent->getConnection()->getEntity($this->transactionTable, $rowKey, $partKey);
                 if ($rollback) {
                     $this->addToRollback($old);
                 }
                 if ($requireMore) {
                     $out = array_merge(static::parseEntityToRecord($old, $fields), static::parseEntityToRecord($entity, $fields));
                 }
             }
             $out = empty($out) ? static::parseEntityToRecord($entity, $fields) : $out;
             /** @var UpdateEntityResult $result */
             $this->parent->getConnection()->mergeEntity($this->transactionTable, $entity);
             break;
         case Verbs::DELETE:
             if ($batch) {
                 if (!isset($this->batchOps)) {
                     $this->batchOps = new BatchOperations();
                 }
                 $this->batchOps->addDeleteEntity($this->transactionTable, $partKey, $rowKey);
                 // track id for output
                 return parent::addToTransaction(null, $rowKey);
             }
             if ($rollback || $requireMore) {
                 $old = $this->parent->getConnection()->getEntity($this->transactionTable, $partKey, $rowKey);
                 if ($rollback) {
                     $this->addToRollback($old);
                 }
                 if ($requireMore) {
                     $out = static::parseEntityToRecord($old, $fields);
                 }
             }
             $this->parent->getConnection()->deleteEntity($this->transactionTable, $partKey, $rowKey);
             $out = empty($out) ? static::parseEntityToRecord($entity, $fields) : $out;
             break;
         case Verbs::GET:
             if (!empty($partitionKey)) {
                 // track id for output
                 return parent::addToTransaction(null, $rowKey);
             }
             /** @var GetEntityResult $result */
             $result = $this->parent->getConnection()->getEntity($this->transactionTable, $partKey, $rowKey);
             $out = static::parseEntityToRecord($result->getEntity(), $fields);
             break;
     }
     return $out;
 }
 /**
  * @covers WindowsAzure\Table\TableRestProxy::batch
  * @covers WindowsAzure\Table\TableRestProxy::insertEntity
  * @covers WindowsAzure\Table\TableRestProxy::updateEntity
  */
 public function testBatchNegativeWorks()
 {
     // Arrange
     $table = self::$testTable8;
     $partitionKey = '001';
     // Insert an entity the modify it outside of the batch
     $entity1 = new Entity();
     $entity1->setPartitionKey($partitionKey);
     $entity1->setRowKey('batchNegativeWorks1');
     $entity1->addProperty('test', EdmType::INT32, 1);
     $entity2 = new Entity();
     $entity2->setPartitionKey($partitionKey);
     $entity2->setRowKey('batchNegativeWorks2');
     $entity2->addProperty('test', EdmType::INT32, 2);
     $entity3 = new Entity();
     $entity3->setPartitionKey($partitionKey);
     $entity3->setRowKey('batchNegativeWorks3');
     $entity3->addProperty('test', EdmType::INT32, 3);
     $entity1 = $this->restProxy->insertEntity($table, $entity1)->getEntity();
     $entity2 = $this->restProxy->insertEntity($table, $entity2)->getEntity();
     $entity2->addProperty('test', EdmType::INT32, -2);
     $this->restProxy->updateEntity($table, $entity2);
     // Act
     $batchOperations = new BatchOperations();
     // The $entity1 still has the original etag from the first submit,
     // so this update should fail, because another update was already made.
     $entity1->addProperty('test', EdmType::INT32, 3);
     $batchOperations->addDeleteEntity($table, $entity1->getPartitionKey(), $entity1->getRowKey(), $entity1->getETag());
     $batchOperations->addUpdateEntity($table, $entity2);
     $batchOperations->addInsertEntity($table, $entity3);
     $result = $this->restProxy->batch($batchOperations);
     // Assert
     $this->assertNotNull($result, '$result');
     $entries = $result->getEntries();
     $this->assertEquals(1, count($entries), 'count($result->getEntries())');
     $this->assertNotNull($entries[0], 'First $result should not be null');
     $this->assertTrue($entries[0] instanceof BatchError, 'First $result type');
     $error = $entries[0];
     $this->assertEquals(412, $error->getError()->getCode(), 'First $result status code');
 }