diff --git a/.github/workflows/plugins-test.yaml b/.github/workflows/plugins-test.yaml index 4b4a433c7a204f2a7fcec00874a4b5ad44e1e9bb..b5d286b6e02906a497b4f25a5fd03af4d78d7c9b 100644 --- a/.github/workflows/plugins-test.yaml +++ b/.github/workflows/plugins-test.yaml @@ -322,6 +322,8 @@ jobs: run: bash test/plugin/run.sh redisson-scenario - name: Run shardingsphere-3.x-scenario 3.0.0 (1) run: bash test/plugin/run.sh shardingsphere-3.x-scenario + - name: Run shardingsphere-4.x-RC1-RC2-scenario 4.0.0-RC1-4.0.0-RC2 (2) + run: bash test/plugin/run.sh shardingsphere-4.x-RC1-RC2-scenario - name: Run zookeeper 3.4.x (14) run: bash test/plugin/run.sh zookeeper-scenario diff --git a/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/pom.xml index 2c842754ae1cb59799d871966ab5b34b2576fdd0..8acb63cd537502ce66579a69d8239f8e4793a478 100644 --- a/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/sharding-sphere-4.x-plugin/pom.xml @@ -33,6 +33,7 @@ UTF-8 + [4.0.0-RC1, 4.0.0-RC2] @@ -45,19 +46,19 @@ org.apache.shardingsphere sharding-core-execute - 4.0.0-RC2 + ${shardingsphere.version} provided org.apache.shardingsphere sharding-jdbc-core - 4.0.0-RC2 + ${shardingsphere.version} provided org.apache.shardingsphere sharding-proxy-frontend-core - 4.0.0-RC2 + ${shardingsphere.version} provided diff --git a/test/plugin/scenarios/shardingsphere-3.x-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java b/test/plugin/scenarios/shardingsphere-3.x-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java index 060b1911de3830256f66739aa6d0e70effbb4d6c..ef2f54832fd7f120ae3bc962dc968a10527528a4 100644 --- a/test/plugin/scenarios/shardingsphere-3.x-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java +++ b/test/plugin/scenarios/shardingsphere-3.x-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java @@ -41,9 +41,9 @@ public class Application extends SpringBootServletInitializer { DataSourceUtil.createDataSource("demo_ds_0"); DataSourceUtil.createDataSource("demo_ds_1"); DataSource dataSource = new ShardingDatabasesAndTablesConfigurationPrecise().createDataSource(); - SpringApplication.run(Application.class, args); CommonService commonService = new RawPojoService(new JDBCOrderRepositoryImpl(dataSource), new JDBCOrderItemRepositoryImpl(dataSource)); commonService.initEnvironment(); + SpringApplication.run(Application.class, args); } catch (Exception e) { // Never do this } diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/bin/startup.sh b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/bin/startup.sh new file mode 100644 index 0000000000000000000000000000000000000000..99d6645ff45c5e8cd5edd626961832651d8a332d --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/bin/startup.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# +# 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. + +home="$(cd "$(dirname $0)"; pwd)" + +java -jar ${agent_opts} ${home}/../libs/shardingsphere-4.x-RC1-RC2-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/config/expectedData.yaml b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/config/expectedData.yaml new file mode 100644 index 0000000000000000000000000000000000000000..125281168bc07111560603acc9b98c446362bc01 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/config/expectedData.yaml @@ -0,0 +1,200 @@ +# 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. + +registryItems: + applications: + - {shardingsphere-4.x-RC1-RC2-scenario: nq 0} + instances: + - {shardingsphere-4.x-RC1-RC2-scenario: 1} + operationNames: + - shardingsphere-4.x-RC1-RC2-scenario: [/shardingsphere-4.x-RC1-RC2-scenario/case/execute] + heartbeat: [] +segmentItems: + - applicationCode: shardingsphere-4.x-RC1-RC2-scenario + segmentSize: not null + segments: + - segmentId: not null + spans: + - operationName: H2/JDBI/PreparedStatement/executeQuery + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Database + startTime: not null + endTime: not null + componentId: 32 + componentName: '' + isError: false + spanType: Exit + peer: localhost:-1 + peerId: 0 + tags: + - {key: db.type, value: sql} + - {key: db.instance, value: demo_ds_1} + - {key: db.statement, value: SELECT * FROM t_order_1} + - operationName: /ShardingSphere/executeSQL/ + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Unknown + startTime: not null + endTime: not null + componentId: 60 + componentName: '' + isError: false + spanType: Local + peer: '' + peerId: 0 + refs: + - {parentEndpointId: 0, parentEndpoint: /shardingsphere-4.x-RC1-RC2-scenario/case/execute, + networkAddressId: 0, entryEndpointId: 0, refType: CrossThread, parentSpanId: 2, + parentTraceSegmentId: nq 0, parentServiceInstanceId: 1, + networkAddress: '', entryEndpoint: /shardingsphere-4.x-RC1-RC2-scenario/case/execute, + entryServiceInstanceId: 1} + - segmentId: not null + spans: + - operationName: H2/JDBI/PreparedStatement/executeQuery + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Database + startTime: not null + endTime: not null + componentId: 32 + componentName: '' + isError: false + spanType: Exit + peer: localhost:-1 + peerId: 0 + tags: + - {key: db.type, value: sql} + - {key: db.instance, value: demo_ds_0} + - {key: db.statement, value: SELECT * FROM t_order_1} + - operationName: /ShardingSphere/executeSQL/ + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Unknown + startTime: not null + endTime: not null + componentId: 60 + componentName: '' + isError: false + spanType: Local + peer: '' + peerId: 0 + refs: + - {parentEndpointId: 0, parentEndpoint: /shardingsphere-4.x-RC1-RC2-scenario/case/execute, + networkAddressId: 0, entryEndpointId: 0, refType: CrossThread, parentSpanId: 2, + parentTraceSegmentId: nq 0, parentServiceInstanceId: 1, + networkAddress: '', entryEndpoint: /shardingsphere-4.x-RC1-RC2-scenario/case/execute, + entryServiceInstanceId: 1} + - segmentId: not null + spans: + - operationName: H2/JDBI/PreparedStatement/executeQuery + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Database + startTime: not null + endTime: not null + componentId: 32 + componentName: '' + isError: false + spanType: Exit + peer: localhost:-1 + peerId: 0 + tags: + - {key: db.type, value: sql} + - {key: db.instance, value: demo_ds_1} + - {key: db.statement, value: SELECT * FROM t_order_0} + - operationName: /ShardingSphere/executeSQL/ + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Unknown + startTime: not null + endTime: not null + componentId: 60 + componentName: '' + isError: false + spanType: Local + peer: '' + peerId: 0 + refs: + - {parentEndpointId: 0, parentEndpoint: /shardingsphere-4.x-RC1-RC2-scenario/case/execute, + networkAddressId: 0, entryEndpointId: 0, refType: CrossThread, parentSpanId: 2, + parentTraceSegmentId: nq 0, parentServiceInstanceId: 1, + networkAddress: '', entryEndpoint: /shardingsphere-4.x-RC1-RC2-scenario/case/execute, + entryServiceInstanceId: 1} + - segmentId: not null + spans: + - operationName: /ShardingSphere/parseSQL/ + operationId: 0 + parentSpanId: 0 + spanId: 1 + spanLayer: Unknown + startTime: not null + endTime: not null + componentId: 60 + componentName: '' + isError: false + spanType: Local + peer: '' + peerId: 0 + tags: + - {key: db.statement, value: SELECT * FROM t_order} + - operationName: H2/JDBI/PreparedStatement/executeQuery + operationId: 0 + parentSpanId: 3 + spanId: 4 + spanLayer: Database + startTime: not null + endTime: not null + componentId: 32 + componentName: '' + isError: false + spanType: Exit + peer: localhost:-1 + peerId: 0 + tags: + - {key: db.type, value: sql} + - {key: db.instance, value: demo_ds_0} + - {key: db.statement, value: SELECT * FROM t_order_0} + - {operationName: /ShardingSphere/executeSQL/, operationId: 0, parentSpanId: 2, + spanId: 3, spanLayer: Unknown, startTime: not null, endTime: not null, + componentId: 60, componentName: '', isError: false, spanType: Local, peer: '', + peerId: 0} + - {operationName: /ShardingSphere/JDBCRootInvoke/, operationId: 0, parentSpanId: 0, + spanId: 2, spanLayer: Unknown, startTime: not null, endTime: not null, + componentId: 60, componentName: '', isError: false, spanType: Local, peer: '', + peerId: 0} + - operationName: /shardingsphere-4.x-RC1-RC2-scenario/case/execute + operationId: 0 + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 1 + componentName: '' + isError: false + spanType: Entry + peer: '' + peerId: 0 + tags: + - {key: url, value: 'http://localhost:8080/shardingsphere-4.x-RC1-RC2-scenario/case/execute'} + - {key: http.method, value: GET} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/configuration.yml b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/configuration.yml new file mode 100644 index 0000000000000000000000000000000000000000..a952eeb0c5da53201054104a5a708b3b8c22d5b8 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/configuration.yml @@ -0,0 +1,21 @@ +# 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. + +type: jvm +entryService: http://localhost:8080/shardingsphere-4.x-RC1-RC2-scenario/case/execute +healthCheck: http://localhost:8080/shardingsphere-4.x-RC1-RC2-scenario/case/healthCheck +startScript: ./bin/startup.sh +framework: ShardingSphere \ No newline at end of file diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/pom.xml b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..b89520b804779e55780d0e69b5f19352b019b8ab --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/pom.xml @@ -0,0 +1,154 @@ + + + + 4.0.0 + + org.apache.skywalking + shardingsphere-4.x-RC1-RC2-scenario + 5.0.0 + + skywalking-shardingsphere-4.x-RC1-RC2-scenario + + + UTF-8 + + 4.0.0-RC1 + + 2.6.2 + 4.3.8.RELEASE + 1.5.2.RELEASE + + + + + org.apache.shardingsphere + sharding-core-execute + ${test.framework.version} + + + org.apache.shardingsphere + sharding-jdbc-core + ${test.framework.version} + + + commons-dbcp + commons-dbcp + 1.4 + + + org.springframework.boot + spring-boot-starter + ${spring-boot-version} + + + org.apache.logging.log4j + log4j-api + ${log4j.version} + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-slf4j-impl + ${log4j.version} + + + org.apache.logging.log4j + log4j-jcl + ${log4j.version} + + + org.springframework.boot + spring-boot-starter-tomcat + ${spring-boot-version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-version} + + + com.h2database + h2 + 1.4.196 + + + + shardingsphere-4.x-RC1-RC2-scenario + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.0 + + 1.8 + 1.8 + ${project.build.sourceEncoding} + + + + org.springframework.boot + spring-boot-maven-plugin + 1.5.9.RELEASE + + + + repackage + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assemble + package + + single + + + + src/main/assembly/assembly.xml + + ./target/ + + + + + + + + + + spring-snapshots + http://repo.spring.io/snapshot + + + spring-milestones + http://repo.spring.io/milestone + + + \ No newline at end of file diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/assembly/assembly.xml b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/assembly/assembly.xml new file mode 100644 index 0000000000000000000000000000000000000000..dac60bb6d10276562a673bd255e56a212844524b --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/assembly/assembly.xml @@ -0,0 +1,41 @@ + + + + + zip + + + + + ./bin + 0775 + + + + + + ${project.build.directory}/shardingsphere-4.x-RC1-RC2-scenario.jar + ./libs + 0775 + + + diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java new file mode 100644 index 0000000000000000000000000000000000000000..0a98702776ccc091bea27715c954a603c6bc2982 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/Application.java @@ -0,0 +1,53 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.ComponentScan; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.service.CommonService; +import org.apache.skywalking.apm.testcase.shardingsphere.service.config.ShardingDatabasesAndTablesConfigurationPrecise; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderItemRepositoryImpl; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderRepositoryImpl; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.service.RawPojoService; +import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.config.DataSourceUtil; + +import javax.sql.DataSource; + +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + public static void main(String[] args) { + try { + DataSourceUtil.createDataSource(""); + DataSourceUtil.createSchema("demo_ds_0"); + DataSourceUtil.createSchema("demo_ds_1"); + DataSourceUtil.createDataSource("demo_ds_0"); + DataSourceUtil.createDataSource("demo_ds_1"); + DataSource dataSource = new ShardingDatabasesAndTablesConfigurationPrecise().createDataSource(); + CommonService commonService = new RawPojoService(new JDBCOrderRepositoryImpl(dataSource), new JDBCOrderItemRepositoryImpl(dataSource)); + commonService.initEnvironment(); + SpringApplication.run(Application.class, args); + } catch (Exception e) { + // Never do this + } + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/controller/CaseController.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/controller/CaseController.java new file mode 100644 index 0000000000000000000000000000000000000000..4feb7d5881a163104b97fac16d3780bc76222b53 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/controller/CaseController.java @@ -0,0 +1,51 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.controller; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.service.CommonService; +import org.apache.skywalking.apm.testcase.shardingsphere.service.config.ShardingDatabasesAndTablesConfigurationPrecise; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderItemRepositoryImpl; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderRepositoryImpl; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.service.RawPojoService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.sql.DataSource; +import java.sql.SQLException; + +@RestController +@RequestMapping("/case") +public class CaseController { + + @RequestMapping("/healthCheck") + @ResponseBody + public String healthCheck() { + return "Success"; + } + + @RequestMapping("/execute") + @ResponseBody + public String execute() throws SQLException { + DataSource dataSource = new ShardingDatabasesAndTablesConfigurationPrecise().getDataSource(); + CommonService commonService = new RawPojoService(new JDBCOrderRepositoryImpl(dataSource), new JDBCOrderItemRepositoryImpl(dataSource)); + commonService.processSuccess(false); + return "Success"; + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/entity/Order.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/entity/Order.java new file mode 100644 index 0000000000000000000000000000000000000000..2366e1e7f03ef296ae6405a3a38709bb472bf8fe --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/entity/Order.java @@ -0,0 +1,61 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.entity; + +import java.io.Serializable; + +public class Order implements Serializable { + + private static final long serialVersionUID = 661434701950670670L; + + private long orderId; + + private int userId; + + private String status; + + public long getOrderId() { + return orderId; + } + + public void setOrderId(final long orderId) { + this.orderId = orderId; + } + + public int getUserId() { + return userId; + } + + public void setUserId(final int userId) { + this.userId = userId; + } + + public String getStatus() { + return status; + } + + public void setStatus(final String status) { + this.status = status; + } + + @Override + public String toString() { + return String.format("order_id: %s, user_id: %s, status: %s", orderId, userId, status); + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/entity/OrderItem.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/entity/OrderItem.java new file mode 100644 index 0000000000000000000000000000000000000000..42f2170b53afd6aefbabe4344e4494568d890d65 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/entity/OrderItem.java @@ -0,0 +1,71 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.entity; + +import java.io.Serializable; + +public class OrderItem implements Serializable { + + private static final long serialVersionUID = 263434701950670170L; + + private long orderItemId; + + private long orderId; + + private int userId; + + private String status; + + public long getOrderItemId() { + return orderItemId; + } + + public void setOrderItemId(final long orderItemId) { + this.orderItemId = orderItemId; + } + + public long getOrderId() { + return orderId; + } + + public void setOrderId(final long orderId) { + this.orderId = orderId; + } + + public int getUserId() { + return userId; + } + + public void setUserId(final int userId) { + this.userId = userId; + } + + public String getStatus() { + return status; + } + + public void setStatus(final String status) { + this.status = status; + } + + @Override + public String toString() { + return String.format("order_item_id:%s, order_id: %s, user_id: %s, status: %s", orderItemId, orderId, userId, status); + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/CommonRepository.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/CommonRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..d4ac16a5739fe3e8ecc5a001f1af5b45643f52e9 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/CommonRepository.java @@ -0,0 +1,38 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.repository; + +import java.util.List; + +public interface CommonRepository { + + void createTableIfNotExists(); + + void dropTable(); + + void truncateTable(); + + Long insert(T entity); + + void delete(Long id); + + List selectAll(); + + List selectRange(); +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/OrderItemRepository.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/OrderItemRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..ded00480756d7147032abd1bc5331cf1fe0b21aa --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/OrderItemRepository.java @@ -0,0 +1,24 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.repository; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem; + +public interface OrderItemRepository extends CommonRepository { +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/OrderRepository.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/OrderRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..95e55a72cc5f4f504b139fe64bda1d71889e42e0 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/repository/OrderRepository.java @@ -0,0 +1,24 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.repository; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order; + +public interface OrderRepository extends CommonRepository { +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/service/CommonService.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/service/CommonService.java new file mode 100644 index 0000000000000000000000000000000000000000..858fc2b3e349b1ecc9ee18ade1bd47025e04fc5b --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/service/CommonService.java @@ -0,0 +1,32 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.service; + +public interface CommonService { + + void initEnvironment(); + + void cleanEnvironment(); + + void processSuccess(boolean isRangeSharding); + + void processFailure(); + + void printData(boolean isRangeSharding); +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/service/CommonServiceImpl.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/service/CommonServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4935921cc9413382975ff975ca9171f4f100b374 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/api/service/CommonServiceImpl.java @@ -0,0 +1,108 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.api.service; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderItemRepository; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderRepository; +import java.util.ArrayList; +import java.util.List; + +public abstract class CommonServiceImpl implements CommonService { + + @Override + public void initEnvironment() { + getOrderRepository().createTableIfNotExists(); + getOrderItemRepository().createTableIfNotExists(); + getOrderRepository().truncateTable(); + getOrderItemRepository().truncateTable(); + insertData(); + } + + @Override + public void cleanEnvironment() { + getOrderRepository().dropTable(); + getOrderItemRepository().dropTable(); + } + + @Override + public void processSuccess(final boolean isRangeSharding) { + printData(isRangeSharding); + } + + @Override + public void processFailure() { + insertData(); + throw new RuntimeException("Exception occur for transaction test."); + } + + private List insertData() { + List result = new ArrayList<>(10); + for (int i = 1; i <= 10; i++) { + Order order = newOrder(); + order.setUserId(i); + order.setStatus("INSERT_TEST"); + getOrderRepository().insert(order); + OrderItem item = newOrderItem(); + item.setOrderId(order.getOrderId()); + item.setUserId(i); + item.setStatus("INSERT_TEST"); + getOrderItemRepository().insert(item); + result.add(order.getOrderId()); + } + return result; + } + + private void deleteData(final List orderIds) { + for (Long each : orderIds) { + getOrderRepository().delete(each); + getOrderItemRepository().delete(each); + } + } + + @Override + public void printData(final boolean isRangeSharding) { + if (isRangeSharding) { + printDataRange(); + } else { + printDataAll(); + } + } + + private void printDataRange() { + for (Object each : getOrderRepository().selectRange()) { + } + for (Object each : getOrderItemRepository().selectRange()) { + } + } + + private void printDataAll() { + for (Object each : getOrderRepository().selectAll()) { + } + } + + protected abstract OrderRepository getOrderRepository(); + + protected abstract OrderItemRepository getOrderItemRepository(); + + protected abstract Order newOrder(); + + protected abstract OrderItem newOrderItem(); +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/config/ShardingDatabasesAndTablesConfigurationPrecise.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/config/ShardingDatabasesAndTablesConfigurationPrecise.java new file mode 100644 index 0000000000000000000000000000000000000000..c083519fc838451b0c9713ef85f0b3de30601aff --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/config/ShardingDatabasesAndTablesConfigurationPrecise.java @@ -0,0 +1,76 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.config; + +import org.apache.shardingsphere.api.config.sharding.KeyGeneratorConfiguration; +import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration; +import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration; +import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration; +import org.apache.shardingsphere.api.config.sharding.strategy.StandardShardingStrategyConfiguration; +import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory; +import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.algorithm.PreciseModuloShardingTableAlgorithm; +import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.config.DataSourceUtil; +import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.config.ExampleConfiguration; +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public final class ShardingDatabasesAndTablesConfigurationPrecise implements ExampleConfiguration { + + private static DataSource dataSource; + + @Override + public DataSource createDataSource() throws SQLException { + ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); + shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration()); + shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration()); + shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item"); + shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "demo_ds_${user_id % 2}")); + shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new PreciseModuloShardingTableAlgorithm())); + Properties properties = new Properties(); + properties.setProperty("max.connections.size.per.query", "16"); + dataSource = ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, properties); + return dataSource; + } + + @Override + public DataSource getDataSource() { + return dataSource; + } + + private static TableRuleConfiguration getOrderTableRuleConfiguration() { + TableRuleConfiguration result = new TableRuleConfiguration("t_order", "demo_ds_${0..1}.t_order_${[0, 1]}"); + result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "order_id")); + return result; + } + + private static TableRuleConfiguration getOrderItemTableRuleConfiguration() { + TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "demo_ds_${0..1}.t_order_item_${[0, 1]}"); + return result; + } + + private static Map createDataSourceMap() { + Map result = new HashMap<>(); + result.put("demo_ds_0", DataSourceUtil.getDataSource("demo_ds_0")); + result.put("demo_ds_1", DataSourceUtil.getDataSource("demo_ds_1")); + return result; + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/jdbc/JDBCOrderItemRepositoryImpl.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/jdbc/JDBCOrderItemRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..930c6276386731a16c46da1dc5efeafeb82c1765 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/jdbc/JDBCOrderItemRepositoryImpl.java @@ -0,0 +1,130 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.repository.jdbc; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderItemRepository; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.LinkedList; +import java.util.List; + +public final class JDBCOrderItemRepositoryImpl implements OrderItemRepository { + + private final DataSource dataSource; + + public JDBCOrderItemRepositoryImpl(final DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public void createTableIfNotExists() { + String sql = "CREATE TABLE IF NOT EXISTS t_order_item " + + "(order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_item_id))"; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public void dropTable() { + String sql = "DROP TABLE t_order_item"; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public void truncateTable() { + String sql = "TRUNCATE TABLE t_order_item"; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public Long insert(final OrderItem orderItem) { + String sql = "INSERT INTO t_order_item (order_id, user_id, status) VALUES (?, ?, ?)"; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + preparedStatement.setLong(1, orderItem.getOrderId()); + preparedStatement.setInt(2, orderItem.getUserId()); + preparedStatement.setString(3, orderItem.getStatus()); + preparedStatement.executeUpdate(); + try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) { + if (resultSet.next()) { + orderItem.setOrderItemId(resultSet.getLong(1)); + } + } + } catch (final SQLException ignored) { + } + return orderItem.getOrderItemId(); + } + + @Override + public void delete(final Long orderItemId) { + String sql = "DELETE FROM t_order_item WHERE order_item_id=?"; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + preparedStatement.setLong(1, orderItemId); + preparedStatement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public List selectAll() { + String sql = "SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id"; + return getOrderItems(sql); + } + + @Override + public List selectRange() { + String sql = "SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id AND o.user_id BETWEEN 1 AND 5"; + return getOrderItems(sql); + } + + private List getOrderItems(final String sql) { + List result = new LinkedList<>(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + ResultSet resultSet = preparedStatement.executeQuery()) { + while (resultSet.next()) { + OrderItem orderItem = new OrderItem(); + orderItem.setOrderItemId(resultSet.getLong(1)); + orderItem.setOrderId(resultSet.getLong(2)); + orderItem.setUserId(resultSet.getInt(3)); + orderItem.setStatus(resultSet.getString(4)); + result.add(orderItem); + } + } catch (final SQLException ignored) { + } + return result; + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/jdbc/JDBCOrderRepositoryImpl.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/jdbc/JDBCOrderRepositoryImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..f995bd8088d1ea4583fc6daff09374de4f96367b --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/jdbc/JDBCOrderRepositoryImpl.java @@ -0,0 +1,127 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.repository.jdbc; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderRepository; +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.LinkedList; +import java.util.List; + +public final class JDBCOrderRepositoryImpl implements OrderRepository { + + private final DataSource dataSource; + + public JDBCOrderRepositoryImpl(final DataSource dataSource) { + this.dataSource = dataSource; + } + + @Override + public void createTableIfNotExists() { + String sql = "CREATE TABLE IF NOT EXISTS t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id))"; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public void dropTable() { + String sql = "DROP TABLE t_order"; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public void truncateTable() { + String sql = "TRUNCATE TABLE t_order"; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + } catch (final SQLException ignored) { + } + } + + @Override + public Long insert(final Order order) { + String sql = "INSERT INTO t_order (user_id, status) VALUES (?, ?)"; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + preparedStatement.setInt(1, order.getUserId()); + preparedStatement.setString(2, order.getStatus()); + preparedStatement.executeUpdate(); + try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) { + if (resultSet.next()) { + order.setOrderId(resultSet.getLong(1)); + } + } + } catch (final SQLException ignored) { + } + return order.getOrderId(); + } + + @Override + public void delete(final Long orderId) { + String sql = "DELETE FROM t_order WHERE order_id=?"; + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + preparedStatement.setLong(1, orderId); + preparedStatement.executeUpdate(); + } catch (final SQLException ignored) { + } + } + + @Override + public List selectAll() { + String sql = "SELECT * FROM t_order"; + return getOrders(sql); + } + + @Override + public List selectRange() { + String sql = "SELECT * FROM t_order WHERE order_id BETWEEN 200000000000000000 AND 400000000000000000"; + return getOrders(sql); + } + + private List getOrders(final String sql) { + List result = new LinkedList<>(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + ResultSet resultSet = preparedStatement.executeQuery()) { + while (resultSet.next()) { + Order order = new Order(); + order.setOrderId(resultSet.getLong(1)); + order.setUserId(resultSet.getInt(2)); + order.setStatus(resultSet.getString(3)); + result.add(order); + } + } catch (final SQLException ignored) { + } + return result; + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/service/RawPojoService.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/service/RawPojoService.java new file mode 100644 index 0000000000000000000000000000000000000000..60996688818a06d2dc84c9104c475c9090f5c0d5 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/repository/service/RawPojoService.java @@ -0,0 +1,59 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.repository.service; + +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderItemRepository; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderRepository; +import org.apache.skywalking.apm.testcase.shardingsphere.service.api.service.CommonServiceImpl; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderItemRepositoryImpl; +import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderRepositoryImpl; + +public class RawPojoService extends CommonServiceImpl { + + private final OrderRepository orderRepository; + + private final OrderItemRepository orderItemRepository; + + public RawPojoService(final JDBCOrderRepositoryImpl orderRepository, final JDBCOrderItemRepositoryImpl orderItemRepository) { + this.orderRepository = orderRepository; + this.orderItemRepository = orderItemRepository; + } + + @Override + protected OrderRepository getOrderRepository() { + return orderRepository; + } + + @Override + protected OrderItemRepository getOrderItemRepository() { + return orderItemRepository; + } + + @Override + protected Order newOrder() { + return new Order(); + } + + @Override + protected OrderItem newOrderItem() { + return new OrderItem(); + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/PreciseModuloShardingDatabaseAlgorithm.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/PreciseModuloShardingDatabaseAlgorithm.java new file mode 100644 index 0000000000000000000000000000000000000000..826cece5d235c4e432632f76fe342a937edf2a48 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/PreciseModuloShardingDatabaseAlgorithm.java @@ -0,0 +1,37 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.utility.algorithm; + +import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; +import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue; + +import java.util.Collection; + +public class PreciseModuloShardingDatabaseAlgorithm implements PreciseShardingAlgorithm { + + @Override + public String doSharding(final Collection databaseNames, final PreciseShardingValue shardingValue) { + for (String each : databaseNames) { + if (each.endsWith(shardingValue.getValue() % 2 + "")) { + return each; + } + } + throw new UnsupportedOperationException(); + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/PreciseModuloShardingTableAlgorithm.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/PreciseModuloShardingTableAlgorithm.java new file mode 100644 index 0000000000000000000000000000000000000000..66f25b38fa2a6a79ce801f2e48a94fb2bcb30740 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/PreciseModuloShardingTableAlgorithm.java @@ -0,0 +1,37 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.utility.algorithm; + +import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm; +import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue; + +import java.util.Collection; + +public class PreciseModuloShardingTableAlgorithm implements PreciseShardingAlgorithm { + + @Override + public String doSharding(final Collection tableNames, final PreciseShardingValue shardingValue) { + for (String each : tableNames) { + if (each.endsWith(shardingValue.getValue() % 2 + "")) { + return each; + } + } + throw new UnsupportedOperationException(); + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/RangeModuloShardingDatabaseAlgorithm.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/RangeModuloShardingDatabaseAlgorithm.java new file mode 100644 index 0000000000000000000000000000000000000000..5b9151ab89364f22134b3caccae0414161a60e89 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/RangeModuloShardingDatabaseAlgorithm.java @@ -0,0 +1,53 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.utility.algorithm; + +import com.google.common.collect.Range; +import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm; +import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; + +public class RangeModuloShardingDatabaseAlgorithm implements RangeShardingAlgorithm { + + @Override + public Collection doSharding(final Collection databaseNames, final RangeShardingValue shardingValue) { + Set result = new LinkedHashSet<>(); + if (Range.closed(1, 5).encloses(shardingValue.getValueRange())) { + for (String each : databaseNames) { + if (each.endsWith("0")) { + result.add(each); + } + } + } else if (Range.closed(6, 10).encloses(shardingValue.getValueRange())) { + for (String each : databaseNames) { + if (each.endsWith("1")) { + result.add(each); + } + } + } else if (Range.closed(1, 10).encloses(shardingValue.getValueRange())) { + result.addAll(databaseNames); + } else { + throw new UnsupportedOperationException(); + } + return result; + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/RangeModuloShardingTableAlgorithm.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/RangeModuloShardingTableAlgorithm.java new file mode 100644 index 0000000000000000000000000000000000000000..7b8a9c83728a2540534ee44d1a312d5df4c17c6b --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/algorithm/RangeModuloShardingTableAlgorithm.java @@ -0,0 +1,45 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.utility.algorithm; + +import com.google.common.collect.Range; +import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm; +import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; + +public class RangeModuloShardingTableAlgorithm implements RangeShardingAlgorithm { + + @Override + public Collection doSharding(final Collection tableNames, final RangeShardingValue shardingValue) { + Set result = new LinkedHashSet<>(); + if (Range.closed(200000000000000000L, 400000000000000000L).encloses(shardingValue.getValueRange())) { + for (String each : tableNames) { + if (each.endsWith("0")) { + result.add(each); + } + } + } else { + throw new UnsupportedOperationException(); + } + return result; + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/config/DataSourceUtil.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/config/DataSourceUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..139ccfcd1220589dfeabea60bda66ea450363a52 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/config/DataSourceUtil.java @@ -0,0 +1,57 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.utility.config; + +import org.apache.commons.dbcp.BasicDataSource; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.HashMap; +import java.util.Map; + +public class DataSourceUtil { + + private static final String DEFAULT_SCHEMA = ""; + + private static final Map datasourceMap = new HashMap<>(); + + public static void createDataSource(final String dataSourceName) { + BasicDataSource result = new BasicDataSource(); + result.setDriverClassName("org.h2.Driver"); + result.setUrl(String.format("jdbc:h2:mem:%s", dataSourceName)); + result.setUsername("sa"); + result.setPassword(""); + datasourceMap.put(dataSourceName, result); + } + + public static DataSource getDataSource(final String dataSourceName) { + return datasourceMap.get(dataSourceName); + } + + public static void createSchema(final String dataSourceName) { + String sql = "CREATE SCHEMA " + dataSourceName; + try (Connection connection = getDataSource(DEFAULT_SCHEMA).getConnection(); + Statement statement = connection.createStatement()) { + statement.execute(sql); + } catch (final SQLException ignored) { + } + } +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/config/ExampleConfiguration.java b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/config/ExampleConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..2b0b5ab64f0baa771e4e52e114fece245e2d9115 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/java/org/apache/skywalking/apm/testcase/shardingsphere/service/utility/config/ExampleConfiguration.java @@ -0,0 +1,29 @@ +/* + * 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.skywalking.apm.testcase.shardingsphere.service.utility.config; + +import javax.sql.DataSource; +import java.sql.SQLException; + +public interface ExampleConfiguration { + + DataSource createDataSource() throws SQLException; + + DataSource getDataSource(); +} diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/resources/application.properties b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..8bdebb853851ccea1be24aa485c44995bd68d3d3 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/src/main/resources/application.properties @@ -0,0 +1,18 @@ +# 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. + +server.port=8080 +server.contextPath=/shardingsphere-4.x-RC1-RC2-scenario \ No newline at end of file diff --git a/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/support-version.list b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/support-version.list new file mode 100644 index 0000000000000000000000000000000000000000..48ad31f759dbbd544ca1f81ae46c237290b0b491 --- /dev/null +++ b/test/plugin/scenarios/shardingsphere-4.x-RC1-RC2-scenario/support-version.list @@ -0,0 +1,18 @@ +# 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 +# "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. + +4.0.0-RC1 +4.0.0-RC2 \ No newline at end of file