/* * StringMap.java - contains functions for redirects retrieve. * * Copyright (c) 2007 Andrew Krizhanovsky /aka at mail.iias.spb.su/ * Distributed under GNU Public License. */ package wikipedia.data; import wikipedia.kleinberg.SessionHolder; import wikipedia.sql.Links; import java.util.Map; import java.util.Set; import java.util.List; import java.util.Iterator; /** Set of functions related to the structure Map <String, Set<String>> */ public class StringMap { /** Fills maps m_in and m_out by data from 1. ArticleIdAndTitle, * 2. map from identifier (to) pointed to identifiers (from). */ public static void fill_m_in_m_out (Map<String,Set<String>> m_out, Map<String,Set<String>> m_in, ArticleIdAndTitle[] aid, ArticleIdAndTitle[] addon, Map<Integer, List<Integer>> m_id_to__id_from) { // create map from id to title by ArticleIdAndTitle Map<Integer, String> m_id_title = ArticleIdAndTitle.createMapIdTitle(aid); for(ArticleIdAndTitle a:addon) m_id_title.put(a.id, a.title); for(Integer id_to:m_id_to__id_from.keySet()) { for(Integer id_from:m_id_to__id_from.get(id_to)) { Links.addTitlesToMaps(m_id_title.get(id_from), m_id_title.get(id_to ), m_out, m_in); } } } /** Removes the string from the map. */ public static void removeString (String s, Map<String,Set<String>> m_out, Map<String,Set<String>> m_in) { Set<String> out = m_out.remove(s); if(null != out) { for(String o:out) { m_in.get(o).remove(s); } } Set<String> in = m_in.remove(s); if(null != in) { for(String i:in) { m_out.get(i).remove(s); } } } /** Filters titles in map by user preferences, e.g. skip titles with spaces. */ private static void skipTitleInMap (SessionHolder session, Map<String,Set<String>> m) { for (Iterator<String> it = m.keySet().iterator(); it.hasNext();) { String s = it.next(); if(session.skipTitle(s)) { session.removed_articles.addTitle(s); it.remove(); } else { for (Iterator<String> it2 = m.get(s).iterator(); it2.hasNext();) { String t = it2.next(); if(session.skipTitle(t)) { session.removed_articles.addTitle(t); it2.remove(); } } if(0 == m.get(s).size()) { session.removed_articles.addTitle(s); it.remove(); } } } } /** Filters titles in m_in, m_out by user preferences, e.g. skip titles * with spaces. */ public static void skipTitles (SessionHolder session, Map<String,Set<String>> m_out, Map<String,Set<String>> m_in) { if(!session.skipTitlesWithSpaces()) return; skipTitleInMap(session, m_out); skipTitleInMap(session, m_in ); } /** Replace replaceable string 'del' by replacement string 'add' */ private static void _replaceStringInMaps ( String del, String add, Map<String,Set<String>> m_out, Map<String,Set<String>> m_in) { Set<String> s_out = null; if(m_out.containsKey(del)) { s_out = m_out.remove(del); for(Object o:s_out) { String s = (String)o; if(m_in.containsKey(s)) { Set<String> ss = m_in.get(s); if(ss.contains(del)) { ss.remove(del); if(!s.equals(add)) ss.add(add); } } if(0 == m_in.get(s).size()) m_in.remove(s); } // skip loop edge (add,add) if(s_out.contains(add)) s_out.remove(add); if(s_out.size() > 0) { if( m_out.containsKey(add)) m_out.get(add).addAll(s_out); else m_out.put(add, s_out); } } } /** Replace replaceable string 'del' by replacement string 'add' */ public static void replaceTitleInMaps ( String del, String add, Map<String,Set<String>> m_out, Map<String,Set<String>> m_in) { _replaceStringInMaps (del, add, m_out, m_in); _replaceStringInMaps (del, add, m_in, m_out); } }