You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by se...@apache.org on 2018/01/19 09:04:29 UTC

[incubator-servicecomb-saga] 03/09: SCB-218 updated schemas accordingly due to change of ORM tech

This is an automated email from the ASF dual-hosted git repository.

seanyinx pushed a commit to branch SCB-218_alpha_stateless
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-saga.git

commit 416433da23e596a10470e1fc3fff53fec7c922af
Author: seanyinx <se...@huawei.com>
AuthorDate: Thu Jan 18 15:07:29 2018 +0800

    SCB-218 updated schemas accordingly due to change of ORM tech
    
    Signed-off-by: seanyinx <se...@huawei.com>
---
 .../servicecomb/saga/alpha/core/Command.java       | 17 +++++++
 .../servicecomb/saga/alpha/core/TxEvent.java       |  5 ++
 .../saga/alpha/server/CommandEntity.java           | 55 ----------------------
 .../saga/alpha/server/CommandEntityRepository.java | 25 +++++-----
 .../saga/alpha/server/SpringCommandRepository.java | 26 ++++------
 .../saga/alpha/server/SpringTxEventRepository.java |  2 +-
 .../alpha/server/TxEventEnvelopeRepository.java    | 33 +++++++------
 alpha/alpha-server/src/test/resources/schema.sql   | 15 ++++++
 8 files changed, 80 insertions(+), 98 deletions(-)

diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/Command.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/Command.java
index c852c16..b29988b 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/Command.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/Command.java
@@ -19,7 +19,18 @@ package org.apache.servicecomb.saga.alpha.core;
 
 import static org.apache.servicecomb.saga.alpha.core.CommandStatus.NEW;
 
+import java.util.Date;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+@Entity
 public class Command {
+
+  @Id
+  private Long surrogateId;
+
   private String serviceName;
   private String instanceId;
   private String globalTxId;
@@ -29,6 +40,11 @@ public class Command {
   private byte[] payloads;
   private String status;
 
+  private Date lastModified;
+
+  @Version
+  private int version;
+
   Command() {
   }
 
@@ -49,6 +65,7 @@ public class Command {
     this.compensationMethod = compensationMethod;
     this.payloads = payloads;
     this.status = status;
+    this.lastModified = new Date();
   }
 
   Command(String serviceName,
diff --git a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
index 760dd70..0ff2299 100644
--- a/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
+++ b/alpha/alpha-core/src/main/java/org/apache/servicecomb/saga/alpha/core/TxEvent.java
@@ -65,6 +65,7 @@ public class TxEvent {
       String type,
       String compensationMethod,
       byte[] payloads) {
+    this.surrogateId = -1L;
     this.serviceName = serviceName;
     this.instanceId = instanceId;
     this.creationTime = creationTime;
@@ -112,6 +113,10 @@ public class TxEvent {
     return payloads;
   }
 
+  public long id() {
+    return surrogateId;
+  }
+
   @Override
   public String toString() {
     return "TxEvent{" +
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntity.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntity.java
deleted file mode 100644
index 6207002..0000000
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntity.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.saga.alpha.server;
-
-import java.util.Date;
-
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Version;
-
-import org.apache.servicecomb.saga.alpha.core.Command;
-import org.apache.servicecomb.saga.alpha.core.TxEvent;
-
-@Entity
-class CommandEntity {
-  @Id
-  private long surrogateId;
-
-  @Embedded
-  private Command command;
-
-  private Date lastModified;
-
-  @Version
-  private int version;
-
-  CommandEntity() {
-  }
-
-  CommandEntity(long id, TxEvent event) {
-    surrogateId = id;
-    lastModified = new Date();
-    command = new Command(event);
-  }
-
-  Command command() {
-    return command;
-  }
-}
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntityRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntityRepository.java
index 9402486..fffea56 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntityRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/CommandEntityRepository.java
@@ -22,32 +22,33 @@ import java.util.Optional;
 
 import javax.transaction.Transactional;
 
+import org.apache.servicecomb.saga.alpha.core.Command;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
 
-public interface CommandEntityRepository extends CrudRepository<CommandEntity, Long> {
-  Optional<CommandEntity> findByCommandGlobalTxIdAndCommandLocalTxId(String globalTxId, String localTxId);
+public interface CommandEntityRepository extends CrudRepository<Command, Long> {
+  Optional<Command> findByGlobalTxIdAndLocalTxId(String globalTxId, String localTxId);
 
   @Transactional
   @Modifying
-  @Query("UPDATE org.apache.servicecomb.saga.alpha.server.CommandEntity c "
-      + "SET c.command.status = :status "
-      + "WHERE c.command.globalTxId = :globalTxId "
-      + "AND c.command.localTxId = :localTxId")
+  @Query("UPDATE org.apache.servicecomb.saga.alpha.core.Command c "
+      + "SET c.status = :status "
+      + "WHERE c.globalTxId = :globalTxId "
+      + "AND c.localTxId = :localTxId")
   void updateStatusByGlobalTxIdAndLocalTxId(
       @Param("status") String status,
       @Param("globalTxId") String globalTxId,
       @Param("localTxId") String localTxId);
 
-  List<CommandEntity> findByCommandGlobalTxIdAndCommandStatus(String globalTxId, String status);
+  List<Command> findByGlobalTxIdAndStatus(String globalTxId, String status);
 
-  @Query("FROM CommandEntity c "
-      + "WHERE id IN ("
-      + " SELECT MAX(id) FROM CommandEntity c1 WHERE c1.command.status <> 'DONE' GROUP BY c1.command.globalTxId"
+  @Query("SELECT c FROM Command c "
+      + "WHERE c.surrogateId IN ("
+      + " SELECT MAX(c1.surrogateId) FROM Command c1 WHERE c1.status <> 'DONE' GROUP BY c1.globalTxId"
       + ") "
-      + "ORDER BY c.id ASC")
-  List<CommandEntity> findFirstGroupByCommandGlobalTxIdOrderByIdDesc(Pageable pageable);
+      + "ORDER BY c.surrogateId ASC")
+  List<Command> findFirstGroupByGlobalTxIdOrderByIdDesc(Pageable pageable);
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringCommandRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringCommandRepository.java
index aac3c22..a335849 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringCommandRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringCommandRepository.java
@@ -24,10 +24,10 @@ import static org.apache.servicecomb.saga.common.EventType.TxStartedEvent;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import org.apache.servicecomb.saga.alpha.core.Command;
 import org.apache.servicecomb.saga.alpha.core.CommandRepository;
+import org.apache.servicecomb.saga.alpha.core.TxEvent;
 import org.springframework.data.domain.PageRequest;
 
 public class SpringCommandRepository implements CommandRepository {
@@ -43,28 +43,28 @@ public class SpringCommandRepository implements CommandRepository {
 
   @Override
   public boolean exists(String globalTxId, String localTxId) {
-    return commandRepository.findByCommandGlobalTxIdAndCommandLocalTxId(globalTxId, localTxId).isPresent();
+    return commandRepository.findByGlobalTxIdAndLocalTxId(globalTxId, localTxId).isPresent();
   }
 
   @Override
   public void saveCompensationCommand(String globalTxId, String localTxId) {
-    TxEventEnvelope startedEvent = eventRepository.findFirstByEventGlobalTxIdAndEventLocalTxIdAndEventTypeOrderByIdAsc(
+    TxEvent startedEvent = eventRepository.findFirstByGlobalTxIdAndLocalTxIdAndTypeOrderBySurrogateIdAsc(
         globalTxId,
         localTxId,
         TxStartedEvent.name());
 
-    commandRepository.save(new CommandEntity(startedEvent.id(), startedEvent.event()));
+    commandRepository.save(new Command(startedEvent));
   }
 
   @Override
   public void saveCompensationCommands(String globalTxId) {
-    List<TxEventEnvelope> events = eventRepository
+    List<TxEvent> events = eventRepository
         .findStartedEventEnvelopesWithMatchingEndedButNotCompensatedEvents(globalTxId);
 
-    Map<String, CommandEntity> commands = new HashMap<>();
+    Map<String, Command> commands = new HashMap<>();
 
-    for (TxEventEnvelope event : events) {
-      commands.computeIfAbsent(event.localTxId(), k -> new CommandEntity(event.id(), event.event()));
+    for (TxEvent event : events) {
+      commands.computeIfAbsent(event.localTxId(), k -> new Command(event));
     }
 
     commandRepository.save(commands.values());
@@ -77,18 +77,12 @@ public class SpringCommandRepository implements CommandRepository {
 
   @Override
   public List<Command> findUncompletedCommands(String globalTxId) {
-    return commandRepository.findByCommandGlobalTxIdAndCommandStatus(globalTxId, NEW.name())
-        .stream()
-        .map(CommandEntity::command)
-        .collect(Collectors.toList());
+    return commandRepository.findByGlobalTxIdAndStatus(globalTxId, NEW.name());
   }
 
   @Override
   public List<Command> findFirstCommandToCompensate() {
     return commandRepository
-        .findFirstGroupByCommandGlobalTxIdOrderByIdDesc(SINGLE_COMMAND_REQUEST)
-        .stream()
-        .map(CommandEntity::command)
-        .collect(Collectors.toList());
+        .findFirstGroupByGlobalTxIdOrderByIdDesc(SINGLE_COMMAND_REQUEST);
   }
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java
index f0743e9..7c44639 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/SpringTxEventRepository.java
@@ -41,7 +41,7 @@ class SpringTxEventRepository implements TxEventRepository {
 
   @Override
   public TxEvent findFirstTransaction(String globalTxId, String localTxId, String type) {
-    return eventRepo.findFirstByGlobalTxIdAndLocalTxIdAndType(globalTxId, localTxId, type);
+    return eventRepo.findFirstByGlobalTxIdAndLocalTxIdAndTypeOrderBySurrogateIdAsc(globalTxId, localTxId, type);
   }
 
   @Override
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java
index 85ed954..71d5f1b 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/TxEventEnvelopeRepository.java
@@ -32,7 +32,7 @@ interface TxEventEnvelopeRepository extends CrudRepository<TxEvent, Long> {
       + "WHERE t.globalTxId = ?1 AND t.type = ?2")
   List<TxEvent> findByEventGlobalTxIdAndEventType(String globalTxId, String type);
 
-  TxEvent findFirstByGlobalTxIdAndLocalTxIdAndType(String globalTxId, String localTxId, String type);
+  TxEvent findFirstByGlobalTxIdAndLocalTxIdAndTypeOrderBySurrogateIdAsc(String globalTxId, String localTxId, String type);
 
   @Query("SELECT DISTINCT new org.apache.servicecomb.saga.alpha.core.TxEvent("
       + "t.serviceName, t.instanceId, t.globalTxId, t.localTxId, t.parentTxId, t.type, t.compensationMethod, t.payloads"
@@ -49,21 +49,26 @@ interface TxEventEnvelopeRepository extends CrudRepository<TxEvent, Long> {
       + "  FROM TxEvent t2 "
       + "  WHERE t2.globalTxId = ?1 "
       + "  AND t2.localTxId = t.localTxId "
-      + "  AND t2.type = 'TxCompensatedEvent')"
+      + "  AND t2.type = 'TxCompensatedEvent') "
+      + "ORDER BY t.surrogateId ASC"
  )
   List<TxEvent> findStartedEventsWithMatchingEndedButNotCompensatedEvents(String globalTxId);
 
-  @Query("FROM TxEventEnvelope t "
-      + "WHERE t.event.globalTxId = ?1 AND t.event.type = 'TxStartedEvent' AND EXISTS ( "
-      + "  FROM TxEventEnvelope t1 "
-      + "  WHERE t1.event.globalTxId = ?1 "
-      + "  AND t1.event.localTxId = t.event.localTxId "
-      + "  AND t1.event.type = 'TxEndedEvent'"
+  @Query("SELECT DISTINCT new org.apache.servicecomb.saga.alpha.core.TxEvent("
+      + "t.serviceName, t.instanceId, t.globalTxId, t.localTxId, t.parentTxId, t.type, t.compensationMethod, t.payloads"
+      + ") FROM TxEvent t "
+      + "WHERE t.globalTxId = ?1 AND t.type = 'TxStartedEvent' AND EXISTS ( "
+      + "  SELECT t1.globalTxId"
+      + "  FROM TxEvent t1 "
+      + "  WHERE t1.globalTxId = ?1 "
+      + "  AND t1.localTxId = t.localTxId "
+      + "  AND t1.type = 'TxEndedEvent'"
       + ") AND NOT EXISTS ( "
-      + "  FROM TxEventEnvelope t2 "
-      + "  WHERE t2.event.globalTxId = ?1 "
-      + "  AND t2.event.localTxId = t.event.localTxId "
-      + "  AND t2.event.type = 'TxCompensatedEvent')"
-      + "ORDER BY t.id ASC ")
-  List<TxEventEnvelope> findStartedEventEnvelopesWithMatchingEndedButNotCompensatedEvents(String globalTxId);
+      + "  SELECT t2.globalTxId"
+      + "  FROM TxEvent t2 "
+      + "  WHERE t2.globalTxId = ?1 "
+      + "  AND t2.localTxId = t.localTxId "
+      + "  AND t2.type = 'TxCompensatedEvent') "
+      + "ORDER BY t.surrogateId ASC")
+  List<TxEvent> findStartedEventEnvelopesWithMatchingEndedButNotCompensatedEvents(String globalTxId);
 }
diff --git a/alpha/alpha-server/src/test/resources/schema.sql b/alpha/alpha-server/src/test/resources/schema.sql
index 08945a7..c6d66de 100644
--- a/alpha/alpha-server/src/test/resources/schema.sql
+++ b/alpha/alpha-server/src/test/resources/schema.sql
@@ -11,3 +11,18 @@ CREATE TABLE IF NOT EXISTS `TxEvent` (
   `payloads` varbinary(10240),
   PRIMARY KEY (`surrogateId`)
 ) DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `Command` (
+  `surrogateId` bigint NOT NULL AUTO_INCREMENT,
+  `serviceName` varchar(36) NOT NULL,
+  `instanceId` varchar(36) NOT NULL,
+  `globalTxId` varchar(36) NOT NULL,
+  `localTxId` varchar(36) NOT NULL,
+  `parentTxId` varchar(36) DEFAULT NULL,
+  `compensationMethod` varchar(256) NOT NULL,
+  `payloads` varbinary(10240),
+  `status` varchar(12),
+  `lastModified` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
+  `version` bigint NOT NULL,
+  PRIMARY KEY (`surrogateId`)
+) DEFAULT CHARSET=utf8;

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.