udpated :lower modifier to apply after all other normalizations
This commit is contained in:
		
							parent
							
								
									6a4e04533c
								
							
						
					
					
						commit
						c91d889da3
					
				| 
						 | 
					@ -2,6 +2,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Added `@yesterday` and `@tomorrow` date filter macros (@todo docs).
 | 
					- Added `@yesterday` and `@tomorrow` date filter macros (@todo docs).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Added `:lower` filter modifier (e.g. `title:lower = "lorem"`).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Added `tests.NewTestAppWithConfig(config)` helper if you need more control over the test configurations like `IsDev`, the number of allowed connections, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## v0.23.5 (WIP)
 | 
					## v0.23.5 (WIP)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -680,21 +680,6 @@ func (r *runner) processLastProp(collection *Collection, prop string) (*search.R
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cleanFieldName := inflector.Columnify(field.GetName())
 | 
						cleanFieldName := inflector.Columnify(field.GetName())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// field with ":lower" modifier
 | 
					 | 
				
			||||||
	// -------------------------------------------------------
 | 
					 | 
				
			||||||
	if modifier == lowerModifier {
 | 
					 | 
				
			||||||
		result := &search.ResolverResult{
 | 
					 | 
				
			||||||
			Identifier: "LOWER([[" + r.activeTableAlias + "." + cleanFieldName + "]])",
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if r.withMultiMatch {
 | 
					 | 
				
			||||||
			r.multiMatch.valueIdentifier = "LOWER([[" + r.multiMatchActiveTableAlias + "." + cleanFieldName + "]])"
 | 
					 | 
				
			||||||
			result.MultiMatchSubQuery = r.multiMatch
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		return result, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// arrayable fields with ":length" modifier
 | 
						// arrayable fields with ":length" modifier
 | 
				
			||||||
	// -------------------------------------------------------
 | 
						// -------------------------------------------------------
 | 
				
			||||||
	if modifier == lengthModifier && isMultivaluer {
 | 
						if modifier == lengthModifier && isMultivaluer {
 | 
				
			||||||
| 
						 | 
					@ -747,11 +732,11 @@ func (r *runner) processLastProp(collection *Collection, prop string) (*search.R
 | 
				
			||||||
	// default
 | 
						// default
 | 
				
			||||||
	// -------------------------------------------------------
 | 
						// -------------------------------------------------------
 | 
				
			||||||
	result := &search.ResolverResult{
 | 
						result := &search.ResolverResult{
 | 
				
			||||||
		Identifier: fmt.Sprintf("[[%s.%s]]", r.activeTableAlias, cleanFieldName),
 | 
							Identifier: "[[" + r.activeTableAlias + "." + cleanFieldName + "]]",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if r.withMultiMatch {
 | 
						if r.withMultiMatch {
 | 
				
			||||||
		r.multiMatch.valueIdentifier = fmt.Sprintf("[[%s.%s]]", r.multiMatchActiveTableAlias, cleanFieldName)
 | 
							r.multiMatch.valueIdentifier = "[[" + r.multiMatchActiveTableAlias + "." + cleanFieldName + "]]"
 | 
				
			||||||
		result.MultiMatchSubQuery = r.multiMatch
 | 
							result.MultiMatchSubQuery = r.multiMatch
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -777,5 +762,13 @@ func (r *runner) processLastProp(collection *Collection, prop string) (*search.R
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// account for the ":lower" modifier
 | 
				
			||||||
 | 
						if modifier == lowerModifier {
 | 
				
			||||||
 | 
							result.Identifier = "LOWER(" + result.Identifier + ")"
 | 
				
			||||||
 | 
							if r.withMultiMatch {
 | 
				
			||||||
 | 
								r.multiMatch.valueIdentifier = "LOWER(" + r.multiMatch.valueIdentifier + ")"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return result, nil
 | 
						return result, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -262,9 +262,9 @@ func TestRecordFieldResolverUpdateQuery(t *testing.T) {
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"hidden field (add emailVisibility)",
 | 
								"hidden field (add emailVisibility)",
 | 
				
			||||||
			"users",
 | 
								"users",
 | 
				
			||||||
			"id > true || email > true",
 | 
								"id > true || email > true || email:lower > false",
 | 
				
			||||||
			false,
 | 
								false,
 | 
				
			||||||
			"SELECT `users`.* FROM `users` WHERE ([[users.id]] > 1 OR (([[users.email]] > 1) AND ([[users.emailVisibility]] = TRUE)))",
 | 
								"SELECT `users`.* FROM `users` WHERE ([[users.id]] > 1 OR (([[users.email]] > 1) AND ([[users.emailVisibility]] = TRUE)) OR ((LOWER([[users.email]]) > 0) AND ([[users.emailVisibility]] = TRUE)))",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"hidden field (force ignore emailVisibility)",
 | 
								"hidden field (force ignore emailVisibility)",
 | 
				
			||||||
| 
						 | 
					@ -309,7 +309,7 @@ func TestRecordFieldResolverUpdateQuery(t *testing.T) {
 | 
				
			||||||
				"rel_many.name:lower > true ||" +
 | 
									"rel_many.name:lower > true ||" +
 | 
				
			||||||
				"created:lower > true",
 | 
									"created:lower > true",
 | 
				
			||||||
			false,
 | 
								false,
 | 
				
			||||||
			"SELECT DISTINCT `demo1`.* FROM `demo1` LEFT JOIN `users` `__data_users_rel_many` ON [[__data_users_rel_many.id]] IN ({:p0}, {:p1}) LEFT JOIN json_each(CASE WHEN json_valid([[demo1.rel_many]]) THEN [[demo1.rel_many]] ELSE json_array([[demo1.rel_many]]) END) `demo1_rel_many_je` LEFT JOIN `users` `demo1_rel_many` ON [[demo1_rel_many.id]] = [[demo1_rel_many_je.value]] WHERE (LOWER({:infoLowerrel_oneTEST}) > 1 OR LOWER({:infoLowerrel_manyTEST}) > 1 OR ((LOWER([[__data_users_rel_many.email]]) > 1) AND (NOT EXISTS (SELECT 1 FROM (SELECT LOWER([[__data_mm_users_rel_many.email]]) as [[multiMatchValue]] FROM `demo1` `__mm_demo1` LEFT JOIN `users` `__data_mm_users_rel_many` ON [[__data_mm_users_rel_many.id]] IN ({:p4}, {:p5}) WHERE `__mm_demo1`.`id` = `demo1`.`id`) {{__smTEST}} WHERE ((NOT ([[__smTEST.multiMatchValue]] > 1)) OR ([[__smTEST.multiMatchValue]] IS NULL))))) OR LOWER([[demo1.text]]) > 1 OR LOWER([[demo1.bool]]) > 1 OR LOWER([[demo1.url]]) > 1 OR LOWER([[demo1.select_one]]) > 1 OR LOWER([[demo1.select_many]]) > 1 OR LOWER([[demo1.file_one]]) > 1 OR LOWER([[demo1.file_many]]) > 1 OR LOWER([[demo1.number]]) > 1 OR LOWER([[demo1.email]]) > 1 OR LOWER([[demo1.datetime]]) > 1 OR LOWER([[demo1.json]]) > 1 OR LOWER([[demo1.rel_one]]) > 1 OR LOWER([[demo1.rel_many]]) > 1 OR ((LOWER([[demo1_rel_many.name]]) > 1) AND (NOT EXISTS (SELECT 1 FROM (SELECT LOWER([[__mm_demo1_rel_many.name]]) as [[multiMatchValue]] FROM `demo1` `__mm_demo1` LEFT JOIN json_each(CASE WHEN json_valid([[__mm_demo1.rel_many]]) THEN [[__mm_demo1.rel_many]] ELSE json_array([[__mm_demo1.rel_many]]) END) `__mm_demo1_rel_many_je` LEFT JOIN `users` `__mm_demo1_rel_many` ON [[__mm_demo1_rel_many.id]] = [[__mm_demo1_rel_many_je.value]] WHERE `__mm_demo1`.`id` = `demo1`.`id`) {{__smTEST}} WHERE ((NOT ([[__smTEST.multiMatchValue]] > 1)) OR ([[__smTEST.multiMatchValue]] IS NULL))))) OR LOWER([[demo1.created]]) > 1)",
 | 
								"SELECT DISTINCT `demo1`.* FROM `demo1` LEFT JOIN `users` `__data_users_rel_many` ON [[__data_users_rel_many.id]] IN ({:p0}, {:p1}) LEFT JOIN json_each(CASE WHEN json_valid([[demo1.rel_many]]) THEN [[demo1.rel_many]] ELSE json_array([[demo1.rel_many]]) END) `demo1_rel_many_je` LEFT JOIN `users` `demo1_rel_many` ON [[demo1_rel_many.id]] = [[demo1_rel_many_je.value]] WHERE (LOWER({:infoLowerrel_oneTEST}) > 1 OR LOWER({:infoLowerrel_manyTEST}) > 1 OR ((LOWER([[__data_users_rel_many.email]]) > 1) AND (NOT EXISTS (SELECT 1 FROM (SELECT LOWER([[__data_mm_users_rel_many.email]]) as [[multiMatchValue]] FROM `demo1` `__mm_demo1` LEFT JOIN `users` `__data_mm_users_rel_many` ON [[__data_mm_users_rel_many.id]] IN ({:p4}, {:p5}) WHERE `__mm_demo1`.`id` = `demo1`.`id`) {{__smTEST}} WHERE ((NOT ([[__smTEST.multiMatchValue]] > 1)) OR ([[__smTEST.multiMatchValue]] IS NULL))))) OR LOWER([[demo1.text]]) > 1 OR LOWER([[demo1.bool]]) > 1 OR LOWER([[demo1.url]]) > 1 OR LOWER([[demo1.select_one]]) > 1 OR LOWER([[demo1.select_many]]) > 1 OR LOWER([[demo1.file_one]]) > 1 OR LOWER([[demo1.file_many]]) > 1 OR LOWER([[demo1.number]]) > 1 OR LOWER([[demo1.email]]) > 1 OR LOWER([[demo1.datetime]]) > 1 OR LOWER((CASE WHEN json_valid([[demo1.json]]) THEN JSON_EXTRACT([[demo1.json]], '$') ELSE JSON_EXTRACT(json_object('pb', [[demo1.json]]), '$.pb') END)) > 1 OR LOWER([[demo1.rel_one]]) > 1 OR LOWER([[demo1.rel_many]]) > 1 OR ((LOWER([[demo1_rel_many.name]]) > 1) AND (NOT EXISTS (SELECT 1 FROM (SELECT LOWER([[__mm_demo1_rel_many.name]]) as [[multiMatchValue]] FROM `demo1` `__mm_demo1` LEFT JOIN json_each(CASE WHEN json_valid([[__mm_demo1.rel_many]]) THEN [[__mm_demo1.rel_many]] ELSE json_array([[__mm_demo1.rel_many]]) END) `__mm_demo1_rel_many_je` LEFT JOIN `users` `__mm_demo1_rel_many` ON [[__mm_demo1_rel_many.id]] = [[__mm_demo1_rel_many_je.value]] WHERE `__mm_demo1`.`id` = `demo1`.`id`) {{__smTEST}} WHERE ((NOT ([[__smTEST.multiMatchValue]] > 1)) OR ([[__smTEST.multiMatchValue]] IS NULL))))) OR LOWER([[demo1.created]]) > 1)",
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			"isset modifier",
 | 
								"isset modifier",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1893,7 +1893,7 @@ export default class CommonHelper {
 | 
				
			||||||
            for (const key of keys) {
 | 
					            for (const key of keys) {
 | 
				
			||||||
                result.push(key);
 | 
					                result.push(key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // add ":isset" and ":lower" modifiers to non-base keys
 | 
					                // add ":isset" modifier to non-base keys
 | 
				
			||||||
                const parts = key.split(".");
 | 
					                const parts = key.split(".");
 | 
				
			||||||
                if (
 | 
					                if (
 | 
				
			||||||
                    parts.length === 3 &&
 | 
					                    parts.length === 3 &&
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue