Skip to content

Commit b669618

Browse files
Copilotnnhy
andcommitted
代码审查修复:UniqueConstraintViolation错误码、TIME_BUCKET边界保护、辅助方法提取
Co-authored-by: nnhy <506367+nnhy@users.noreply.github.com>
1 parent 678591a commit b669618

4 files changed

Lines changed: 29 additions & 35 deletions

File tree

NewLife.NovaDb/Core/NovaException.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public enum ErrorCode
6767
/// <summary>约束违反</summary>
6868
ConstraintViolation = 4003,
6969

70+
/// <summary>唯一约束违反</summary>
71+
UniqueConstraintViolation = 4009,
72+
7073
/// <summary>分片未找到</summary>
7174
ShardNotFound = 4004,
7275

NewLife.NovaDb/Engine/NovaTable.cs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -486,10 +486,7 @@ public void CreateSecondaryIndex(IndexDefinition indexDef, Transaction tx)
486486
var idx = new SkipList<ComparableObject, List<ComparableObject>>();
487487
_secondaryIndexes[indexDef.IndexName] = idx;
488488

489-
// 获取索引列的序号
490-
var colOrdinals = new Int32[indexDef.Columns.Count];
491-
for (var i = 0; i < indexDef.Columns.Count; i++)
492-
colOrdinals[i] = _schema.GetColumnIndex(indexDef.Columns[i]);
489+
var colOrdinals = GetColumnOrdinals(indexDef);
493490

494491
var pkCol = _schema.GetPrimaryKeyColumn()!;
495492

@@ -513,7 +510,7 @@ public void CreateSecondaryIndex(IndexDefinition indexDef, Transaction tx)
513510
}
514511
else if (indexDef.IsUnique && pkList!.Count > 0)
515512
{
516-
throw new NovaException(ErrorCode.PrimaryKeyConflict, $"Duplicate key in unique index '{indexDef.IndexName}'");
513+
throw new NovaException(ErrorCode.UniqueConstraintViolation, $"Duplicate key in unique index '{indexDef.IndexName}'");
517514
}
518515

519516
pkList!.Add(pk);
@@ -557,6 +554,15 @@ public void DropSecondaryIndex(String indexName)
557554
}
558555
}
559556

557+
/// <summary>获取索引定义的列序号数组</summary>
558+
private Int32[] GetColumnOrdinals(IndexDefinition indexDef)
559+
{
560+
var colOrdinals = new Int32[indexDef.Columns.Count];
561+
for (var i = 0; i < indexDef.Columns.Count; i++)
562+
colOrdinals[i] = _schema.GetColumnIndex(indexDef.Columns[i]);
563+
return colOrdinals;
564+
}
565+
560566
/// <summary>构建索引键</summary>
561567
private static ComparableObject BuildIndexKey(Object?[] row, Int32[] colOrdinals)
562568
{
@@ -579,10 +585,7 @@ private void InsertIntoSecondaryIndexes(Object?[] row, ComparableObject pk)
579585
var indexDef = _schema.GetIndex(kvp.Key);
580586
if (indexDef == null) continue;
581587

582-
var colOrdinals = new Int32[indexDef.Columns.Count];
583-
for (var i = 0; i < indexDef.Columns.Count; i++)
584-
colOrdinals[i] = _schema.GetColumnIndex(indexDef.Columns[i]);
585-
588+
var colOrdinals = GetColumnOrdinals(indexDef);
586589
var indexKey = BuildIndexKey(row, colOrdinals);
587590
var idx = kvp.Value;
588591

@@ -593,7 +596,7 @@ private void InsertIntoSecondaryIndexes(Object?[] row, ComparableObject pk)
593596
}
594597
else if (indexDef.IsUnique && pkList!.Count > 0)
595598
{
596-
throw new NovaException(ErrorCode.PrimaryKeyConflict, $"Duplicate key in unique index '{indexDef.IndexName}'");
599+
throw new NovaException(ErrorCode.UniqueConstraintViolation, $"Duplicate key in unique index '{indexDef.IndexName}'");
597600
}
598601

599602
pkList!.Add(pk);
@@ -608,10 +611,7 @@ private void RemoveFromSecondaryIndexes(Object?[] row, ComparableObject pk)
608611
var indexDef = _schema.GetIndex(kvp.Key);
609612
if (indexDef == null) continue;
610613

611-
var colOrdinals = new Int32[indexDef.Columns.Count];
612-
for (var i = 0; i < indexDef.Columns.Count; i++)
613-
colOrdinals[i] = _schema.GetColumnIndex(indexDef.Columns[i]);
614-
614+
var colOrdinals = GetColumnOrdinals(indexDef);
615615
var indexKey = BuildIndexKey(row, colOrdinals);
616616
var idx = kvp.Value;
617617

NewLife.NovaDb/Engine/TableSchema.cs

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,8 @@ public void AddIndex(IndexDefinition index)
222222
{
223223
if (index == null) throw new ArgumentNullException(nameof(index));
224224

225-
// 检查索引名是否重复
226-
foreach (var existing in _indexes)
227-
{
228-
if (String.Equals(existing.IndexName, index.IndexName, StringComparison.OrdinalIgnoreCase))
229-
throw new NovaException(ErrorCode.InvalidArgument, $"Index '{index.IndexName}' already exists");
230-
}
225+
if (FindIndexByName(index.IndexName) != null)
226+
throw new NovaException(ErrorCode.InvalidArgument, $"Index '{index.IndexName}' already exists");
231227

232228
// 验证索引列是否都存在
233229
foreach (var col in index.Columns)
@@ -245,25 +241,20 @@ public void RemoveIndex(String indexName)
245241
{
246242
if (indexName == null) throw new ArgumentNullException(nameof(indexName));
247243

248-
var removed = false;
249-
for (var i = _indexes.Count - 1; i >= 0; i--)
250-
{
251-
if (String.Equals(_indexes[i].IndexName, indexName, StringComparison.OrdinalIgnoreCase))
252-
{
253-
_indexes.RemoveAt(i);
254-
removed = true;
255-
break;
256-
}
257-
}
258-
259-
if (!removed)
244+
var idx = FindIndexByName(indexName);
245+
if (idx == null)
260246
throw new NovaException(ErrorCode.InvalidArgument, $"Index '{indexName}' not found");
247+
248+
_indexes.Remove(idx);
261249
}
262250

263251
/// <summary>根据索引名获取索引定义</summary>
264252
/// <param name="indexName">索引名</param>
265253
/// <returns>索引定义,不存在返回 null</returns>
266-
public IndexDefinition? GetIndex(String indexName)
254+
public IndexDefinition? GetIndex(String indexName) => FindIndexByName(indexName);
255+
256+
/// <summary>按名称查找索引定义</summary>
257+
private IndexDefinition? FindIndexByName(String indexName)
267258
{
268259
foreach (var idx in _indexes)
269260
{

NewLife.NovaDb/Sql/SqlEngine.Expression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,9 +758,9 @@ private static DateTime ParseTimeBucket(String bucket, DateTime dt)
758758
"second" => new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second / amount * amount),
759759
"minute" => new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute / amount * amount, 0),
760760
"hour" => new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour / amount * amount, 0, 0),
761-
"day" => new DateTime(dt.Year, dt.Month, (dt.Day - 1) / amount * amount + 1),
761+
"day" => new DateTime(dt.Year, dt.Month, Math.Min((dt.Day - 1) / amount * amount + 1, DateTime.DaysInMonth(dt.Year, dt.Month))),
762762
"month" => new DateTime(dt.Year, (dt.Month - 1) / amount * amount + 1, 1),
763-
"year" => new DateTime(dt.Year / amount * amount, 1, 1),
763+
"year" => new DateTime(dt.Year / amount * amount == 0 ? 1 : dt.Year / amount * amount, 1, 1),
764764
_ => throw new NovaException(ErrorCode.InvalidArgument, $"Unknown TIME_BUCKET unit: {unit}")
765765
};
766766
}

0 commit comments

Comments
 (0)