Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

78
LINES

< > BotCompany Repo | #1032555 // WikiData

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (6720L/40K).

1  
sclass WikiData {
2  
  S language = "en";
3  
  S site = "https://wikidata.org";
4  
  S apiPath = "/w/api.php";
5  
  
6  
  transient FileBasedStringMap cache;
7  
  transient double cacheExpirationDays = 7;
8  
  
9  
  *() { init(); }
10  
  *(S *language) { init(); }
11  
  
12  
  void init {
13  
    cache = new FileBasedStringMap(javaxCachesDir(hostNameFromURL(site) + "/" + assertIdentifier(language)));
14  
  }
15  
  
16  
  class BasicNode {
17  
    S id, label;
18  
    LS aliases;
19  
    S description;
20  
    
21  
    S url() {
22  
      ret site + "/entity/" + id;
23  
    }
24  
    
25  
    toString {
26  
      ret formatColonProperties(paramsToPairs(+language, +id, +label, +aliases, +description, +url()));
27  
    }
28  
  }
29  
30  
  L<Map> search(S q) {
31  
    ret (L) rmapGet("search", (Map) loadJSONPageWithParams(site + apiPath, action := "wbsearchentities",
32  
      format := "json",
33  
      +language,
34  
      type := "item",
35  
      continue := 0,
36  
      search := q));
37  
  }
38  
  
39  
  // ids are separated with "|"
40  
  Map getItems(S ids) {
41  
    ret (Map) rmapGet("entities", (Map) loadJSONPageWithParams(site + apiPath,
42  
      action := "wbgetentities",
43  
      format := "json",
44  
      languages := language,
45  
      +ids));
46  
  }
47  
    
48  
  // itemID = e.g. "Q388"
49  
  Map get(S itemID) {
50  
    if (cache == null)
51  
      ret get_uncached(itemID);
52  
    else {
53  
      S key = itemID;
54  
      File f = cache.fileForKey(key);
55  
      if (exists(f) && fileAgeInDays(f) < cacheExpirationDays)
56  
        ret jsonDecodeMap(cache.get(key));
57  
    
58  
      var result = get_uncached(itemID);
59  
      cache.put(key, jsonEncode(result));
60  
      ret result;
61  
    }
62  
  }
63  
  
64  
  Map get_uncached(S itemID) {
65  
    ret (Map) rmapGet(itemID, getItems(itemID));
66  
  }
67  
  
68  
  BasicNode basicNode(S itemID) {
69  
    var data = get(itemID);
70  
    if (data == null) null;
71  
    new BasicNode node;
72  
    node.id = (S) rgenget id(data);
73  
    node.label = (S) rgenget value(rgenget(language, rgenget labels(data)));
74  
    node.aliases = collectMapValues_gen value(rgenget(language, rgenget aliases(data)));
75  
    node.description = (S) rgenget value(rgenget(language, rgenget descriptions(data)));
76  
    ret node;
77  
  }
78  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 3 computer(s): bhatertpkbcr, mowyntqkapby, mqqgnosmbjvj

No comments. add comment

Snippet ID: #1032555
Snippet name: WikiData
Eternal ID of this version: #1032555/26
Text MD5: 972b25a474a96da530d04f7ba76d1055
Transpilation MD5: 0cccdc373a583738c577315bbd5434e7
Author: stefan
Category: javax / networking
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2021-09-24 15:09:22
Source code size: 2108 bytes / 78 lines
Pitched / IR pitched: No / No
Views / Downloads: 152 / 346
Version history: 25 change(s)
Referenced in: [show references]