Skip to content

Commit 9df470f

Browse files
committed
fixed
1 parent 2b6dc23 commit 9df470f

File tree

7 files changed

+99
-8
lines changed

7 files changed

+99
-8
lines changed

api/src/main/java/org/apache/gravitino/rel/expressions/distributions/Distributions.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
/** Helper methods to create distributions to pass into Apache Gravitino. */
2727
public class Distributions {
2828

29+
/**
30+
* AUTO indicates that the number of buckets is automatically determined by the system (without
31+
* the need for manual specification).
32+
*/
33+
public static final int AUTO = -1;
34+
2935
/** NONE is used to indicate that there is no distribution. */
3036
public static final Distribution NONE =
3137
new DistributionImpl(Strategy.NONE, 0, Expression.EMPTY_EXPRESSION);
@@ -74,6 +80,17 @@ public static Distribution of(Strategy strategy, int number, Expression... expre
7480
return new DistributionImpl(strategy, number, expressions);
7581
}
7682

83+
/**
84+
* Create a distribution by the given strategy, the number of buckets is not used.
85+
*
86+
* @param strategy The strategy to use
87+
* @param expressions The expressions to distribute by
88+
* @return The created distribution
89+
*/
90+
public static Distribution auto(Strategy strategy, Expression... expressions) {
91+
return new DistributionImpl(strategy, AUTO, expressions);
92+
}
93+
7794
/**
7895
* Create a distribution on columns. Like distribute by (a) or (a, b), for complex like
7996
* distributing by (func(a), b) or (func(a), func(b)), please use {@link DistributionImpl.Builder}

catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/operation/DorisTableOperations.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ protected String generateCreateTableSql(
134134
}
135135

136136
if (distribution.number() != 0) {
137-
sqlBuilder.append(" BUCKETS ").append(distribution.number());
137+
sqlBuilder.append(" BUCKETS ").append(DorisUtils.toBucketNumberString(distribution.number()));
138138
}
139139

140140
properties = appendNecessaryProperties(properties);

catalogs/catalog-jdbc-doris/src/main/java/org/apache/gravitino/catalog/doris/utils/DorisUtils.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.stream.Collectors;
3030
import org.apache.gravitino.rel.expressions.NamedReference;
3131
import org.apache.gravitino.rel.expressions.distributions.Distribution;
32+
import org.apache.gravitino.rel.expressions.distributions.Distributions;
3233
import org.apache.gravitino.rel.expressions.distributions.Distributions.DistributionImpl;
3334
import org.apache.gravitino.rel.expressions.distributions.Strategy;
3435
import org.apache.gravitino.rel.expressions.literals.Literal;
@@ -48,7 +49,7 @@ public final class DorisUtils {
4849

4950
private static final Pattern DISTRIBUTION_INFO_PATTERN =
5051
Pattern.compile(
51-
"DISTRIBUTED BY\\s+(HASH|RANDOM)\\s*(\\(([^)]+)\\))?\\s*(BUCKETS\\s+(\\d+))?");
52+
"DISTRIBUTED BY\\s+(HASH|RANDOM)\\s*(\\(([^)]+)\\))?\\s*(BUCKETS\\s+(\\d+|AUTO))?");
5253

5354
private static final String LIST_PARTITION = "LIST";
5455
private static final String RANGE_PARTITION = "RANGE";
@@ -202,11 +203,8 @@ public static Distribution extractDistributionInfoFromSql(String createTableSql)
202203
.map(f -> f.substring(1, f.length() - 1))
203204
.toArray(String[]::new);
204205

205-
// Default bucket number is 1.
206-
int bucketNum = 1;
207-
if (matcher.find(5)) {
208-
bucketNum = Integer.valueOf(matcher.group(5));
209-
}
206+
// Default bucket number is 1, auto is -1.
207+
int bucketNum = extractBucketNum(matcher);
210208

211209
return new DistributionImpl.Builder()
212210
.withStrategy(Strategy.getByName(distributionType))
@@ -220,4 +218,21 @@ public static Distribution extractDistributionInfoFromSql(String createTableSql)
220218

221219
throw new RuntimeException("Failed to extract distribution info in sql:" + createTableSql);
222220
}
221+
222+
private static int extractBucketNum(Matcher matcher) {
223+
int bucketNum = 1;
224+
if (matcher.find(5)) {
225+
String bucketValue = matcher.group(5);
226+
// Use -1 to indicate auto bucket.
227+
bucketNum =
228+
bucketValue.trim().toUpperCase().equals("AUTO")
229+
? Distributions.AUTO
230+
: Integer.valueOf(bucketValue);
231+
}
232+
return bucketNum;
233+
}
234+
235+
public static String toBucketNumberString(int number) {
236+
return number == Distributions.AUTO ? "AUTO" : String.valueOf(number);
237+
}
223238
}

catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/integration/test/CatalogDorisIT.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import org.apache.gravitino.rel.expressions.NamedReference;
6262
import org.apache.gravitino.rel.expressions.distributions.Distribution;
6363
import org.apache.gravitino.rel.expressions.distributions.Distributions;
64+
import org.apache.gravitino.rel.expressions.distributions.Strategy;
6465
import org.apache.gravitino.rel.expressions.literals.Literal;
6566
import org.apache.gravitino.rel.expressions.literals.Literals;
6667
import org.apache.gravitino.rel.expressions.sorts.SortOrder;
@@ -1004,4 +1005,35 @@ void testAllDistribution() {
10041005
tableCatalog.dropTable(tableIdentifier);
10051006
}
10061007
}
1008+
1009+
@Test
1010+
void testAllDistributionWithAuto() {
1011+
Distribution distribution =
1012+
Distributions.auto(Strategy.HASH, NamedReference.field(DORIS_COL_NAME1));
1013+
1014+
String tableName = GravitinoITUtils.genRandomName("test_distribution_table");
1015+
NameIdentifier tableIdentifier = NameIdentifier.of(schemaName, tableName);
1016+
Column[] columns = createColumns();
1017+
Index[] indexes = Indexes.EMPTY_INDEXES;
1018+
Map<String, String> properties = createTableProperties();
1019+
Transform[] partitioning = Transforms.EMPTY_TRANSFORM;
1020+
TableCatalog tableCatalog = catalog.asTableCatalog();
1021+
tableCatalog.createTable(
1022+
tableIdentifier,
1023+
columns,
1024+
table_comment,
1025+
properties,
1026+
partitioning,
1027+
distribution,
1028+
null,
1029+
indexes);
1030+
// load table
1031+
Table loadTable = tableCatalog.loadTable(tableIdentifier);
1032+
1033+
Assertions.assertEquals(distribution.strategy(), loadTable.distribution().strategy());
1034+
Assertions.assertEquals(distribution.number(), loadTable.distribution().number());
1035+
Assertions.assertArrayEquals(
1036+
distribution.expressions(), loadTable.distribution().expressions());
1037+
tableCatalog.dropTable(tableIdentifier);
1038+
}
10071039
}

catalogs/catalog-jdbc-doris/src/test/java/org/apache/gravitino/catalog/doris/utils/TestDorisUtils.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.HashMap;
2727
import java.util.Map;
2828
import java.util.Optional;
29+
import org.apache.gravitino.rel.expressions.distributions.Distribution;
2930
import org.apache.gravitino.rel.expressions.literals.Literal;
3031
import org.apache.gravitino.rel.expressions.literals.Literals;
3132
import org.apache.gravitino.rel.expressions.transforms.Transform;
@@ -171,4 +172,17 @@ public void testGeneratePartitionSqlFragment() {
171172
partitionSqlFragment = DorisUtils.generatePartitionSqlFragment(partition);
172173
assertEquals("PARTITION `p7` VALUES IN ((\"1\",\"2\"),(\"3\",\"4\"))", partitionSqlFragment);
173174
}
175+
176+
@Test
177+
public void testDistributedInfoPattern() {
178+
String createTableSql =
179+
"CREATE TABLE `testTable` (\n`col1` date NOT NULL\n) ENGINE=OLAP\n PARTITION BY RANGE(`col1`)\n()\n DISTRIBUTED BY HASH(`col1`) BUCKETS 2";
180+
Distribution distribution = DorisUtils.extractDistributionInfoFromSql(createTableSql);
181+
assertEquals(distribution.number(), 2);
182+
183+
String createTableSqlWithAuto =
184+
"CREATE TABLE `testTable` (\n`col1` date NOT NULL\n) ENGINE=OLAP\n PARTITION BY RANGE(`col1`)\n()\n DISTRIBUTED BY HASH(`col1`) BUCKETS AUTO";
185+
Distribution distribution2 = DorisUtils.extractDistributionInfoFromSql(createTableSqlWithAuto);
186+
assertEquals(distribution2.number(), -1);
187+
}
174188
}

common/src/main/java/org/apache/gravitino/dto/rel/DistributionDTO.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ public DistributionDTO build() {
163163
strategy = strategy == null ? Strategy.HASH : strategy;
164164

165165
Preconditions.checkState(args != null, "expressions cannot be null");
166-
Preconditions.checkState(number >= 0, "bucketNum must be greater than 0");
166+
// Check if the number of buckets is greater than -1, -1 is auto.
167+
Preconditions.checkState(number >= -1, "bucketNum must be greater than -1");
167168
return new DistributionDTO(strategy, number, args);
168169
}
169170
}

docs/table-partitioning-distribution-sort-order-indexes.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,21 @@ Distributions.of(Strategy.HASH, 4, NamedReference.field("score"));
8484
```
8585

8686
</TabItem>
87+
88+
<TabItem value="java" label="Java">
89+
if you want to use auto distribution, you can use the following code, it will set the number is -1.
90+
91+
```java
92+
// Auto distribution with strategy and fields
93+
Distributions.auto(Strategy.HASH, NamedReference.field("score"));
94+
```
95+
</TabItem>
96+
8797
</Tabs>
8898

8999

100+
101+
90102
## Sort ordering
91103

92104
To define a sorted order table, you should use the following three components to construct a valid sorted order table.

0 commit comments

Comments
 (0)