Skip to content

Commit a2b7ec1

Browse files
committed
add support OrderBy Tag -> ref #56
optimize DeserializerFactory optimize EnablePropertyChangedTrack
1 parent 29a8048 commit a2b7ec1

File tree

16 files changed

+247
-79
lines changed

16 files changed

+247
-79
lines changed

build/version.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<VersionMajor>4</VersionMajor>
44
<VersionMinor>0</VersionMinor>
5-
<VersionPatch>81</VersionPatch>
5+
<VersionPatch>82</VersionPatch>
66
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
77
</PropertyGroup>
88
</Project>

doc/Schema/SmartSqlMap.xsd

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@
210210
<xs:element ref="IsNotProperty" />
211211
<xs:element ref="Script" />
212212
<xs:element ref="Placeholder" />
213+
<xs:element ref="OrderBy" />
213214
<xs:element ref="Dynamic" />
214215
<xs:element ref="Where" />
215216
<xs:element ref="For" />
@@ -240,6 +241,7 @@
240241
<xs:element ref="IsNotProperty" />
241242
<xs:element ref="Script" />
242243
<xs:element ref="Placeholder" />
244+
<xs:element ref="OrderBy" />
243245
<xs:element ref="Dynamic" />
244246
<xs:element ref="Where" />
245247
<xs:element ref="For" />
@@ -280,6 +282,7 @@
280282
<xs:element ref="IsNotProperty" />
281283
<xs:element ref="Script" />
282284
<xs:element ref="Placeholder" />
285+
<xs:element ref="OrderBy" />
283286
<xs:element ref="Dynamic" />
284287
<xs:element ref="Where" />
285288
<xs:element ref="For" />
@@ -312,6 +315,7 @@
312315
<xs:element ref="IsNotProperty" />
313316
<xs:element ref="Script" />
314317
<xs:element ref="Placeholder" />
318+
<xs:element ref="OrderBy" />
315319
<xs:element ref="Dynamic" />
316320
<xs:element ref="Where" />
317321
<xs:element ref="For" />
@@ -345,6 +349,7 @@
345349
<xs:element ref="IsNotProperty" />
346350
<xs:element ref="Script" />
347351
<xs:element ref="Placeholder" />
352+
<xs:element ref="OrderBy" />
348353
<xs:element ref="Dynamic" />
349354
<xs:element ref="Where" />
350355
<xs:element ref="For" />
@@ -378,6 +383,7 @@
378383
<xs:element ref="IsNotProperty" />
379384
<xs:element ref="Script" />
380385
<xs:element ref="Placeholder" />
386+
<xs:element ref="OrderBy" />
381387
<xs:element ref="Dynamic" />
382388
<xs:element ref="Where" />
383389
<xs:element ref="For" />
@@ -411,6 +417,7 @@
411417
<xs:element ref="IsNotProperty" />
412418
<xs:element ref="Script" />
413419
<xs:element ref="Placeholder" />
420+
<xs:element ref="OrderBy" />
414421
<xs:element ref="Dynamic" />
415422
<xs:element ref="Where" />
416423
<xs:element ref="For" />
@@ -444,6 +451,7 @@
444451
<xs:element ref="IsNotProperty" />
445452
<xs:element ref="Script" />
446453
<xs:element ref="Placeholder" />
454+
<xs:element ref="OrderBy" />
447455
<xs:element ref="Dynamic" />
448456
<xs:element ref="Where" />
449457
<xs:element ref="For" />
@@ -477,6 +485,7 @@
477485
<xs:element ref="IsNotProperty" />
478486
<xs:element ref="Script" />
479487
<xs:element ref="Placeholder" />
488+
<xs:element ref="OrderBy" />
480489
<xs:element ref="Dynamic" />
481490
<xs:element ref="Where" />
482491
<xs:element ref="For" />
@@ -509,6 +518,7 @@
509518
<xs:element ref="IsNotProperty" />
510519
<xs:element ref="Script" />
511520
<xs:element ref="Placeholder" />
521+
<xs:element ref="OrderBy" />
512522
<xs:element ref="Dynamic" />
513523
<xs:element ref="Where" />
514524
<xs:element ref="For" />
@@ -542,6 +552,7 @@
542552
<xs:element ref="IsNotProperty" />
543553
<xs:element ref="Script" />
544554
<xs:element ref="Placeholder" />
555+
<xs:element ref="OrderBy" />
545556
<xs:element ref="Dynamic" />
546557
<xs:element ref="Where" />
547558
<xs:element ref="For" />
@@ -574,6 +585,7 @@
574585
<xs:element ref="IsNotProperty" />
575586
<xs:element ref="Script" />
576587
<xs:element ref="Placeholder" />
588+
<xs:element ref="OrderBy" />
577589
<xs:element ref="Dynamic" />
578590
<xs:element ref="Where" />
579591
<xs:element ref="For" />
@@ -606,6 +618,7 @@
606618
<xs:element ref="IsNotProperty" />
607619
<xs:element ref="Script" />
608620
<xs:element ref="Placeholder" />
621+
<xs:element ref="OrderBy" />
609622
<xs:element ref="Dynamic" />
610623
<xs:element ref="Where" />
611624
<xs:element ref="For" />
@@ -638,6 +651,7 @@
638651
<xs:element ref="IsNotProperty" />
639652
<xs:element ref="Script" />
640653
<xs:element ref="Placeholder" />
654+
<xs:element ref="OrderBy" />
641655
<xs:element ref="Dynamic" />
642656
<xs:element ref="Where" />
643657
<xs:element ref="For" />
@@ -669,6 +683,7 @@
669683
<xs:element ref="IsProperty" />
670684
<xs:element ref="IsNotProperty" />
671685
<xs:element ref="Placeholder" />
686+
<xs:element ref="OrderBy" />
672687
<xs:element ref="Dynamic" />
673688
<xs:element ref="Where" />
674689
<xs:element ref="For" />
@@ -702,6 +717,7 @@
702717
<xs:element ref="IsProperty" />
703718
<xs:element ref="IsNotProperty" />
704719
<xs:element ref="Placeholder" />
720+
<xs:element ref="OrderBy" />
705721
<xs:element ref="Dynamic" />
706722
<xs:element ref="Where" />
707723
<xs:element ref="For" />
@@ -733,6 +749,7 @@
733749
<xs:element ref="IsProperty" />
734750
<xs:element ref="IsNotProperty" />
735751
<xs:element ref="Placeholder" />
752+
<xs:element ref="OrderBy" />
736753
<xs:element ref="Dynamic" />
737754
<xs:element ref="Where" />
738755
<xs:element ref="For" />
@@ -764,6 +781,7 @@
764781
<xs:element ref="IsNotProperty" />
765782
<xs:element ref="Script" />
766783
<xs:element ref="Placeholder" />
784+
<xs:element ref="OrderBy" />
767785
<xs:element ref="Dynamic" />
768786
<xs:element ref="Where" />
769787
<xs:element ref="For" />
@@ -780,6 +798,12 @@
780798
<xs:attribute name="Required" type="xs:boolean" use="optional" />
781799
</xs:complexType>
782800
</xs:element>
801+
<xs:element name="OrderBy">
802+
<xs:complexType mixed="true">
803+
<xs:attribute name="Property" type="xs:string" use="required" />
804+
<xs:attribute name="Required" type="xs:boolean" use="optional" />
805+
</xs:complexType>
806+
</xs:element>
783807
<xs:element name="Dynamic">
784808
<xs:complexType mixed="true">
785809
<xs:choice minOccurs="0" maxOccurs="unbounded">
@@ -802,6 +826,7 @@
802826
<xs:element ref="IsNotProperty" />
803827
<xs:element ref="Script" />
804828
<xs:element ref="Placeholder" />
829+
<xs:element ref="OrderBy" />
805830
<xs:element ref="Dynamic" />
806831
<xs:element ref="Where" />
807832
<xs:element ref="Set" />
@@ -834,6 +859,7 @@
834859
<xs:element ref="IsNotProperty" />
835860
<xs:element ref="Script" />
836861
<xs:element ref="Placeholder" />
862+
<xs:element ref="OrderBy" />
837863
<xs:element ref="Dynamic" />
838864
<xs:element ref="Where" />
839865
<xs:element ref="For" />
@@ -872,31 +898,6 @@
872898
</xs:element>
873899
<xs:element name="For">
874900
<xs:complexType mixed="true">
875-
<xs:choice minOccurs="0" maxOccurs="unbounded">
876-
<xs:element ref="IsEmpty" />
877-
<xs:element ref="IsEqual" />
878-
<xs:element ref="IsGreaterEqual" />
879-
<xs:element ref="IsGreaterThan" />
880-
<xs:element ref="IsLessEqual" />
881-
<xs:element ref="IsLessThan" />
882-
<xs:element ref="IsNotEmpty" />
883-
<xs:element ref="IsNotEqual" />
884-
<xs:element ref="IsNotNull" />
885-
<xs:element ref="IsNull" />
886-
<xs:element ref="Include" />
887-
<xs:element ref="Switch" />
888-
<xs:element ref="IsTrue" />
889-
<xs:element ref="IsFalse" />
890-
<xs:element ref="Range" />
891-
<xs:element ref="IsProperty" />
892-
<xs:element ref="IsNotProperty" />
893-
<xs:element ref="Script" />
894-
<xs:element ref="Placeholder" />
895-
<xs:element ref="Dynamic" />
896-
<xs:element ref="Where" />
897-
<xs:element ref="Set" />
898-
<xs:element ref="Env" />
899-
</xs:choice>
900901
<xs:attribute name="Prepend" type="xs:string" use="optional" />
901902
<xs:attribute name="Property" type="xs:string" use="required" />
902903
<xs:attribute name="Required" type="xs:boolean" use="optional" />
@@ -928,6 +929,7 @@
928929
<xs:element ref="IsNotProperty" />
929930
<xs:element ref="Script" />
930931
<xs:element ref="Placeholder" />
932+
<xs:element ref="OrderBy" />
931933
<xs:element ref="Dynamic" />
932934
<xs:element ref="Where" />
933935
<xs:element ref="Set" />
@@ -967,6 +969,7 @@
967969
<xs:element ref="IsNotProperty" />
968970
<xs:element ref="Script" />
969971
<xs:element ref="Placeholder" />
972+
<xs:element ref="OrderBy" />
970973
<xs:element ref="Dynamic" />
971974
<xs:element ref="Where" />
972975
<xs:element ref="Set" />
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<!--
3+
//*******************************
4+
// Create By Rocher Kong
5+
// Date 2019-04-17 17:54
6+
// Code Generate By SmartCode
7+
// Code Generate Github : https://github.com/Ahoo-Wang/SmartCode
8+
//*******************************-->
9+
10+
<SmartSqlMap Scope="OrderByTest" xmlns="http://SmartSql.net/schemas/SmartSqlMap.xsd">
11+
<Statements>
12+
<Statement Id="OrderBy">
13+
Select '<OrderBy Property="OrderBy"/>'
14+
</Statement>
15+
</Statements>
16+
</SmartSqlMap>

src/SmartSql.Test.Unit/Reflection/EntityProxyCacheFactoryTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,6 @@ public void TestCtor()
4747

4848
Assert.Equal(2, entityProxy.GetPropertyVersion(nameof(Entity.Id)));
4949
}
50+
5051
}
5152
}

src/SmartSql.Test.Unit/SmartSql.Test.Unit.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
<None Update="Maps\ForTest.xml">
1616
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
1717
</None>
18+
<None Update="Maps\OrderByTest.xml">
19+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
20+
</None>
1821
</ItemGroup>
1922

2023
<ItemGroup>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Xunit;
4+
5+
namespace SmartSql.Test.Unit.Tags
6+
{
7+
[Collection("GlobalSmartSql")]
8+
public class OrderByTest
9+
{
10+
protected ISqlMapper SqlMapper { get; }
11+
12+
public OrderByTest(SmartSqlFixture smartSqlFixture)
13+
{
14+
SqlMapper = smartSqlFixture.SqlMapper;
15+
}
16+
17+
[Fact]
18+
public void OrderBy()
19+
{
20+
var msg = SqlMapper.ExecuteScalar<String>(new RequestContext
21+
{
22+
Scope = nameof(OrderByTest),
23+
SqlId = "OrderBy",
24+
Request = new
25+
{
26+
OrderBy = new KeyValuePair<String, String>("Id", "Desc")
27+
}
28+
});
29+
Assert.Equal(" Order By Id Desc", msg);
30+
}
31+
32+
[Fact]
33+
public void OrderByMulti()
34+
{
35+
var msg = SqlMapper.ExecuteScalar<String>(new RequestContext
36+
{
37+
Scope = nameof(OrderByTest),
38+
SqlId = "OrderBy",
39+
Request = new
40+
{
41+
OrderBy = new Dictionary<string, string>
42+
{
43+
{"Id", "Desc"},
44+
{"Name", "Asc"},
45+
}
46+
}
47+
});
48+
Assert.Equal(" Order By Id Desc,Name Asc", msg);
49+
}
50+
}
51+
}

src/SmartSql.Test/Entities/Entity.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@ public Entity(long id)
1414
public virtual long Id { get;
1515
set; }
1616
public virtual string Name { get; set; }
17+
18+
1719
}
1820
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
5+
namespace SmartSql.Configuration.Tags
6+
{
7+
public class OrderBy : Tag
8+
{
9+
public override string Prepend { get; set; } = " Order By ";
10+
11+
public override bool IsCondition(AbstractRequestContext context)
12+
{
13+
Object reqVal = EnsurePropertyValue(context);
14+
15+
if (reqVal is KeyValuePair<String, String>)
16+
{
17+
return true;
18+
}
19+
20+
if (reqVal is IEnumerable<KeyValuePair<String, String>> orderBys)
21+
{
22+
return orderBys.Any();
23+
}
24+
25+
return false;
26+
}
27+
28+
public override void BuildSql(AbstractRequestContext context)
29+
{
30+
if (!IsCondition(context))
31+
{
32+
return;
33+
}
34+
35+
Object reqVal = EnsurePropertyValue(context);
36+
37+
context.SqlBuilder.Append(Prepend);
38+
39+
if (reqVal is KeyValuePair<String, String> orderBy)
40+
{
41+
context.SqlBuilder.AppendFormat("{0} {1}", orderBy.Key, orderBy.Value);
42+
return;
43+
}
44+
45+
46+
var orderBys = (reqVal as IEnumerable<KeyValuePair<String, String>>).ToArray();
47+
48+
for (var i = 0; i < orderBys.Length; i++)
49+
{
50+
orderBy = orderBys.ElementAt(i);
51+
context.SqlBuilder.AppendFormat("{0} {1}", orderBy.Key, orderBy.Value);
52+
if (i < (orderBys.Length - 1))
53+
{
54+
context.SqlBuilder.Append(",");
55+
}
56+
}
57+
}
58+
59+
}
60+
}

0 commit comments

Comments
 (0)