View Javadoc
1   /*
2    * Copyright (c) 2002-2023, City of Paris
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met:
8    *
9    *  1. Redistributions of source code must retain the above copyright notice
10   *     and the following disclaimer.
11   *
12   *  2. Redistributions in binary form must reproduce the above copyright notice
13   *     and the following disclaimer in the documentation and/or other materials
14   *     provided with the distribution.
15   *
16   *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17   *     contributors may be used to endorse or promote products derived from
18   *     this software without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   * POSSIBILITY OF SUCH DAMAGE.
31   *
32   * License 1.0
33   */
34  package fr.paris.lutece.plugins.cartography.modules.solr.provider;
35  
36  import java.util.ArrayList;
37  import java.util.Collection;
38  import java.util.HashMap;
39  import java.util.List;
40  import java.util.Map;
41  import java.util.Map.Entry;
42  
43  import javax.servlet.http.HttpServletRequest;
44  
45  import org.apache.solr.client.solrj.response.FacetField;
46  
47  import fr.paris.lutece.plugins.carto.provider.IMarkerProvider;
48  import fr.paris.lutece.plugins.carto.provider.InfoMarker;
49  import fr.paris.lutece.plugins.cartography.modules.solr.service.CartographyService;
50  import fr.paris.lutece.plugins.search.solr.business.SolrFacetedResult;
51  import fr.paris.lutece.plugins.search.solr.business.SolrSearchEngine;
52  import fr.paris.lutece.plugins.search.solr.business.SolrSearchResult;
53  import fr.paris.lutece.plugins.search.solr.business.field.Field;
54  import fr.paris.lutece.plugins.search.solr.business.field.SolrFieldManager;
55  import fr.paris.lutece.plugins.search.solr.indexer.SolrItem;
56  import fr.paris.lutece.plugins.search.solr.service.SolrSearchAppConfService;
57  import fr.paris.lutece.portal.service.search.SearchResult;
58  
59  public class CartoSolrMarkerProvider implements IMarkerProvider
60  {
61  
62      @Override
63      public String getId( )
64      {
65          // TODO Auto-generated method stub
66          return "1";
67      }
68  
69      @Override
70      public String getTitleI18nKey( )
71      {
72          // TODO Auto-generated method stub
73          return "Signets SOLR";
74      }
75  
76      @Override
77      public Collection<InfoMarker> provideMarkerDescriptions( String solrTag, HttpServletRequest request )
78      {
79  
80          List<InfoMarker> listMarkers = new ArrayList<>( );
81  
82          SolrSearchEngine engine = SolrSearchEngine.getInstance( );
83  
84          List<SearchResult> searchResults = engine.getSearchResults( CartographyService.PARAMETER_SOLR_GEOJSON + ":" + solrTag, request );
85          // SolrFacetedResult facetedResult = engine.getFacetedSearchResults( CartographyService.PARAMETER_SOLR_GEOJSON + ":" + solrTag, new String []
86          // {SolrSearchAppConfService.loadConfiguration( null ).getFieldList()}, null, "uid","asc", 100, 1 ,
87          SolrFacetedResult facetedResult = engine.getFacetedSearchResults( CartographyService.PARAMETER_SOLR_GEOJSON + ":" + solrTag, new String [ ] {
88                  CartographyService.PARAMETER_SOLR_GEOJSON
89          }, "uid", "asc", 10, 1, 100, false );
90          List<SolrSearchResult> listResults = facetedResult.getSolrSearchResults( );
91          List<FacetField> lstfield = facetedResult.getFacetFields( );
92  
93          // List<FacetField> lstMarkerField = new ArrayList<>( );
94          for ( FacetField facet : lstfield )
95          {
96              InfoMarker notifyGruMarkerEntry = new InfoMarker( facet.getName( ) );
97              notifyGruMarkerEntry.setDescription( facet.getName( ) );
98              listMarkers.add( notifyGruMarkerEntry );
99          }
100 
101         for ( SolrSearchResult result : listResults )
102         {
103             result.getDynamicFields( );
104 
105             Map<String, Object> dynamicFields = result.getDynamicFields( );
106 
107             for ( Entry<String, Object> entry : dynamicFields.entrySet( ) )
108             {
109                 if ( entry.getKey( ).endsWith( SolrItem.DYNAMIC_TEXT_FIELD_SUFFIX ) )
110                 {
111 
112                     boolean isMarkerPresent = false;
113                     for ( InfoMarker marker : listMarkers )
114                     {
115                         if ( marker.getDescription( ).equals( entry.getKey( ) ) )
116                             isMarkerPresent = true;
117                     }
118                     if ( !isMarkerPresent )
119                     {
120                         InfoMarker markerEntry = new InfoMarker( entry.getKey( ) );
121                         markerEntry.setDescription( entry.getKey( ) );
122                         listMarkers.add( markerEntry );
123                     }
124                 }
125 
126             }
127         }
128 
129         return listMarkers;
130     }
131 
132     @Override
133     public Collection<InfoMarker> provideMarkerValues( String solrTag, String uid )
134     {
135         List<InfoMarker> listMarkers = new ArrayList<>( );
136 
137         SolrSearchEngine engine = SolrSearchEngine.getInstance( );
138 
139         SolrFacetedResult facetedResult = engine.getFacetedSearchResults( CartographyService.PARAMETER_SOLR_GEOJSON + ":" + solrTag + "+AND+uid:" + uid,
140                 new String [ ] {
141                         SolrSearchAppConfService.loadConfiguration( null ).getFieldList( )
142                 }, null, "uid", "asc", 100, 1, 100, false );
143         List<SolrSearchResult> listResults = facetedResult.getSolrSearchResults( );
144         List<FacetField> lstfield = facetedResult.getFacetFields( );
145 
146         Map<String, Field> mapFields = SolrFieldManager.getFacetList( );
147         mapFields.get( "uid" );
148 
149         for ( FacetField facet : lstfield )
150         {
151             InfoMarker notifyGruMarkerEntry = new InfoMarker( facet.getName( ) );
152             notifyGruMarkerEntry.setValue( facet.getValues( ).get( 0 ).getName( ) );
153             listMarkers.add( notifyGruMarkerEntry );
154         }
155 
156         return listMarkers;
157     }
158 
159     @Override
160     public Map<String, String> valueMarker( String marker, String solrTag, String uid )
161     {
162         Map<String, String> mapFacet = new HashMap<>( );
163 
164         List<InfoMarker> listMarkers = new ArrayList<>( );
165 
166         SolrSearchEngine engine = SolrSearchEngine.getInstance( );
167 
168         SolrFacetedResult facetedResult = engine.getFacetedSearchResults( "uid:" + uid, new String [ ] {
169                 SolrSearchAppConfService.loadConfiguration( null ).getFieldList( )
170         }, null, "uid", "asc", 100, 1, 100, false );
171         List<SolrSearchResult> listResults = facetedResult.getSolrSearchResults( );
172         List<FacetField> lstfield = facetedResult.getFacetFields( );
173 
174         Map<String, Field> mapFields = SolrFieldManager.getFacetList( );
175         mapFields.get( "uid" );
176 
177         for ( SolrSearchResult result : listResults )
178         {
179             result.getTitle( );
180 
181             Map<String, Object> dynamicFields = result.getDynamicFields( );
182 
183             for ( Entry<String, Object> entry : dynamicFields.entrySet( ) )
184             {
185 
186                 if ( entry.getKey( ).endsWith( SolrItem.DYNAMIC_TEXT_FIELD_SUFFIX ) )
187                 {
188                     mapFacet.put( entry.getKey( ), (String) entry.getValue( ) );
189                 }
190             }
191 
192         }
193 
194         return mapFacet;
195     }
196 
197 }