Ho scritto un piccolo script in JAVA, che verifica il parametro limit
con quattro valori diversi (10, 100, 1000 e 10000) quando si interroga un feed di notizie di utente di Facebook utilizzando l'API Open Graph e RestFB client. Come vedrete, si ha un comportamento strano ...API Facebook Open Graph: comportamento strano del limite di parametri durante la ricezione di un feed di news utente impaginato
Scenario:
public static void main(String[] args) {
// vars
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
FacebookClient client = new DefaultFacebookClient(accessToken);
Connection<Post> home;
List<Post> postList;
Map<String, Post> postMap;
int i;
// limits to test
String[] limits = {"10", "100", "1000", "10000"};
for (String limit : limits) {
// init list and map (looking for duplicate posts)
postList = new LinkedList<Post>();
postMap = new LinkedHashMap<String, Post>();
// get news feed
home = client.fetchConnection(id + "/home", Post.class, Parameter.with("limit", limit));
// going through pages
i = 1;
for (List<Post> page : home) {
for (Post post : page) {
// store into list
postList.add(post);
// store into map (unique post id)
postMap.put(post.getId(), post);
}
i++;
}
// sort posts by created time
Collections.sort(postList, new Comparator<Post>() {
@Override
public int compare(Post post1, Post post2) {
return post1.getCreatedTime().compareTo(post2.getCreatedTime());
}
});
// log
try {
FileWriter out = new FileWriter("log/output.txt", true);
out.write("LIMIT: " + limit + "\n");
out.write("\tPAGES: " + (i - 1) + "\n");
out.write("\tLIST SIZE: " + postList.size() + "\n");
out.write("\tMAP SIZE: " + postMap.size() + "\n");
out.write("\tOLDER POST: " + dateFormat.format(postList.get(0).getCreatedTime()) + "\n");
out.write("\tYOUGNER POST: " + dateFormat.format(postList.get(postList.size() - 1).getCreatedTime()) + "\n");
out.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
uscita:
LIMIT: 10
PAGES: 7
LIST SIZE: 56
MAP SIZE: 56
OLDER POST: 2009-03-22 14:58:03
YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 100
PAGES: 3
LIST SIZE: 174
MAP SIZE: 172
OLDER POST: 2012-01-12 23:01:34
YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 1000
PAGES: 2
LIST SIZE: 294
MAP SIZE: 292
OLDER POST: 2009-03-22 14:58:03
YOUGNER POST: 2012-05-11 15:48:49
LIMIT: 10000
PAGES: 2
LIST SIZE: 294
MAP SIZE: 292
OLDER POST: 2009-03-22 14:58:03
YOUGNER POST: 2012-05-11 15:48:49
Interpretazioni e domande:
Ovviamente, non è possibile ottenere tutti i post che un utente ha avuto sul proprio feed di notizie da quando il suo account è stato creato. Il limite è limitato?
Con una
limit
di 100, 1000 e 10000, devo aver avuto ogni volta due messaggi duplicati all'interno di tutta restituita news feed (174-172 = 194-192). Perché? Non ho mai visto lo stesso posto due volte sulla mia news feed personali ...Con (e solo con) un
limit
del 100, il post vecchio ottengo è stato creato durante l'anno 2012, nel frattempo gli altri valori dilimit
make la query che recupera un post che è stato creato durante l'anno 2009. Posso capire che con una superiorelimit
(1000 o 10000), la query recupera i post più vecchi. Ma perché lo alimit
su 10 fa sì che la query recuperi un post più vecchio di una query limitata a 100?Ultimo ma non meno importante punto: Non ricevo lo stesso numero di post. Ovviamente, più il
limit
è alto, più il numero di post recuperati è alto. Quello che ho pensato per primo, è che l'unica conseguenza di un numero minore dilimit
era un numero superiore di pagine (il che è il caso), ma che il numero di post recuperati non sarebbe cambiato. Ma lo fa. Perché? Detto questo, il numero di posti sembra convergere tra unalimit
di 100 e 1000, perché il numero di posti identico ad unlimit
di 1000 e unlimit
di 10000.
PS: specificando un since
e/o un parametro until
alla query non cambia nulla.
Qualsiasi risposta/commento è benvenuto :)
Cin cin.
Edit:
Questo è il mio migliore recall:
LIMIT: 200
PAGES: 3
LIST SIZE: 391
MAP SIZE: 389
OLDER POST: 2012-01-27 14:17:16
YOUGNER POST: 2012-05-11 16:52:38
Perché 200? È specificato ovunque nello documentation?
Grazie per la risposta. Ho già visto [la domanda che hai chiesto] (http://goo.gl/P9kpP). Ovviamente, il limite è limitato, ma questo è strano non possiamo trovare alcun dettaglio nel [doc] (http://bit.ly/f5O0Oz). Personalmente non posso ottenere più di 389 post e questo con un limite di 200 (vedi modifica). Quindi, direi che non puoi ottenere più di 400 post, non 500. Il 4 è più sulla paginazione: perché un limite di 10 rende la query recuperando meno post di un limite di 100? Ciò dovrebbe influire solo sul numero di pagine della paginazione, non sul numero di post. – sp00m
Ho aggiornato il codice, spero che ti aiuterà :) – Jashwant
Grazie. Te lo meriti :) – sp00m