View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.infra.rewrite.sql.token.pojo.generic;
19  
20  import lombok.Getter;
21  import lombok.RequiredArgsConstructor;
22  import org.apache.shardingsphere.sql.parser.sql.common.enums.ParameterMarkerType;
23  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
24  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
25  import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
26  
27  import java.util.List;
28  import java.util.StringJoiner;
29  
30  /**
31   * Insert value.
32   */
33  @RequiredArgsConstructor
34  @Getter
35  public class InsertValue {
36      
37      private final List<ExpressionSegment> values;
38      
39      @Override
40      public final String toString() {
41          StringJoiner result = new StringJoiner(", ", "(", ")");
42          for (int i = 0; i < values.size(); i++) {
43              result.add(getValue(i));
44          }
45          return result.toString();
46      }
47      
48      private String getValue(final int index) {
49          ExpressionSegment expressionSegment = values.get(index);
50          if (expressionSegment instanceof ParameterMarkerExpressionSegment) {
51              ParameterMarkerExpressionSegment segment = (ParameterMarkerExpressionSegment) expressionSegment;
52              return ParameterMarkerType.QUESTION == segment.getParameterMarkerType() ? "?" : "$" + (segment.getParameterMarkerIndex() + 1);
53          }
54          if (expressionSegment instanceof LiteralExpressionSegment) {
55              Object literals = ((LiteralExpressionSegment) expressionSegment).getLiterals();
56              return getLiteralValue((LiteralExpressionSegment) expressionSegment, literals);
57          }
58          return expressionSegment.getText();
59      }
60      
61      private String getLiteralValue(final LiteralExpressionSegment expressionSegment, final Object literals) {
62          if (null == literals) {
63              return "NULL";
64          }
65          return literals instanceof String ? "'" + expressionSegment.getLiterals() + "'" : String.valueOf(literals);
66      }
67  }