@@ -11,32 +11,40 @@ namespace Nest
11
11
{
12
12
[ ContractJsonConverter ( typeof ( FieldsJsonConverter ) ) ]
13
13
[ DebuggerDisplay ( "{DebugDisplay,nq}" ) ]
14
- public class Fields : IUrlParameter , IEnumerable < Field >
14
+ public class Fields : IUrlParameter , IEnumerable < Field > , IEquatable < Fields >
15
15
{
16
16
internal readonly List < Field > ListOfFields ;
17
17
18
- string IUrlParameter . GetString ( IConnectionConfigurationValues settings ) =>
19
- string . Join ( "," , ListOfFields . Select ( f => ( ( IUrlParameter ) f ) . GetString ( settings ) ) ) ;
18
+ string IUrlParameter . GetString ( IConnectionConfigurationValues settings )
19
+ {
20
+ if ( ! ( settings is IConnectionSettingsValues nestSettings ) )
21
+ throw new ArgumentNullException ( nameof ( settings ) , $ "Can not resolve { nameof ( Fields ) } if no { nameof ( IConnectionSettingsValues ) } is provided") ;
20
22
21
- private string DebugDisplay =>
22
- $ "Count: { ListOfFields . Count } [" + string . Join ( "," , ListOfFields . Select ( ( t , i ) => $ "( { i + 1 } : { t . DebugDisplay } )" ) ) + "]" ;
23
+ return string . Join ( "," , ListOfFields . Where ( f => f != null ) . Select ( f => ( ( IUrlParameter ) f ) . GetString ( nestSettings ) ) ) ;
24
+ }
23
25
26
+ private string DebugDisplay =>
27
+ $ "Count: { ListOfFields . Count } [" + string . Join ( "," , ListOfFields . Select ( ( t , i ) => $ "({ i + 1 } : { t ? . DebugDisplay ?? "NULL" } )") ) + "]" ;
24
28
25
29
internal Fields ( ) { this . ListOfFields = new List < Field > ( ) ; }
26
30
internal Fields ( IEnumerable < Field > fieldNames ) { this . ListOfFields = fieldNames . ToList ( ) ; }
27
31
28
- public static implicit operator Fields ( string [ ] fields ) => new Fields ( fields . Select ( f => ( Field ) f ) ) ;
32
+ public static implicit operator Fields ( string [ ] fields ) => fields . IsEmpty ( ) ? null : new Fields ( fields . Select ( f => ( Field ) f ) ) ;
33
+
34
+ public static implicit operator Fields ( string field ) => field . IsNullOrEmptyCommaSeparatedList ( out var split )
35
+ ? null : new Fields ( split . Select ( f=> ( Field ) f ) ) ;
36
+
37
+ public static implicit operator Fields ( Expression [ ] fields ) => fields . IsEmpty ( ) ? null : new Fields ( fields . Select ( f => ( Field ) f ) ) ;
29
38
30
- public static implicit operator Fields ( string field ) =>
31
- new Fields ( field . Split ( new [ ] { ',' } , StringSplitOptions . RemoveEmptyEntries ) . Select ( f=> ( Field ) f ) ) ;
39
+ public static implicit operator Fields ( Expression field ) => field == null ? null : new Fields ( new [ ] { ( Field ) field } ) ;
32
40
33
- public static implicit operator Fields ( Expression [ ] fields ) => new Fields ( fields . Select ( f => ( Field ) f ) ) ;
41
+ public static implicit operator Fields ( Field field ) => field == null ? null : new Fields ( new [ ] { field } ) ;
34
42
35
- public static implicit operator Fields ( Expression field ) => new Fields ( new [ ] { ( Field ) field } ) ;
43
+ public static implicit operator Fields ( PropertyInfo field ) => field == null ? null : new Fields ( new Field [ ] { field } ) ;
36
44
37
- public static implicit operator Fields ( Field field ) => new Fields ( new [ ] { field } ) ;
45
+ public static implicit operator Fields ( PropertyInfo [ ] fields ) => fields . IsEmpty ( ) ? null : new Fields ( fields . Select ( f => ( Field ) f ) ) ;
38
46
39
- public static implicit operator Fields ( Field [ ] fields ) => new Fields ( fields ) ;
47
+ public static implicit operator Fields ( Field [ ] fields ) => fields . IsEmpty ( ) ? null : new Fields ( fields ) ;
40
48
41
49
public Fields And < T > ( Expression < Func < T , object > > field , double ? boost = null ) where T : class
42
50
{
@@ -80,14 +88,38 @@ public Fields And(params Field[] fields)
80
88
return this ;
81
89
}
82
90
83
- public IEnumerator < Field > GetEnumerator ( )
91
+ public IEnumerator < Field > GetEnumerator ( ) => this . ListOfFields . GetEnumerator ( ) ;
92
+
93
+ IEnumerator IEnumerable . GetEnumerator ( ) => this . GetEnumerator ( ) ;
94
+
95
+ public static bool operator == ( Fields left , Fields right ) => Equals ( left , right ) ;
96
+
97
+ public static bool operator != ( Fields left , Fields right ) => ! Equals ( left , right ) ;
98
+
99
+ public bool Equals ( Fields other ) => EqualsAllFields ( this . ListOfFields , other . ListOfFields ) ;
100
+
101
+ public override bool Equals ( object obj )
84
102
{
85
- return this . ListOfFields . GetEnumerator ( ) ;
103
+ switch ( obj )
104
+ {
105
+ case Fields f : return Equals ( f ) ;
106
+ case string s : return Equals ( s ) ;
107
+ case Field fn : return Equals ( fn ) ;
108
+ case Field [ ] fns : return Equals ( fns ) ;
109
+ case Expression e : return Equals ( e ) ;
110
+ case Expression [ ] es : return Equals ( es ) ;
111
+ default : return false ;
112
+ }
86
113
}
87
114
88
- IEnumerator IEnumerable . GetEnumerator ( )
115
+ private static bool EqualsAllFields ( IReadOnlyList < Field > thisTypes , IReadOnlyList < Field > otherTypes )
89
116
{
90
- return this . GetEnumerator ( ) ;
117
+ if ( thisTypes == null && otherTypes == null ) return true ;
118
+ if ( thisTypes == null || otherTypes == null ) return false ;
119
+ if ( thisTypes . Count != otherTypes . Count ) return false ;
120
+ return thisTypes . Count == otherTypes . Count && ! thisTypes . Except ( otherTypes ) . Any ( ) ;
91
121
}
122
+
123
+ public override int GetHashCode ( ) => this . ListOfFields . GetHashCode ( ) ;
92
124
}
93
125
}
0 commit comments