Skip to content

Commit 0e3d77e

Browse files
Merge pull request #485 from Dataport/DISH-309-Suchstring-verbessern-Gemeinde-suchen
edit user input for better results and sort search result to get a better overview of the results
2 parents df6b00e + 55f0029 commit 0e3d77e

File tree

8 files changed

+91
-9
lines changed

8 files changed

+91
-9
lines changed

packages/clients/dish/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@
99
- Fix: Add terms of use for internal map.
1010
- Fix: Open links for BKG and their terms of use in new tab.
1111
- Fix: Only a new Tab for the print-function if newTab is wanted.
12+
- Fix: The search now returns results regardless of case(upper/lower).
1213
- Chore: Edit urlParams configuration for new testing environment.
1314
- Feature: Configuration changed. A maximum of 120 features per search (BKG (address search) results) are now displayed.
1415
- Enhancement: Add 'Gemeinde' to the searchresults from the intern-Denkmal-search
1516
- Enhancement: Changed search result to display 'ONR' before the Objektnummer
17+
- Enhancement: The search results are now beautifully sorted, just like in DA Nord.
18+
- Enhancement: It is now possible to search ('Flurstücksuche') for 'Gemeinde'.
1619

1720
## 1.2.0
1821

packages/clients/dish/src/mapConfigurations/searchConfigParams.ts

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
denkmaelerWFS,
77
alkisWfs,
88
} from '../servicesConstants'
9+
import { sortFeaturesByProperties } from '../utils/sortFeaturesByProperties'
910

1011
const groupDenkmalsuche = 'groupDenkmalsuche'
1112
export const categoryIdAlkisSearch = 'categoryIdAlkisSearch'
@@ -65,13 +66,14 @@ export const searchMethods = {
6566
featurePrefix: 'app',
6667
xmlns: 'http://www.deegree.org/app',
6768
useRightHandWildcard: true,
69+
caseSensitive: false,
6870
maxFeatures: 120,
6971
patternKeys: {
7072
hausnummer: '([0-9]+)',
71-
strasse: '([A-Za-z]+)',
72-
objektansprache: '([A-Za-z]+)',
73-
kreis_kue: '([A-Za-z]+)',
74-
gemeinde: '([A-Za-z]+)',
73+
strasse: '([A-Za-zäöüßÄÖÜ]+)',
74+
objektansprache: '([A-Za-zäöüßÄÖÜ]+)',
75+
kreis_kue: '([A-Za-zäöüßÄÖÜ]+)',
76+
gemeinde: '([A-Za-zäöüßÄÖÜ]+)',
7577
objektid: '([0-9]+)',
7678
},
7779
patterns: [
@@ -80,7 +82,24 @@ export const searchMethods = {
8082
'{{objektansprache}}, {{gemeinde}}, ONR {{objektid}}',
8183
],
8284
},
85+
resultModifier: (featureCollection) => {
86+
if (
87+
featureCollection.features === undefined ||
88+
featureCollection.features === null
89+
) {
90+
return featureCollection
91+
}
92+
const featuresSorted = sortFeaturesByProperties(
93+
featureCollection.features,
94+
['gemeinde', 'objektansprache', 'strasse', 'hausnummer', 'objektid']
95+
)
96+
return {
97+
...featureCollection,
98+
features: featuresSorted,
99+
}
100+
},
83101
},
102+
84103
alkisSearch: {
85104
groupId: groupDenkmalsuche,
86105
categoryId: categoryIdAlkisSearch,
@@ -98,22 +117,41 @@ export const searchMethods = {
98117
patternKeys: {
99118
flstnrnen: '([0-9]+)',
100119
flstnrzae: '([0-9]+)',
101-
gemarkung: '([A-Za-z]+)',
120+
gemarkung: '([A-Za-zäöüßÄÖÜ]+)',
121+
gemeinde: '([A-Za-zäöüßÄÖÜ]+)',
102122
flstkennz: '([0-9_]+)',
103123
flur: '([0-9]+)',
104124
},
105125
patterns: [
106-
'{{gemarkung}} {{flur}}, {{flstnrzae}}/{{flstnrnen}}, {{flstkennz}}',
107-
'{{gemarkung}} {{flur}}, {{flstnrzae}}, {{flstkennz}}',
126+
'{{gemeinde}}, {{gemarkung}} {{flur}}, {{flstnrzae}}/{{flstnrnen}}, {{flstkennz}}',
127+
'{{gemeinde}}, {{gemarkung}} {{flur}}, {{flstnrzae}}, {{flstkennz}}',
108128
'{{flstkennz}}',
109129
],
110130
sortBy: [
131+
{ propertyName: 'gemeinde', direction: 'ASC' },
111132
{ propertyName: 'gemarkung', direction: 'ASC' },
112133
{ propertyName: 'flur', direction: 'ASC' },
113134
{ propertyName: 'flstnrzae', direction: 'ASC' },
114135
{ propertyName: 'flstnrnen', direction: 'ASC' },
115136
],
116137
},
138+
resultModifier: (featureCollection) => {
139+
if (
140+
featureCollection.features === undefined ||
141+
featureCollection.features === null
142+
) {
143+
return featureCollection
144+
}
145+
const featuresSorted = sortFeaturesByProperties(
146+
featureCollection.features,
147+
['gemeinde', 'gemarkung', 'flur', 'flstnrzae', 'flstnrnen'],
148+
['flur', 'flstnrzae', 'flstnrnen']
149+
)
150+
return {
151+
...featureCollection,
152+
features: featuresSorted,
153+
}
154+
},
117155
},
118156
}
119157

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Feature } from 'geojson'
2+
3+
export const sortFeaturesByProperties = (
4+
features: Feature[],
5+
sortKeys: string[],
6+
numericKeys: string[] = []
7+
): Feature[] => {
8+
return features.sort((a, b) => {
9+
for (const key of sortKeys) {
10+
const valueA = a.properties?.[key] ?? ''
11+
const valueB = b.properties?.[key] ?? ''
12+
13+
let comparison = 0
14+
15+
if (numericKeys.includes(key)) {
16+
const numA = parseFloat(String(valueA)) || 0
17+
const numB = parseFloat(String(valueB)) || 0
18+
comparison = numA - numB
19+
} else {
20+
comparison = String(valueA).localeCompare(String(valueB))
21+
}
22+
23+
if (comparison !== 0) {
24+
return comparison
25+
}
26+
}
27+
return 0
28+
})
29+
}

packages/lib/getFeatures/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## unpublished
44

55
- Feature: Implement server-side sorting for `getWfsFeatures`. Can be configured by new parameter `sortBy`.
6+
- Feature: Implement possibility to search a WFS without regard to upper or lower case. Can be configured by new parameter `caseSensivite`.
67

78
## 3.1.1
89

packages/lib/getFeatures/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ export interface WfsParameters extends QueryParameters {
6363
likeFilterAttributes?: Record<string, string>
6464
/** Sorting definition for WFS features; e.g. [\{ propertyName: 'name', direction: 'DESC' \}] */
6565
sortBy?: { propertyName: string; direction?: 'ASC' | 'DESC' }[]
66+
/** Whether the like filter should be case sensitive */
67+
caseSensitive?: boolean
6668
}
6769

6870
/**

packages/lib/getFeatures/wfs/buildWfsFilter.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,18 @@ const queryPrefix = ({
3030
const wfsLike = (
3131
fieldName: string,
3232
input: string,
33-
{ featurePrefix, useRightHandWildcard, likeFilterAttributes }: WfsParameters
33+
{
34+
featurePrefix,
35+
useRightHandWildcard,
36+
likeFilterAttributes,
37+
caseSensitive,
38+
}: WfsParameters
3439
) => {
3540
const mergedLikeFilterAttributes = merge(
3641
{},
3742
defaultLikeFilterAttributes,
38-
likeFilterAttributes
43+
likeFilterAttributes,
44+
caseSensitive !== undefined ? { matchCase: caseSensitive } : {}
3945
)
4046
return `
4147
<ogc:PropertyIsLike${Object.entries(mergedLikeFilterAttributes).reduce(

packages/plugins/AddressSearch/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## unpublished
44

55
- Feature: Add new parameter `sortBy` to type `WfsParameter` for server-side sorting of WFS search results.
6+
- Feature: Add new parameter `caseSensitive` to type `WfsParameter` to control case sensitivity in WFS search strings.
67

78
## 3.2.0
89

packages/plugins/AddressSearch/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ queryParameters: {
231231
| sortBy | Array<{propertyName: string; direction?: 'ASC' \| 'DESC'}>? | Server-side sorting criteria for WFS features. Features will be sorted by the properties in order of their appearance. The first property has highest priority. Direction defaults to 'ASC' if not specified. Applied after the filter, before results are returned. Please note that the server must support server-side sorting. |
232232
| srsName | string? | Name of the projection (srs) for the query. |
233233
| useRightHandWildcard? | boolean? | By default, if searching for "search", it is sent as "search*". This behaviour can be deactivated by setting this parameter to `false`. |
234+
| caseSensitive | boolean | When `false`, searches are case-insensitive. When `true`, exact case matching is required. Requires WFS server support for the `matchCase` attribute. |
234235

235236
Since inputs may overlap with multiple patterns, multiple queries are fired and executed on the WFS until the `maxFeatures` requirement is met, beginning with the pattern that 'looks like the user input the most'. The best-fitting pattern on the returned features will be used to generate a display string. When two patterns fit best, the first one is used.
236237

@@ -249,6 +250,7 @@ queryParameters: {
249250
featurePrefix: 'app',
250251
xmlns: 'http://www.deegree.org/app',
251252
useRightHandWildcard: true,
253+
caseSensitive: false,
252254
sortBy: [
253255
{ propertyName: 'street', direction: 'ASC' },
254256
{ propertyName: 'housenumber', direction: 'ASC' },

0 commit comments

Comments
 (0)