linghengqian commented on issue #22899:
URL: 
https://github.com/apache/shardingsphere/issues/22899#issuecomment-1364102613

   - For a long time no one gave an opinion. Let me expand on this issue a bit. 
Considering sharding by date, we should not limit the expression, but directly 
build an algorithmic SPI.
   ```java
   import org.apache.shardingsphere.infra.util.spi.lifecycle.SPIPostProcessor;
   import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
   import java.util.Properties;
   
   public interface AbstractActualdataNodes extends TypedSPI, SPIPostProcessor {
      /**
        *
        * @return result real table list
        */
      List<String> getActualDataNodes();
   
      /**
        * Get properties.
        *
        * @return properties
        */
       Properties getProps();
   }
   ```
   - We should only consider the `java.util.List` of the final real table. For 
the simplest case of sharding by date, the configuration of the simplest 
implementation class using JSR 310 should be similar to the following.
   ```yaml
   rules:
      - !SHARDING
        tables:
          t_order:
            actualDataNodes:
              type: SINGLE_TABLE
              props:
               table-prefix: t_order # The prefix of the real table
               datetime-lower: 2022-10-01 # lower limit of time
               datetime-upper: 2022-12-31 # time upper limit
               datetime-pattern: yyyy-MM-dd # A string conforming to the format 
of java.time.format.DateTimeFormatter, used to convert datetime-lower and 
datetime-upper
               table-suffix-pattern: _yyyyMM # The suffix of the real table, 
also follows the format of java.time.format.DateTimeFormatter
               datetime-interval-amount: 1 # time interval
               datetime-interval-unit: MONTHS # follow 
java.time.temporal.ChronoUnit
   ```
   - It should end up producing an ArrayList containing 
`[t_order_202210,t_order_202211,t_order_202212]`.
   - Let's assume a simple function to do this conversion.
   ```java
   import org.junit.jupiter.api.Test;
   
   import java.time.LocalDate;
   import java.time.format.DateTimeFormatter;
   import java.time.temporal.ChronoField;
   import java.time.temporal.ChronoUnit;
   import java.time.temporal.TemporalAccessor;
   import java.util.List;
   import java.util.stream.LongStream;
   
   public class DateTest {
       @Test
       void testDate() {
           DateTimeFormatter dateTimeFormatter = 
DateTimeFormatter.ofPattern("yyyy-MM-dd");
           TemporalAccessor start = dateTimeFormatter.parse("2022-10-01");
           TemporalAccessor end = dateTimeFormatter.parse("2022-12-31");
           if (!start.isSupported(ChronoField.NANO_OF_DAY) && 
start.isSupported(ChronoField.EPOCH_DAY)) {
               LocalDate startTime = start.query(LocalDate::from);
               LocalDate endTime = end.query(LocalDate::from);
               List<String> actualDataNodes = LongStream.range(0, 
ChronoUnit.MONTHS.between(startTime, endTime.plusMonths(1)))
                       .mapToObj(startTime::plusMonths)
                       .map(localDate -> "t_order" + 
localDate.format(DateTimeFormatter.ofPattern("_yyyyMM")))
                       .toList();
               assert actualDataNodes.equals(List.of("t_order_202210", 
"t_order_202211", "t_order_202212"));
           }
       }
   }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to