* create data * @param int $datasetId * @param $dimension1 * @param $dimension2 * @param $value * @param string|null $user_id * @param null $timestamp * @param $bulkInsert * @param $aggregation * @return string * @throws Exception */
(int $datasetId, $dimension1, $dimension2, $value, ?string $user_id = null, $timestamp = null, $bulkInsert = null, $aggregation = null)
| 57 | * @throws Exception |
| 58 | */ |
| 59 | public function create(int $datasetId, $dimension1, $dimension2, $value, ?string $user_id = null, $timestamp = null, $bulkInsert = null, $aggregation = null) |
| 60 | { |
| 61 | $dimension1 = $dimension1 !== null ? str_replace('*', '', $dimension1) : null; |
| 62 | $dimension2 = $dimension2 !== null ? str_replace('*', '', $dimension2) : null; |
| 63 | $timestamp = $timestamp ?? time(); |
| 64 | $result = ''; |
| 65 | |
| 66 | if ($user_id) $this->userId = $user_id; |
| 67 | |
| 68 | // if the data source option to delete all date before loading is "true" |
| 69 | // in this case, bulkInsert is set to true. Then no further checks for existing records is needed |
| 70 | if ($bulkInsert === null) { |
| 71 | $sql = $this->db->getQueryBuilder(); |
| 72 | $sql->from(self::TABLE_NAME) |
| 73 | ->addSelect('value') |
| 74 | ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId))) |
| 75 | ->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId))); |
| 76 | |
| 77 | // if the dimension value is null, a different where clause is required |
| 78 | $expression1 = $dimension1 === null ? $sql->expr()->isNull('dimension1') : $sql->expr()->eq('dimension1', $sql->createNamedParameter($dimension1)); |
| 79 | $expression2 = $dimension2 === null ? $sql->expr()->isNull('dimension2') : $sql->expr()->eq('dimension2', $sql->createNamedParameter($dimension2)); |
| 80 | |
| 81 | $sql->andWhere($expression1) |
| 82 | ->andWhere($expression2); |
| 83 | |
| 84 | $statement = $sql->executeQuery(); |
| 85 | $result = $statement->fetch(); |
| 86 | $statement->closeCursor(); |
| 87 | } |
| 88 | |
| 89 | if ($result) { |
| 90 | $sql = $this->db->getQueryBuilder(); |
| 91 | $sql->update(self::TABLE_NAME) |
| 92 | ->set('timestamp', $sql->createNamedParameter($timestamp)) |
| 93 | ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId))) |
| 94 | ->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId))); |
| 95 | |
| 96 | // if the dimension value is null, a different where clause is required |
| 97 | $expression1 = $dimension1 === null ? $sql->expr()->isNull('dimension1') : $sql->expr()->eq('dimension1', $sql->createNamedParameter($dimension1)); |
| 98 | $expression2 = $dimension2 === null ? $sql->expr()->isNull('dimension2') : $sql->expr()->eq('dimension2', $sql->createNamedParameter($dimension2)); |
| 99 | |
| 100 | $sql->andWhere($expression1) |
| 101 | ->andWhere($expression2); |
| 102 | |
| 103 | if ($aggregation === 'xxsummation') { |
| 104 | // Feature not yet available |
| 105 | // $this->logger->error('old value: ' . $result['value']); |
| 106 | // $this->logger->error('new value: ' . $value + $result['value']); |
| 107 | $sql->set('value', $sql->createNamedParameter($value + $result['value'])); |
| 108 | } else { |
| 109 | $sql->set('value', $sql->createNamedParameter($value)); |
| 110 | } |
| 111 | |
| 112 | $sql->executeStatement(); |
| 113 | return 'update'; |
| 114 | } else { |
| 115 | $sql = $this->db->getQueryBuilder(); |
| 116 | $sql->insert(self::TABLE_NAME) |