Closed pknuuti closed 3 months ago
Ongelmaksi muodostuu old_issues-taulussa oleva tietokantaconstraint. Jos old_issues-taulusta poistetaan nide, nidenumero häviää samalla old_issues-taulusta:
CONSTRAINT old_issues_ibfk_2
FOREIGN KEY (itemnumber
) REFERENCES items
(itemnumber
) ON DELETE SET NULL ON UPDATE SET NULL
Tiputin tuon constraintin Vaara-Nextillä ja olen tekemässä Finna-pluginiin muutosta, jossa pluginin vanhat lainat palauttavassa metodissa tarkastetaan, löytyykö niteelle tarvittavaa dataa sen tietojen näyttämiseksi. Jos tietoja ei ole, siirrytään metsästämään tietueen tietoja muilla tavoin. Käytetään vanhan lainan laina-id:tä (issue_id) apuna ja haetaan siihen liittyvän niteen nidenumero old_issues-taulusta (jonka löytää siis old_issues-taulusta, kun se ei enää poistu constraintin poistamisen jälkeen). Tietuenumeroa ja sillä löytyvää dataa etsitään biblio-taulusta ja jos sitä ei siellä ole, etsitään poistetuista tietueista deletedbiblios-taulusta. Jos tietueesta ei ole enää tietokannassa jälkiä, palauttaa Finna lainan tiedoiksi "Ei nimekettä / Tuntematon".
Vanhojen lainojen tiedot poistettujen niteiden kohdalla siis tulisivat näkyviin vasta sen jälkeen, kun tietokannan sidos old_issues-tauluun on purettu ja jos nide/tietue on poistettu vasta muutoksen jälkeen tietokannasta.
Selvitellään, saisiko noita vanhoja nidetietoja kaivettua statistics-taulusta takaisin paikoilleen old_issues-tauluun, jotta muutosta edeltävissäkin tapauksissa nidetiedot saataisiin näkyviin.
Näyttää siltä, että statistics datetime-timestamp alkaa noudattaa issuedate-timestampia orjallisemmin vuodesta 2018 lähtien, mutta tuolloinkin näkyy vielä sekunnin eroja. Onnistunee kuitenkin varmaan tällä yhdistää hyvin. 2016-2017 lainoissa on vaihtelevia aikoja, n. 10 sekunnista useampaan minuuttiin. Pitää tutkia voisiko noita vähän luotettavammin vielä sitten tarkistaa oikeiksi.
Nextien tietokantoihin ajettu:
ALTER TABLE old_issues
DROP CONSTRAINT old_issues_ibfk_2;
Nyt tätä ominaisuutta voisi testata Nextien Finnoissa. Vain tästä hetkestä lähtien poistettujen niteiden tietuetiedot pystyy hakemaan vanhoihin lainoihin.
Testattavaa: -Miten eri aineistotyypit näkyvät Finnassa, kun vanhan lainan nide on poistettu -Miten aineisto näkyy, kun vanhan lainan niteeseen liittyvä tietue on poistettu (data löytyy vain deletedbiblio/biblioitems-taulusta)
Tällä hetkellä poistetun niteen tietoihin metsästetään seuraavat tiedot:
$result->{'author'} = $deletedAuthor;
$result->{'title'} = $deletedTitle;
$result->{'uniform_title'} = $deletedSeriesTitle;
$result->{'biblio_itype'} = $deletedItype;
$result->{'note'} = 'Poistettu';
$result->{'copyright_date'} = $deletedCopyrightDate;
$result->{'biblio_id'} = $deletedBiblioId;
$result->{'enumchron'} = $deletedEnumchron;
Mitä muuta tietoa tulisi välittää Finnaan ja miten tiedot näkyvät, jos näkyvät?
Ainakin subtitle olisi varmasti hyvä lisä kuten tässä kaksoispisteen jälkeen:
Toteutus on vielä aika raakile ja tuo "uniform_title" ei kyllä taida olla ollenkaan oikea paikka sarjatiedolle, jos se nyt edes välittyy. Sarjajulkaisuja ja kirjasarjoja voisi myös siis testata. Esim. mangat yms. voisi testailla, miten tiedot näkyvät kun nide on poistettu, jos nyt näkyvät ollenkaan.
Testailin outi-nextillä poistelemalla itselläni lainassa olleita niteitä ja teoksen nimeke näkyy edelleen poiston jälkeen Finna-nextillä lainahistoriassa.
Ja tosiaan, tuo subtitle voisi olla hyvä lisätä, koska nyt se tippuu pois.
Ennen poistoa
Poiston jälkeen
Sen sijaan, jos poistin sekä niteen että tietueen tästä teoksesta:
niin lainaushistoria tekit tenät kokonaan.
Jos menin uudelleen lainahistoriaan, niin ensimmäinen sivu näkyi, mutta kun siirryin toiselle sivulle, jossa tuo nimeke on, niin tulee tuo yllä oleva ilmoitus.
Niin ja tuon Novello bookin biblionumber=1466468
OUTIssa testasin. ja jos nyt osasin testata oikein, niin niteen poisto ei muuttanut tietoa lainaushistoriassa "Ei nimekettä"-muotoon vaan listalla näkyi poistetun niteen tietue. Poistin viimeisen niteen, joten poistin seuraavaksi tietueenkin. Minulla käyttäytyi samalla tavalla kuin Annelillakin eli Lainaushistoria meni rikki.
Minun testitietueessa ei ollut alaotsaketta, mutta minulla oli DVD ja sen biblionumber=1341087
Sain korjattua tuon poistetun tietueen tietojen haun ja lisäsin subtitlen.
Lainahistorian haku ei enää kosahda ja poistetulla tietueella näkyy nimeke ja julkaisuvuosi. Tekijää ei jostain syystä näy.
Poistettujen niteiden tietueilla näkyy nyt myös alanimeke.
Vaaran nextillä testasin myös tätä ja nyt näkyy myös poistetun nimekkeen niteen tiedot alanimekkeineen lainahistoriassa. Hienoa.
Lainahistorian haku ei enää kosahda ja poistetulla tietueella näkyy nimeke ja julkaisuvuosi. Tekijää ei jostain syystä näy.
Tekijätieto tosiaan välittyy poistetuista tietuetiedoista lainatiedot hakiessa, mutta sitä ei käytetä, vaan yritetään esittää Finnasta löytyviä tietoja. Minullakin eilen iltapäivällä tekijätieto näkyi, enää ei, selkeästikään haravoinnin seurauksena. Haravoinnissa poistetun tietueen tietuetiedot ovat siis kadonneet Finnan päästä eikä tekijätietoa siksi voi enää näyttää (kansikuvan ja aineistotyypin kera linkkeineen tietueeseen, jota ei siis enää ole olemassa). Kysäisen Finna-kehittäjältä, voiko tuohon luoda jonkin ehdon, että jos aineistoa ei löydy Finnan datasta, yritetään asettaa tekijätiedoksi ja aineistotyypiksi Kohan päästä muutoksen myötä lainatiedot hakiessa välittyvä deletedbiblio/deletedbiblioitems-taulusta haettu tekijä/aineistotyyppitieto.
Liittyy tikettiin https://github.com/KohaSuomi/Koha/issues/507.
Laitan tähän rimpsua noiden kadonneiden nidenumeroiden metsästämiseen ylös:
select * from old_issues inner join statistics on old_issues.issuedate = statistics.datetime
AND old_issues.borrowernumber = statistics.borrowernumber
and statistics.type = 'issue'
and old_issues.itemnumber is null
Mitä tuossa katselin nyt, niin palautuspäivä pitää kutinsa paljon paremmin, en huomaa omassa 250 otoksessa yhtään poikkeamaa.
Eli puuttuvat itemnumberit voisi löytää jotenkin tähän tapaan (kuten ylläkin):
SELECT s.itemnumber
FROM old_issues oi
INNER JOIN statistics s ON oi.returndate = s.datetime AND oi.borrowernumber = s.borrowernumber
WHERE s.type = 'return'
AND oi.itemnumber IS NULL
Olisko nuo tarkoitus siis ajaa takaisin sinne old_issues taluun? Tässä jatkona tietysti sitten se, että löytyykö sieltä edelleenkään niitä bibliotietoja, jos ne on deletedbibliossa. Ja ajellaanko nämä joka vuoden statisticsille erikseen?
Tuotantojen tietokannoista poistettu constraint, joka poisti nidenumeron vanhojen lainojen taulusta niteen poiston yhteydessä.
ALTER TABLE old_issues DROP CONSTRAINT IF EXISTS old_issues_ibfk_2
Vien muutoksen atomicupdatena omaan branchiinsa nextille, ellei yhteisötikettiä sign offata ennen versionvaihtoa (muuten nollabranchiin). Ominaisuus otetaan käyttöön versionvaihdossa, jolloin suoritetaan samalla nidenumerojen palauttamisajo.
Constraintin pudottamisesta tiketti yhteisössä needs sign off-tilassa: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=32729
Tässä SQL ajoa varten talteen:
UPDATE old_issues oi
INNER JOIN statistics s ON( oi.returndate = s.datetime AND oi.borrowernumber = s.borrowernumber)
SET oi.itemnumber = s.itemnumber WHERE s.type = "return" AND oi.itemnumber IS NULL
Ajo pitää suorittaa jokaisen arkistoidun statistics-taulun kanssa.
Seuranta ajoille kimpoittain, ajettu:
Huomiona ajoissa, että aikaleimojen perusteella ei näköjään saa kaikkia nidenumeroja haettua, mutta suurimman osan kyllä. Eli muutamia nidenumerottomia vanhoja lainoja jäi tietokantaan testiasiakkaan tapauksessa ainakin Vaarassa, eikä näin ollen näy Finnassa edelleenkään.
Kaikki ajot suoritettu. Suljen tiketin.
Katselin vähän omaa henkkoht lainahistoriaa sinne 2016 asti, ja aika paljonhan sinne jäi vielä noita lainoja ilman itemnumberia. En tiedä mitä olen horissut tuolloin aiemmin, mutta nyt kun katsoin uudestaan, niin old_issues.timestamp on kyllä ainakin nyt noiden jäljelle jääneiden kohdalla ainakin paljon paikkansapitävämpi aikaleima.
Eli tällä löytyisi lisää vielä jos näitä jaksaa edelleen jahdata:
SELECT s.itemnumber
FROM old_issues oi
INNER JOIN statistics_2017 s ON oi.borrowernumber = s.borrowernumber AND oi.timestamp = s.datetime
WHERE s.type = 'return'
AND oi.itemnumber IS NULL
Ja sitten jos haluaa vielä jahdata niitä sekunnin tai parin viiveitä, niin onnistuu esim. näin:
SELECT s.itemnumber
FROM old_issues oi
INNER JOIN statistics_2017 s ON oi.borrowernumber = s.borrowernumber AND DATE(oi.timestamp) = DATE(s.datetime)
WHERE s.type = 'return'
AND oi.itemnumber IS NULL
AND TIMEDiff(s.datetime, oi.timestamp) IN ('-00:00:01','00:00:00','00:00:01')
Mitä nyt testasin, niin kahden sekunnin virhemarginaaliin tarttui jo joku virheellinen mätsi, mutta jos ensin ajaa nollilla taas läpi, niin sitten todennäköisesti voisi lisätä virhemarginaalia, kun tuo oi.itemnumber IS NULL rajaa taas pois sieltä vaihtoehtoja. (Voi kyllä olla, ettei sinne ihan oikeasti jää juuri mitään jos ajaa vielä tuolla ekalla.)
Finnassa asiakkaan lainahistoriassa on ongelmana poistettujen niteiden näkyminen tai oikeammin näkymättömyys. "Ei nimekettä. Tuntematon" ei kerro asiakkaalle mitään, mikä nimeke hänellä on ollut lainassa. Poistettujen taulusta pitäisi saada nimeketiedot näkymään myös lainahistoriassa.
Liittyy myös tikettiin https://github.com/KohaSuomi/Finna-kehitysehdotukset/issues/16