Example #1
0
        private IComparable GetValue(ParameterMarkerExpressionSegment expressionSegment, ParameterContext parameterContext)
        {
            object result = parameterContext.GetParameterValue(expressionSegment.GetParameterName());

            ShardingAssert.Else(result is IComparable, "Sharding value must implements IComparable.");
            return((IComparable)result);
        }
Example #2
0
        private IComparable GetValue(LiteralExpressionSegment expressionSegment)
        {
            object result = expressionSegment.GetLiterals();

            ShardingAssert.Else(result is IComparable, "Sharding value must implements IComparable.");
            return((IComparable)result);
        }
Example #3
0
        public RouteContext Decorate(RouteContext routeContext, ShardingConnectorMetaData metaData, ShardingRule shardingRule,
                                     ConfigurationProperties properties)
        {
            var sqlStatementContext = routeContext.GetSqlCommandContext();
            // var tableNames = sqlStatementContext.GetTablesContext().GetTableNames();
            // if (!shardingRule.TableRules.Any(o => tableNames.Any(t => o.LogicTable.EqualsIgnoreCase(t))))
            // {
            //     return routeContext;
            // }
            var parameters = routeContext.GetParameterContext();

            ShardingCommandValidatorFactory.NewInstance(
                sqlStatementContext.GetSqlCommand())
            .IfPresent(validator => validator.Validate(shardingRule, sqlStatementContext.GetSqlCommand(), parameters));
            ShardingConditions shardingConditions = GetShardingConditions(parameters, sqlStatementContext, metaData.Schema, shardingRule);
            var needMergeShardingValues           = IsNeedMergeShardingValues(sqlStatementContext, shardingRule);

            if (needMergeShardingValues && sqlStatementContext.GetSqlCommand() is DMLCommand)
            {
                CheckSubQueryShardingValues(sqlStatementContext, shardingRule, shardingConditions);
                MergeShardingConditions(shardingConditions);
            }
            var         shardingRouteEngine = ShardingRouteEngineFactory.NewInstance(shardingRule, metaData, sqlStatementContext, shardingConditions, properties);
            RouteResult routeResult         = shardingRouteEngine.Route(shardingRule);

            if (needMergeShardingValues)
            {
                ShardingAssert.Else(1 == routeResult.GetRouteUnits().Count, "Must have one sharding with sub query.");
            }
            return(new RouteContext(sqlStatementContext, parameters, routeResult));
        }
        private IComparable GetAggregationValue(IStreamDataReader streamDataReader, AggregationProjection aggregationProjection)
        {
            object result = streamDataReader.GetValue(aggregationProjection.GetIndex());

            ShardingAssert.Else(null == result || result is IComparable, "Aggregation value must implements Comparable");
            return((IComparable)result);
        }
        /**
         * Get a new instance for {@code HintManager}.
         *
         * @return  {@code HintManager} instance
         */
        public static HintManager GetInstance()
        {
            ShardingAssert.Else(null == HINT_MANAGER_HOLDER.Value, "Hint has previous value, please clear first.");
            HintManager result = new HintManager();

            HINT_MANAGER_HOLDER.Value = result;
            return(result);
        }
        private ICollection <string> RouteDataSources(ShardingRule shardingRule, TableRule tableRule, List <IRouteValue> databaseShardingValues)
        {
            if (databaseShardingValues.IsEmpty())
            {
                return(tableRule.GetActualDatasourceNames());
            }
            ICollection <string> result = new HashSet <string>(shardingRule.GetDatabaseShardingStrategy(tableRule).DoSharding(tableRule.GetActualDatasourceNames(), databaseShardingValues, this.Properties));

            ShardingAssert.If(result.IsEmpty(), "no database route info");
            ShardingAssert.Else(tableRule.GetActualDatasourceNames().All(o => result.Contains(o)), $"Some routed data sources do not belong to configured data sources. routed data sources: `{result}`, configured data sources: `{tableRule.GetActualDatasourceNames()}`");

            return(result);
        }
        private IComparable GetRouteValue(ISimpleExpressionSegment expressionSegment, ParameterContext parameterContext)
        {
            object result;

            if (expressionSegment is ParameterMarkerExpressionSegment parameterMarkerExpressionSegment)
            {
                result = parameterContext.GetParameterValue(parameterMarkerExpressionSegment.GetParameterName());
            }
            else
            {
                result = ((LiteralExpressionSegment)expressionSegment).GetLiterals();
            }

            ShardingAssert.Else(result is IComparable, "Sharding value must implements IComparable.");
            return((IComparable)result);
        }
Example #8
0
 private void CheckSubQueryShardingValues(ISqlCommandContext <ISqlCommand> sqlStatementContext, ShardingRule shardingRule, ShardingConditions shardingConditions)
 {
     foreach (var tableName in sqlStatementContext.GetTablesContext().GetTableNames())
     {
         var tableRule = shardingRule.FindTableRule(tableName);
         if (tableRule != null && IsRoutingByHint(shardingRule, tableRule) &&
             HintManager.GetDatabaseShardingValues(tableName).Any() && HintManager.GetTableShardingValues(tableName).Any())
         {
             return;
         }
     }
     ShardingAssert.If(shardingConditions.Conditions.IsEmpty(), "Must have sharding column with subquery.");
     if (shardingConditions.Conditions.Count > 1)
     {
         ShardingAssert.Else(IsSameShardingCondition(shardingRule, shardingConditions), "Sharding value must same with subquery.");
     }
 }
Example #9
0
        private int Compare(MemoryQueryResultRow o1, MemoryQueryResultRow o2, ICollection <OrderByItem> orderByItems)
        {
            foreach (var orderByItem in orderByItems)
            {
                Object orderValue1 = o1.GetCell(orderByItem.GetIndex());
                ShardingAssert.Else(null == orderValue1 || orderValue1 is IComparable, "Order by value must implements Comparable");
                Object orderValue2 = o2.GetCell(orderByItem.GetIndex());
                ShardingAssert.Else(null == orderValue2 || orderValue2 is IComparable, "Order by value must implements Comparable");
                int result = CompareUtil.CompareTo((IComparable)orderValue1, (IComparable)orderValue2, orderByItem.GetSegment().GetOrderDirection(),
                                                   orderByItem.GetSegment().GetNullOrderDirection(), valueCaseSensitive[orderByItem.GetIndex()]);
                if (0 != result)
                {
                    return(result);
                }
            }

            return(0);
        }