Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reconstruction for Hint Manager. #1303

Merged
merged 33 commits into from
Sep 26, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ee12efb
DELETE masterRouteOnly
tristaZero Sep 26, 2018
78f29d5
ADD masterRouteOnly
tristaZero Sep 26, 2018
3e384fe
modify isMasterRouteOnly
tristaZero Sep 26, 2018
ffaea4f
modify setMasterRouteOnly()
tristaZero Sep 26, 2018
5cb1b1e
modify position
tristaZero Sep 26, 2018
b657036
use Multimap
tristaZero Sep 26, 2018
0cb4262
Multimap<String, Comparable<?>>
tristaZero Sep 26, 2018
a270061
addTableShardingValue()
tristaZero Sep 26, 2018
f1f36c4
add databaseShardingValues
tristaZero Sep 26, 2018
34bb091
clear()
tristaZero Sep 26, 2018
21d679f
modify DATABASE_SHARDING_VALUES
tristaZero Sep 26, 2018
900fa08
setDatabaseShardingValue()
tristaZero Sep 26, 2018
bec624c
HintManagerHolder.setDatabaseShardingValue(value);
tristaZero Sep 26, 2018
ade9472
use static
tristaZero Sep 26, 2018
4535233
addTableShardingValue()
tristaZero Sep 26, 2018
f9e21c2
delete invalid functions
tristaZero Sep 26, 2018
fe743b8
modify position
tristaZero Sep 26, 2018
38f3051
getShardingValue()
tristaZero Sep 26, 2018
5682c7f
getDatabaseShardingValue()
tristaZero Sep 26, 2018
c79b746
getShardingValue()
tristaZero Sep 26, 2018
035000d
getTableShardingValue()
tristaZero Sep 26, 2018
5013166
setDatabaseShardingValue()
tristaZero Sep 26, 2018
6a5ff65
check style
tristaZero Sep 26, 2018
bb82866
adjust format
tristaZero Sep 26, 2018
177c65f
setDatabaseShardingValue()
tristaZero Sep 26, 2018
c1799dd
modify cases
tristaZero Sep 26, 2018
57f9232
modify cases
tristaZero Sep 26, 2018
6573ba4
modify parameters
tristaZero Sep 26, 2018
73c7e6e
Merge branch 'dev' of ssh://github.com/shardingjdbc/sharding-jdbc int…
tristaZero Sep 26, 2018
8c1d80c
DATABASE_SHARDING_VALUES.clear();
tristaZero Sep 26, 2018
5e9a6bf
setDatabaseShardingValue()
tristaZero Sep 26, 2018
6e97edc
modify setDatabaseShardingValue()
tristaZero Sep 26, 2018
0ddd8b4
delete ShardingValue
tristaZero Sep 26, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,10 @@

package io.shardingsphere.core.api;

import com.google.common.base.Preconditions;
import com.google.common.collect.BoundType;
import com.google.common.collect.Range;
import io.shardingsphere.core.api.algorithm.sharding.ListShardingValue;
import io.shardingsphere.core.api.algorithm.sharding.RangeShardingValue;
import io.shardingsphere.core.api.algorithm.sharding.ShardingValue;
import io.shardingsphere.core.constant.ShardingOperator;
import io.shardingsphere.core.hint.HintManagerHolder;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
* The manager that use hint to inject sharding key directly through {@code ThreadLocal}.
*
Expand All @@ -43,13 +31,6 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HintManager implements AutoCloseable {

private final Map<String, ShardingValue> databaseShardingValues = new HashMap<>();

private final Map<String, ShardingValue> tableShardingValues = new HashMap<>();

@Getter
private boolean masterRouteOnly;

/**
* Get a new instance for {@code HintManager}.
*
Expand All @@ -70,103 +51,38 @@ public static HintManager getInstance() {
* @param value sharding value
*/
public void setDatabaseShardingValue(final Comparable<?> value) {
addDatabaseShardingValue(HintManagerHolder.DB_TABLE_NAME, value);
HintManagerHolder.setDatabaseShardingOnly(true);
HintManagerHolder.setDatabaseShardingValue(value);
}

/**
* Add sharding value for database.
*
* <p>The sharding operator is {@code =}</p>
*
* @param logicTable logic table name
* @param value sharding value
* Set CRUD operation force route to master database only.
*/
public void addDatabaseShardingValue(final String logicTable, final Comparable<?> value) {
addDatabaseShardingValue(logicTable, ShardingOperator.EQUAL, value);
public void setMasterRouteOnly() {
HintManagerHolder.setMasterRouteOnly(true);
}

/**
* Add sharding value for database.
*
* @param logicTable logic table name
* @param values sharding values
*/
public void addDatabaseShardingValue(final String logicTable, final Comparable<?>... values) {
addDatabaseShardingValue(logicTable, ShardingOperator.IN, values);
}

private void addDatabaseShardingValue(final String logicTable, final ShardingOperator operator, final Comparable<?>... values) {
HintManagerHolder.setDatabaseShardingOnly(false);
databaseShardingValues.put(logicTable, getShardingValue(logicTable, HintManagerHolder.DB_COLUMN_NAME, operator, values));
}

/**
* Add sharding value for table.
*
* <p>The sharding operator is {@code =}</p>
*
* @param logicTable logic table name
* @param value sharding value
*/
public void addTableShardingValue(final String logicTable, final Comparable<?> value) {
addTableShardingValue(logicTable, ShardingOperator.EQUAL, value);
public void addDatabaseShardingValue(final String logicTable, final Comparable<?> value) {
HintManagerHolder.addDatabaseShardingValue(logicTable, value);
}

/**
* Add sharding value for table.
*
* @param logicTable logic table name
* @param values sharding values
*/
public void addTableShardingValue(final String logicTable, final Comparable<?>... values) {
addTableShardingValue(logicTable, ShardingOperator.IN, values);
}

private void addTableShardingValue(final String logicTable, final ShardingOperator operator, final Comparable<?>... values) {
HintManagerHolder.setDatabaseShardingOnly(false);
tableShardingValues.put(logicTable, getShardingValue(logicTable, HintManagerHolder.DB_COLUMN_NAME, operator, values));
}

@SuppressWarnings("unchecked")
private ShardingValue getShardingValue(final String logicTable, final String shardingColumn, final ShardingOperator operator, final Comparable<?>[] values) {
Preconditions.checkArgument(null != values && values.length > 0);
switch (operator) {
case EQUAL:
case IN:
return new ListShardingValue(logicTable, shardingColumn, Arrays.asList(values));
case BETWEEN:
return new RangeShardingValue(logicTable, shardingColumn, Range.range(values[0], BoundType.CLOSED, values[1], BoundType.CLOSED));
default:
throw new UnsupportedOperationException(operator.getExpression());
}
}

/**
* Get sharding value for database.
*
* @param logicTable logic table name
* @return sharding value for database
*/
public ShardingValue getDatabaseShardingValue(final String logicTable) {
return databaseShardingValues.get(logicTable);
}

/**
* Get sharding value for table.
* <p>The sharding operator is {@code =}</p>
*
* @param logicTable logic table name
* @return sharding value for table
*/
public ShardingValue getTableShardingValue(final String logicTable) {
return tableShardingValues.get(logicTable);
}

/**
* Set CRUD operation force route to master database only.
* @param value sharding value
*/
public void setMasterRouteOnly() {
masterRouteOnly = true;
public void addTableShardingValue(final String logicTable, final Comparable<?> value) {
HintManagerHolder.addTableShardingValue(logicTable, value);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,17 @@

import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import io.shardingsphere.core.api.HintManager;
import io.shardingsphere.core.api.algorithm.sharding.ListShardingValue;
import io.shardingsphere.core.api.algorithm.sharding.ShardingValue;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.Collection;

/**
* Hint manager holder.
*
Expand All @@ -40,10 +45,17 @@ public final class HintManagerHolder {

public static final String DB_COLUMN_NAME = "DB_COLUMN_NAME";

private static final ThreadLocal<HintManager> HINT_MANAGER_HOLDER = new ThreadLocal<>();

private static final Multimap<String, Comparable<?>> DATABASE_SHARDING_VALUES = HashMultimap.create();

private static final Multimap<String, Comparable<?>> TABLE_SHARDING_VALUES = HashMultimap.create();

@Setter
private static boolean databaseShardingOnly;

private static final ThreadLocal<HintManager> HINT_MANAGER_HOLDER = new ThreadLocal<>();
@Setter
private static boolean isMasterRouteOnly;

/**
* Set hint manager.
Expand All @@ -55,6 +67,46 @@ public static void setHintManager(final HintManager hintManager) {
HINT_MANAGER_HOLDER.set(hintManager);
}

/**
* Add sharding value for one certain sharding database.
*
* <p>The sharding operator is {@code =}</p>
* When you need to assign the values to one certain sharding database, use this method to add sharding value for this database.
*
* @param value sharding value
*/
public static void setDatabaseShardingValue(final Comparable<?> value) {
DATABASE_SHARDING_VALUES.clear();
addDatabaseShardingValue(DB_TABLE_NAME, value);
databaseShardingOnly = true;
}

/**
* Add sharding value for database.
*
* <p>The sharding operator is {@code =}</p>
*
* @param logicTable logic table name
* @param value sharding value
*/
public static void addDatabaseShardingValue(final String logicTable, final Comparable<?> value) {
DATABASE_SHARDING_VALUES.put(logicTable, value);
databaseShardingOnly = false;
}

/**
* Add sharding value for table.
*
* <p>The sharding operator is {@code =}</p>
*
* @param logicTable logic table name
* @param value sharding value
*/
public static void addTableShardingValue(final String logicTable, final Comparable<?> value) {
TABLE_SHARDING_VALUES.put(logicTable, value);
databaseShardingOnly = false;
}

/**
* Judge whether only database is sharding.
*
Expand All @@ -64,14 +116,26 @@ public static boolean isDatabaseShardingOnly() {
return null != HINT_MANAGER_HOLDER.get() && databaseShardingOnly;
}

/**
* Judge whether it is routed to master database or not.
*
* @return is force route to master database only or not
*/
public static boolean isMasterRouteOnly() {
return null != HINT_MANAGER_HOLDER.get() && isMasterRouteOnly;
}

/**
* Get database sharding value.
*
* @param logicTable logic table
* @return database sharding value
*/
public static Optional<ShardingValue> getDatabaseShardingValue(final String logicTable) {
return null != HINT_MANAGER_HOLDER.get() ? Optional.fromNullable(HINT_MANAGER_HOLDER.get().getDatabaseShardingValue(logicTable)) : Optional.<ShardingValue>absent();
if (null == HINT_MANAGER_HOLDER.get() || !DATABASE_SHARDING_VALUES.containsKey(logicTable)) {
return Optional.absent();
}
return Optional.of(getShardingValue(logicTable, DATABASE_SHARDING_VALUES.get(logicTable)));
}

/**
Expand All @@ -81,31 +145,35 @@ public static Optional<ShardingValue> getDatabaseShardingValue(final String logi
* @return table sharding value
*/
public static Optional<ShardingValue> getTableShardingValue(final String logicTable) {
return null != HINT_MANAGER_HOLDER.get() ? Optional.fromNullable(HINT_MANAGER_HOLDER.get().getTableShardingValue(logicTable)) : Optional.<ShardingValue>absent();
if (null == HINT_MANAGER_HOLDER.get() || !TABLE_SHARDING_VALUES.containsKey(logicTable)) {
return Optional.absent();
}
return Optional.of(getShardingValue(logicTable, TABLE_SHARDING_VALUES.get(logicTable)));
}

@SuppressWarnings("unchecked")
private static ShardingValue getShardingValue(final String logicTable, final Collection<Comparable<?>> values) {
Preconditions.checkArgument(null != values && !values.isEmpty());
return new ListShardingValue(logicTable, DB_COLUMN_NAME, values);
}

/**
* Adjust is force route to master database only or not.
*
* @return is force route to master database only or not
* Get hint manager in current thread.
*
* @return hint manager in current thread
*/
public static boolean isMasterRouteOnly() {
return null != HINT_MANAGER_HOLDER.get() && HINT_MANAGER_HOLDER.get().isMasterRouteOnly();
public static HintManager get() {
return HINT_MANAGER_HOLDER.get();
}

/**
* Clear hint manager for current thread-local.
*/
public static void clear() {
HINT_MANAGER_HOLDER.remove();
}

/**
* Get hint manager in current thread.
*
* @return hint manager in current thread
*/
public static HintManager get() {
return HINT_MANAGER_HOLDER.get();
DATABASE_SHARDING_VALUES.clear();
TABLE_SHARDING_VALUES.clear();
databaseShardingOnly = false;
isMasterRouteOnly = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,18 +32,20 @@ public void assertAddDatabaseShardingValueForEquals() {
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.addDatabaseShardingValue("logicTable", 1);
assertTrue(HintManagerHolder.getDatabaseShardingValue("logicTable").isPresent());
assertThat(hintManager.getDatabaseShardingValue("logicTable").getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue<? extends Comparable>) hintManager.getDatabaseShardingValue("logicTable")).getValues().iterator().next(), is((Comparable) 1));
assertThat(HintManagerHolder.getDatabaseShardingValue("logicTable").get().getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue<? extends Comparable>) HintManagerHolder.getDatabaseShardingValue("logicTable").get()).getValues().iterator().next(), is((Comparable) 1));
}
}

@Test
public void assertAddDatabaseShardingValueForIn() {
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.addDatabaseShardingValue("logicTable", 1, 3, 5);
hintManager.addDatabaseShardingValue("logicTable", 1);
hintManager.addDatabaseShardingValue("logicTable", 3);
hintManager.addDatabaseShardingValue("logicTable", 5);
assertTrue(HintManagerHolder.getDatabaseShardingValue("logicTable").isPresent());
assertThat(hintManager.getDatabaseShardingValue("logicTable").getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue) hintManager.getDatabaseShardingValue("logicTable")).getValues().size(), is(3));
assertThat(HintManagerHolder.getDatabaseShardingValue("logicTable").get().getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue) HintManagerHolder.getDatabaseShardingValue("logicTable").get()).getValues().size(), is(3));
}
}

Expand All @@ -53,18 +55,20 @@ public void assertAddTableShardingValueForEquals() {
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.addTableShardingValue("logicTable", 1);
assertTrue(HintManagerHolder.getTableShardingValue("logicTable").isPresent());
assertThat(hintManager.getTableShardingValue("logicTable").getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue<? extends Comparable>) hintManager.getTableShardingValue("logicTable")).getValues().iterator().next(), is((Comparable) 1));
assertThat(HintManagerHolder.getTableShardingValue("logicTable").get().getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue<? extends Comparable>) HintManagerHolder.getTableShardingValue("logicTable").get()).getValues().iterator().next(), is((Comparable) 1));
}
}

@Test
public void assertAddTableShardingValueForIn() {
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.addTableShardingValue("logicTable", 1, 3, 5);
hintManager.addTableShardingValue("logicTable", 1);
hintManager.addTableShardingValue("logicTable", 3);
hintManager.addTableShardingValue("logicTable", 5);
assertTrue(HintManagerHolder.getTableShardingValue("logicTable").isPresent());
assertThat(hintManager.getTableShardingValue("logicTable").getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue) hintManager.getTableShardingValue("logicTable")).getValues().size(), is(3));
assertThat(HintManagerHolder.getTableShardingValue("logicTable").get().getColumnName(), is(HintManagerHolder.DB_COLUMN_NAME));
assertThat(((ListShardingValue) HintManagerHolder.getTableShardingValue("logicTable").get()).getValues().size(), is(3));
}
}

Expand All @@ -73,8 +77,8 @@ public void assertAddDatabaseShardingOnly() {
try (HintManager hintManager = HintManager.getInstance()) {
hintManager.setDatabaseShardingValue("1");
assertTrue(HintManagerHolder.isDatabaseShardingOnly());
assertThat((String) ((ListShardingValue)
hintManager.getDatabaseShardingValue(HintManagerHolder.DB_TABLE_NAME)).getValues().iterator().next(), is("1"));
assertThat((String) ((ListShardingValue)
HintManagerHolder.getDatabaseShardingValue(HintManagerHolder.DB_TABLE_NAME).get()).getValues().iterator().next(), is("1"));
}
}
}
Loading