Skip to content

Commit

Permalink
Merge ed15538 into 657f6d1
Browse files Browse the repository at this point in the history
  • Loading branch information
loxp committed Nov 17, 2018
2 parents 657f6d1 + ed15538 commit b064c3b
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 67 deletions.
27 changes: 23 additions & 4 deletions sharding-core/src/main/java/io/shardingsphere/api/HintManager.java
Expand Up @@ -17,8 +17,11 @@

package io.shardingsphere.api;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import io.shardingsphere.core.hint.HintManagerHolder;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
Expand All @@ -31,6 +34,18 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class HintManager implements AutoCloseable {

@Getter
private final Multimap<String, Comparable<?>> databaseShardingValues = HashMultimap.create();

@Getter
private final Multimap<String, Comparable<?>> tableShardingValues = HashMultimap.create();

@Getter
private boolean databaseShardingOnly;

@Getter
private boolean masterRouteOnly;

/**
* Get a new instance for {@code HintManager}.
*
Expand All @@ -51,14 +66,16 @@ public static HintManager getInstance() {
* @param value sharding value
*/
public void setDatabaseShardingValue(final Comparable<?> value) {
HintManagerHolder.setDatabaseShardingValue(value);
databaseShardingValues.clear();
addDatabaseShardingValue(HintManagerHolder.DB_TABLE_NAME, value);
databaseShardingOnly = true;
}

/**
* Set CRUD operation force route to master database only.
*/
public void setMasterRouteOnly() {
HintManagerHolder.setMasterRouteOnly(true);
masterRouteOnly = true;
}

/**
Expand All @@ -70,7 +87,8 @@ public void setMasterRouteOnly() {
* @param value sharding value
*/
public void addDatabaseShardingValue(final String logicTable, final Comparable<?> value) {
HintManagerHolder.addDatabaseShardingValue(logicTable, value);
databaseShardingValues.put(logicTable, value);
databaseShardingOnly = false;
}

/**
Expand All @@ -82,7 +100,8 @@ public void addDatabaseShardingValue(final String logicTable, final Comparable<?
* @param value sharding value
*/
public void addTableShardingValue(final String logicTable, final Comparable<?> value) {
HintManagerHolder.addTableShardingValue(logicTable, value);
tableShardingValues.put(logicTable, value);
databaseShardingOnly = false;
}

@Override
Expand Down
Expand Up @@ -19,14 +19,11 @@

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.api.HintManager;
import io.shardingsphere.api.algorithm.sharding.ListShardingValue;
import io.shardingsphere.api.algorithm.sharding.ShardingValue;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.Collection;

Expand All @@ -47,16 +44,6 @@ public final class HintManagerHolder {

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;

@Setter
private static boolean isMasterRouteOnly;

/**
* Set hint manager.
*
Expand All @@ -67,53 +54,13 @@ 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.
*
* @return database sharding or not
*/
public static boolean isDatabaseShardingOnly() {
return null != HINT_MANAGER_HOLDER.get() && databaseShardingOnly;
return null != HINT_MANAGER_HOLDER.get() && HINT_MANAGER_HOLDER.get().isDatabaseShardingOnly();
}

/**
Expand All @@ -122,7 +69,7 @@ public static boolean isDatabaseShardingOnly() {
* @return is force route to master database only or not
*/
public static boolean isMasterRouteOnly() {
return null != HINT_MANAGER_HOLDER.get() && isMasterRouteOnly;
return null != HINT_MANAGER_HOLDER.get() && HINT_MANAGER_HOLDER.get().isMasterRouteOnly();
}

/**
Expand All @@ -132,10 +79,10 @@ public static boolean isMasterRouteOnly() {
* @return database sharding value
*/
public static Optional<ShardingValue> getDatabaseShardingValue(final String logicTable) {
if (null == HINT_MANAGER_HOLDER.get() || !DATABASE_SHARDING_VALUES.containsKey(logicTable)) {
if (null == HINT_MANAGER_HOLDER.get() || !HINT_MANAGER_HOLDER.get().getDatabaseShardingValues().containsKey(logicTable)) {
return Optional.absent();
}
return Optional.of(getShardingValue(logicTable, DATABASE_SHARDING_VALUES.get(logicTable)));
return Optional.of(getShardingValue(logicTable, HINT_MANAGER_HOLDER.get().getDatabaseShardingValues().get(logicTable)));
}

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

@SuppressWarnings("unchecked")
Expand All @@ -171,9 +118,5 @@ public static HintManager get() {
*/
public static void clear() {
HINT_MANAGER_HOLDER.remove();
DATABASE_SHARDING_VALUES.clear();
TABLE_SHARDING_VALUES.clear();
databaseShardingOnly = false;
isMasterRouteOnly = false;
}
}
Expand Up @@ -66,6 +66,12 @@ public void assertIsMasterRouteOnlyWithoutSet() {
hintManager.close();
assertFalse(HintManagerHolder.isMasterRouteOnly());
}

@Test
public void assertIsDatabaseShardingOnly() {
hintManager.setDatabaseShardingValue("1");
assertTrue(HintManagerHolder.isDatabaseShardingOnly());
}

@Test
public void assertIsDatabaseShardingOnlyWithoutSet() {
Expand All @@ -77,6 +83,8 @@ public void assertIsDatabaseShardingOnlyWithoutSet() {
public void assertIsMasterRouteOnly() {
hintManager.setMasterRouteOnly();
assertTrue(HintManagerHolder.isMasterRouteOnly());
hintManager.close();
assertFalse(HintManagerHolder.isMasterRouteOnly());
}

@Test
Expand Down

0 comments on commit b064c3b

Please sign in to comment.