 Dear students, this is lecture number 38 of the database management system course. The course code is CS403. In the previous lecture, we were discussing about the indexes. What is the purpose of indexes? The purpose of indexes is efficient retrieval of data from the database because otherwise we will have to access the data sequentially. Because we know that the data is stored in the order of the primary key generally. And when we need to access the data on the basis of value of an attribute other than the key, in that situation if we do not have the indexes then we will have to access the data sequentially and that will take time and that would create inefficiency. So index files or the indexes are basically used to provide the efficient access of the data. Or the indexes that you define on a specific table through the create index command or as a result an index file is created. At the end of the previous lecture, we were discussing different implementation techniques for the index files. So we will start our today's discussion from this point. So let's start today's lecture. One of the approach of implementing the index files or indexes is the inverted file. The attribute on which we want direct access inverted file is created on that field. File is said to be inverted on that field. More than one inversions or inverted files can be created even on all attributes. So what is an inverted file? What does it contain? First of all, you should know that inverted file is basically a file that is used to implement an index and you can say that inverted file is sort of an index file. But what is the objective to create an index on any attribute? What is it? And how does it work? For this, you can see some data in front of you. And if you look at it, you will see the different records in front of you. Note that the records are stored on the basis of the primary key values. And you can see this in that state. Let's say we want to create an index on the basis of name. So if this index is created through the inverted file or through an inversion, then what will happen? Look, inversion on student name. There is a format or data in front of you that will be in an inverted file. If you look at it, you can see two columns. In the left column, you have got the names of all the records, the value of the name attribute from all the records in the table. At this time, we have an example table. There are eight records. If there are a thousand, ten thousand, or a million records more than this, this is your inverted file. If the index is created through the inverted file, then you create an index on the basis of the attribute. For example, here we are creating on the student name. So the value of that attribute from all the records, it will be stored in the order. Whether it is ascending or descending, it depends on what option you have given. While creating the index file. If you call it ascending, then the names will be stored in the ascending order. If you call it descending, then these names will be stored in the descending order. After that, look at the second column. It contains the relative record number for this particular value of the name. The student name attribute in the table. If you look at the first column, you see that all the names are in the alphabetical order and in the ascending order. For example, Amjad, Amjad, Arif, Zia, Muhammad Ali, Sadia, all of them. After that, the record in which you have this value of the student name attribute, the value which is listed here in the order, the relative record number of that record. The relative record number means that from where the file is starting, if you call it the first record, then the second, etc. So the record number that is stored in the second column is stored like this. For example, look at Amjad, we have two. By entering the record in this order, both Amjad and Amjad have become the first record. It is not necessary that it is the first, but the agreement has become like this. So in this, you are told that the first record is Amjad and it is in the first position. After that, the second record, which is the basis of the name, is also Amjad from the agreement. It is the second position. Again, this is just by chance. Then the next record on the basis of the name is Arif Zia. See, the actual position of the record having the value in the student name attribute is fourth one. But if you look at it in terms of the name, the position of the name which becomes the order that is on the third place because after Amjad, it becomes Arif Zia in the alphabetical order. So it is written that the record is on the fourth place in the table. Similarly, when we see the names in the alphabetical order, then it comes as Muhammad Ali. The position of this file in this table is sixth. Likewise, the record of Zia Zia in the original table is seventh, then it comes as Suhail Dar. The record of the Suhail Dar is at position five in the table. Similarly, the last record, because we have the same record, is of Tahira Ijaz. And the location of the record having this value in the student name attribute is three. Now see, if you pay attention to this, that the thing you have stored in the inverted file is only the value of that attribute on which you have created the index. And along with that value, the relative record number of that record which is in the position of the file is written. The advantage of this has been understood immediately that rather than duplicating the entire file, there could be 10, 12, 25, 30, 40, 50 attributes in the file. So, we are not duplicating the entire data. As we discussed in the last lecture, we are not duplicating the entire data. Rather, we are just storing the value of the attribute on which we are creating the index. So, only its value is stored. And along with that, as I told you, the value of that attribute is the number of that record which is formed with it. Now, you can see that the storage was efficient that you have only stored one attribute. The second thing is that you have to do the first thing if you want to access the basis of the name. First, you said that the select star from the student where st name is equal to Sadia. Now, the record is stored on the table and the record is stored on the student ID base. The command that you have given, it wants to restrict, it wants to select certain rows based on the value of student name. Now, since you have a student ID, the only option in the absence of index file is to search all records sequentially. Because Sadia's record can be stored on the student ID base and it can be stored on the student ID base. You can never know. So, the only option in the absence of index file is to search all the records sequentially. But now you have got the index file. So, rather than going directly to the table, to the data, you will first consult the index file. You will find the name of Sadia there. Now, of course, you will have a question in your mind that if you have to search, then we need to search here too. But the thing is that from the index file or in that particular entry, it can be very, very efficient. For example, as we have an inverted file here, there are many approaches that you can have to make it efficient. For example, one option can be that the name, the first letter letter from Sadia or S, you can apply hashing on it. So, you can go directly to the place where the entry from S to S can start. The second option is that we also have a binary search. You can use it. Even if you want to do a sequential, let's say worst come worst, if we want to do a sequential too, then you have this, because the record size is small, the sequential search will also be very efficient in this. Although the sequential search will not be there. Even then, if you want to do a sequential too, in the worst case, even then, the sequential search will be more efficient in the table. There is another very important benefit, very important advantage of this index file that let's say you are trying to find out Sadia, record of Sadia. And you have, because in the index file, you have contained all the names in the sorted order. Now, you were first searching for it. Let's say sequential. And after Sadia, you reached to S. And you encountered the name Semal, which is spelling S-W-E-M-A-L. Now Sadia spells S-A-D-I-A, and Semal is S-W-E. Now S-A is smaller, and S-E is larger, bigger. So as soon as you read S-E, or you didn't find S-A, now it is confirmed that there is no record of Sadia in the database table. Why? Because if it was, then the record of Sadia should have been before Semal, because it should have been before that in its alphabetical order. This means that the advantage of index files is that if you want to find a record, then the trace of it, its entry in the index file, should be in a specific location, in a specific order. If it is not there, then it is not here. For example, if you have records, let's say 1 lakh records, and you have the first record, that it is Amjad. First, you try to find a record named Amir, which is A-A-M-I-R, Amir. So Amir is A-A-M-I-R, and Amjad is A-M. The record is A-M, and you are looking for Amir there. So whatever you reach on Am, you will know that Am is Amir, and Amir did not get it. This means that there is no record of Amir in your table. So the problem of sequential search, where there is a possibility, why do you look at the full table in sequential search? Because what happens is that whatever your desired condition is, the record of that record can be anywhere in the entire relation. In an index file, when you sort it on your name, only the names, then after that, when you cross a name, and you get that name, then it is confirmed that you will not get it in the table. Another thing to keep in mind is that you can see the advantage, that fine, this is the advantage. But there is definitely some overhead involved as well. What is that? The first thing is that storage-wise, this is your inverted file. This is a separate file. So this will take your place, apart from the data that you are storing in the database table. Apart from that, your index file is also stored. The first thing will be this. The second thing is that now the maintenance of the index file is also involved. That means that you add your record in your table, in your relation. So the entry that has to appear in the index file at the appropriate place. For example, if you enter the Rehana record and the Rehana record becomes your last record based on your ID, then you will also write the Rehana record in the table. But at the same time, you will make an entry in the index file with the name Rehana and also place its relative position in the table. Because this is the last record, so in this case, it will become a bloodstain. So this will make your mind that nothing comes for free. If you are giving an index file as a facility, along with it, it is introducing some overhead. Now here is another example of an inverted file, that is inversion on the student address. On this, the first record we have in inverted file is of NULL. Because this is the smallest value considered by this reference. So NULL is on the 7th position because we have not entered the address in the 7th record. So it came first on the number. After that, because in alphabetical order, the digits come first from the alphabet. So our first record was A8ST Lahore. Now this record is placed at the one position, the relative position of it. Then after that, A j road, you see the alphabetical order is placed at the same position. And like that. Now you can see that if you have created an inversion, an index file through an inverted file, then the more attributes you have, you will create the indexes. If the indexes are being implemented through inverted files, then the inverted files they will be created for every index. So what is involved in this, you should understand that in this case, let's say you have created two indexes on two different attributes. One of them is the primary key base which you defined as primary key. So that was created automatically by the DBMS. You have created it explicitly. See, whenever you make any change in the records, you change someone's data. First of all, if you change the address of a student, then its address will change in the table. But with that new address, the position of this record is relative. With reference to the index file, it will be adjusted. And the previous entry will be removed or replaced in a new place. So what I talked to you about having indexes is fine. They provide efficient access. But you also have to keep in mind the overhead which is involved. Inverted files contains the values of the attribute the sorted order and the relative address of the record fine. DBMS searches appropriate record number and hands over to the access method to retrieve that desired record. See, here we have referenced one thing as the access method. As far as the access method is concerned, what we mean by that is our file organization which we have studied in which we have studied the sequential file, the index sequential file and the hashed file organization. In this, what is your index file that is being basically maintained by the DBMS database management system and your access method as your file organization that is jointly managed by the operating system and the DBMS. So in this, what we have said is that the one who will refer your index file will do the DBMS himself. And in that, the one who was looking for your record that was your index file let's take an inverted file from that DBMS and searches and I confirm that it is not accessed sequentially. There are very efficient methods like you gave an example that can be hashed that can be binary searched and there are other ways through which even in the index file your DBMS finds its required value efficiently. That is not sequential. So sequential in the index file find that value that is its relative record number that would be handed over to the access method or the file organization system that will hand over to you. And then your file organization system will map it with the reference of its arrangement and records that will then access it. Whether it is applying hashing whether it is creating indexes or indexes or whatever it is doing then it is the responsibility of the access method the file organization to go to that particular record and access it and return it. That was all about the inverted files that we have to study and I hope that you have realized that how do they make the access efficient. First you search for the value that you need to find in your index file and then you go to that record directly. So that was how the inverted files work. And I have said to you that you can have multiple inverted files for the same table once. And this possibility is that you have multiple indexes one inverted file is zero and zero is implemented one sort of case and like that this is also possible. Now we are going to discuss the second approach of implementing the index files. And as I told you that we are not going to discuss the link list themselves we are just going to discuss how they are used to implement the index. Link lists are also known as a pointer chain. One thing needs an extra field in the physical record to store the link. Now the idea basically is that as you know in the link list every node points towards the next node. So this idea basically to implement this idea we need a pointer and as in the link list you use your data with an extra attribute to store the link. The same idea is being implemented here that now the physical record whatever you store in the physical record but you will store one field to store the link or pointer chain. So through that you will link the records together. Relative addresses are used and then you will link them together through relative addresses. For example we have the same data we saw on the slide last time here you are seeing at the end of the slide rather the last attribute of this slide is pointer. Now this is a pointer that is being used to store the order of the records on the basis of name value. You need a true name attribute value on that value this is the order of the records which is stored. For example if you see our first record because the first record we have to store it separately. Like in the link list you store the head the first record will store a different attribute. First we said Amjad was our first record. So we have stored it in a different attribute in a different place. Now the first record will reach Now this record contains the address of the next record on the basis of the order of the names. So what will happen that the first record is written as 2 which is the record number 2. When the record number 2 is the record of Amjad what is written in its pointer 4 which means that on the basis of name order wise the next record becomes record number 4. Go to 4 there is 6 there is 7 there is 7 there is 8 and when the record is written as 5 it is written as 3 and 3 is written as 0 0 means this is the last record of this list. In this order that is the last record. This means when you have to search on the basis of name so if you are sequencing then you will follow this chain then you will get the record of the sequence. Again see what is the reason why I am searching on the basis of name so if you follow this chain then whatever you cross you reach on the basis of name now the basis starts with S and you are looking for M A if you reach you don't find M U then you will find the name of the sequence then you will find the search and also I told you that if you feel that we have sequential search involved whether it is in order or sequential then I told you that it can be for example that the first record of any letter or on the basis of it in the tree or save it in the form of inverted file then the first record as we have Muhammad Ali then if this first record starts with M then you can store this in an inverted file that record number 6 is the first record and the other chain can be then this possibility can be so means the drawbacks that you see in the situation it means it is not necessary that you take this option in that situation you take another option because I have told you that during this course you are studying different options for different things now let us take a particular option that is your decision and you analyze your own environment so this is how the pointers are used to implement the index head pointer needs to be stored pointers for multiple fields can be created as we added a pointer field when we created the index on the address we created the inverted file likewise we can create another link list on the address so in this way the two pointers will be added in this way we can include multiple pointers in the physical record or practical implementation of the file in this way we can also implement the concept of circular link list because previously we saw the last record that contains zero or null it means this is the last record of this chain or the name chain is the last record record number 3 we had zero in record number 3 we can also place one this way it becomes a circular link list and you have read in data structures that the benefit of circular link list is that if you are standing at any point then you can further move that you can follow the chain otherwise you will have to start so through the implementation of index you can make it circular and at the same time the other option we are going to discuss is that you can do a double link list double link list is that on every node you have a next pointer and previous you know if you are standing at any point then you can forward and backward so you can implement it yes double link list now we are going to discuss the tree index tree index means we implement index through trees this concept we have discussed to some extent in the indexed talks we talked about a tree but I said that we will discuss these things in detail when we discuss data storage and indexed concepts now this is the time and again we are not going to discuss the trees themselves in depth but these are the typical arrangements of nodes each node stores key values and pointers nodes are connected through links as you saw in the inverted file it is a structure which attributes value and its relative order this condition We have a tree node, which is stored in the tree, and the key value that you want to search for is the key value that you want to search for. Along with this, we have pointers that point to the cores. This is a general idea. When we are going to look at its details, a general idea is that you have a record structure, that the top is your root, and then its branches, its children, and then it is linked to it. And every node has key values, along with the different pointers. So this is a basic idea of tree index. You will see its implementation further. Well, yes, this is common with almost all trees, that there is a special node, the root node. Each node has a parent node, but the root node does not have a parent node. And has one or more children, except the leaf nodes. There is no child node of leaf nodes. Different types of trees exist. There are different types of trees. You have definitely read that. There are binary trees, balanced trees, and different types of trees. The particular type of tree that we are going to use in the implementation of index files is B plus trees. And its characteristics are that the number of pointers in a node is one more than the number of keys. This means that as we have already discussed that there will be some pointers in a node, and some keys will be present in it. So the number of pointers will be one more than the number of keys. If there is so much space in the node that there can be three keys, then there will be four pointers in it. Similarly, if there are ten keys in it, then there will be eleven pointers in it. The number of pointers in a node is called the order of tree. What is the order of this tree? The special thing about it is that the distance of all leaf nodes from the root is the same. This is something that is specific with these B trees or B plus trees. The distance you make in terms of links between the nodes. So all your leaf nodes will be at the same distance from the root node. And this is the special property of these B plus trees. As I have told you that nodes have keys and pointers in them. So the link between these nodes is that the leftmost pointer will point those nodes which have less keys than the first key. And the rightmost will be the one with less keys than the rightmost. And the rightmost will be the one with less keys than the rightmost. Let us look at this example. What are the index entries? The search key value, for example, we said that if there is a key value on the name, we have key value first, we have amjad and comma page id. That is an example of the particular record on the id of that page. So on that page, you search the entries on the leaves and you can access your required record. The example we are going to show you is that the node you have has two keys. When there are two keys, that means there will be three pointers. Now this is an example of the tree index. In this, you can see that the nodes we have, the values are two stored and the pointers are three stored. Another thing is that the leftmost pointer will point to the node that contains the smaller values than the first value. And the second pointer says that the bigger values are equal to this value. And the rightmost pointer will do that the second key value store is equal to this value. So this is a general idea of how a tree is constructed and what its structure is. First of all, you have to search for a value. For example, you want to search a record with the value of 35. If you want to search for 35, then you will always start from the root. You will start from the root. Now you will compare your value with the first value in the root. The first value stored in the root is 40. Now you will see that the required value of 35 is smaller than 35. Now 35 is less than 40. So what you will do is that you will follow the left link. If you follow that link, then you will come to that node where 20 and 33 are stored. Again, you will compare your value with the first 20. If you compare it with 20, then what is the difference? Since your 35 is bigger than 20, then you will not follow the left link. Then you will see that you will compare it with 33. If you compare it with 33, then 35 is also bigger than that. Now you will follow the right link of 33. And you will come to that node where you have got 33 and 37. Now in this node, which is your leaf node, where you can see values with the star, this is basically your leaf node. You suppose that there are practically records here. So where you will search the records sequentially. And it is sure that the leaf nodes in your records are sorted in order. Now you have compared 35 with 33. You have compared it with 37. Now 37 is greater than your required value, that is 35. When you reached a big value and you didn't find the 35, your record record, this means that the record with the 35 value doesn't exist here. Now look at the sequential search ratio. During very few comparisons, you realized or you came to know or you found out that your required record doesn't exist. Let's say you want to find out the record with the value 46. You have compared it with 46. Now 46 is larger than 40. You will follow the right link of the right link since there is no second link. You have followed the right link. You have reached the first value, which is 51. Now your 46 is your required record and it is smaller than 51. Since it is smaller, you will follow the left link of the first link. Now you will come to that leaf node where 40 and 46 are lying. Now you will compare 40 with 46. You will come to the next one. When you reach the particular part of the node where 46 is lying, when you compare, they are the same. So this is your required record. Now look, if you first find out that this is your record, which you can see on the screen right now. If you find out this is your record, then you will find out that 46 is the eighth record. So after finding out the eighth record, you will come to know which is your record. First you have read the 41 node, then the 51 node, and then you have directly reached that point where your record was. So since this is a small scale, which is a small example, there are less values in it. On this small scale, you can see that after a little excess, you reach your desired record. So this is a general structure that you have, how your tree index is. Now I will quickly go through the other two or three slides in which you will have a little idea that when different keys will enter in it, then how will your tree's face change at that time? For example, look, in this slide, we said that we first enter this file. We enter a record in which the value of this key is 25. So what will be the center of the record? What will be the shape of the tree? This will be. Now look at this, you have another node at the bottom of the root, and here you have adjusted 25. Now look at this, you have inserted it on the tree, and this happens. Now a stage has come, if you look at it, now your tree has increased its level. You see that the first level you had, the first tree was only 2. Now here level is 3 because now the root node has gone up a step. This means that the leaf nodes will remain the same distance and your tree will continue to grow on the top side, and this way your tree will continue to be popular and your index will be maintained. Now the question arises that the leaf nodes that we had said that we had placed values and stars there. The question arises that what can be read in the leaf nodes or what can be there? With that you will be able to see more clearly how the index files or tree index are used to search for a required record. What is actually stored in the leaves of the index for key value K? There are three alternatives. The first option is that actual data records with key value K, i.e. the leaf nodes that you have there are practically your records stored there. As we had shown that we have two values that can come to us in a leaf node. These are basically the records in the leaf node. The key value of the leaf node is the store because it is the part of the record. So not only the key value is stored, but the entire record is stored there. If you have reached the value of the leaf node in that particular key value, that means you have reached that record only. But obviously what you see in this is that what you see in this is that when you have a unique value against which you have only one record. The second possibility is that K, i.e. the value of the index attribute on which we have created the index. And along with it is the record ID of matching data record. The record in which this value is of that attribute, its ID. As we had talked about, in relative record number, in inverted files and pointers, it is at this point that your key value store along with a pointer which is pointing to that location where that record is stored, it can be an address and it can be a relative record number as we have used before. The second possibility is that K is the key value and the list of record IDs of matching data records. Especially when we have talked about the list, you must have understood that in the case of the secondary key, it is more suitable or possible because we have only one value in the case of the secondary key, it can have multiple values. So either you have with multiple values the records that you have, you can have multiple entries in the leaf node. And in that case, when you get a record, you will have to search sequentially for how many more records. The second possibility is that you can store all of their IDs. There will be a list of record IDs in which there will be a place like Amjad, where we have two records. So when we store the record IDs, we will have to store the list of record IDs that is Amjad and along with those records' IDs, i.e. 1, 2, that Amjad is also with Amjad and we also have Amjad's record on 2. So all the records which have the same value of that attribute will have IDs. If we look at our alternative 1, then the actual data record is stored along with the key. If this is used, the indexed structure is a file organization for data records. In the same file, or in the sorted file, or in the indexed sequence, it is the same situation that it is your file organization itself. Because your leaf node is storing the key's value of the record too. So the indexed file is also your file organization. Yes, it is obvious that the alternative 1 that you can adopt only for one attribute. Because it is obvious that if you are doing multiple attributes, then basically you are duplicating the data. For example, in the student case, if the student ID is unique, for example, if the national ID card is also stored, then it is unique. So if we apply these tree indexes and store the data directly on the leaf nodes, like the alternative 1 means that we are storing the records at two places. Once, with the student ID's reference, once with the national ID's card's reference, then that would be inefficient. The redundancy is involved in that. So it is obvious that the alternative 1 is used for one index. And normally, as we have discussed again and again, it is only on the primary key that your tree index is stored. And the leaf nodes they contain practically physically the records. Otherwise, if you have to apply tree index, index create and tree index then preferably you will use alternative 2 or alternative 3. This alternative saves pointer lookups, but can be expensive to maintain with insertions and deletions. For example, in the leaf node, you do not have the key value but the entire record is stored. So the advantage of a straight web is that you do not have to record the key value, also the record at the same place. But the negative side is that it can only be one attribute and normality is on the primary key. The second thing is that if your record insertion that you are doing in the database, if it contains a lot of disorders, disorders means that you do not enter the key value in sequence but you are giving the gap and you are giving the values of the gap again. For example, you gave record number 1, then 10, then 15, then 20, then 25, then 30, 32, 33, 34, 48, 49, like this. You gave the gap, now your file is getting popular, your nodes are getting formed and you can have one node that record number 1 and 10. You can record it. First, you go later and you bring the record with key value 8. You have to maintain the order. According to the order, it should be the first node, then the disturbance will be created. And due to this file's size will grow and if you increase the disorder, there will be a lot of gaps and you will have to shift the record. You will have to move it and there will be changes to the higher levels. So, keep in mind that if you cannot force it, when there is a red entry, you always enter the data in the order of the key. You can advise them that this is better. But you cannot force it. You should know that if they give a lot of gaps and record again, you should understand as a designer, as a DBA that there is a problem that is not being efficiently accessed. So, you can do one way that when your file is popular, you can create it in a new way with a new series. Now, as many records are available in the file, it will become a little more efficient. But then it will be that in a new structure, in the new file, it will be in order. So, this is your alternative one in which you have stored the key in the leaf nodes. It is efficient that it does not have to follow the pointer, but if that insertion division is not in order, it can be a problem. Alternative two and three are that in the leaf node key value and their pointers. Whether it is a single pointer or a list of pointers. As I said, record ID of matching data record. Three is list of record IDs. Easier to maintain than alternative one. So, when you want to do an insertion division out of order, rather than moving the records, you simply have to shift the key. So, it is easy to manage it. If more than one index is required on a given file, at most one index can use alternative one. Obviously, we have already talked about it. Rest must use alternatives two or three. Obviously, the physical records are on alternative one which is your key. The other indexes will ask two or three questions. If it is unique, it can go for two. But if it is not unique, then obviously it has to be three. Alternative three is more compact than alternative two. But leads to variable size data entries even if search keys are of fixed length. Do you understand that you have a flexibility. You have left the option of storing the list of record IDs. If it is unique, then you have only one element and it can still work. But if you have the secondary key, you have got the multiple entries, multiple records with the same value, then you have to store the list of record IDs. It is flexible but the problem is the size of a node that you cannot fix that has to be variable somehow. The implementation of this because obviously you cannot fix that how many entries are there in a node with a specific value. For example, the list of record IDs can be one record, two, ten, more than this. This means that the entries you have have to have a value and the list of record IDs have to be variable somehow. There are many ways of implementation that we are not going to discuss but the advantage is that it is flexible, it is compact but the overhead and the negative side is that the entries cannot determine the size that has to be variable. Whatever you are searching that is fixed size. Even then your entries can be multiple, they can be variable because you cannot determine the number of entries for a particular value. Even words for large record IDs list the data entry would have to span multiple blocks. When you have many possibilities that you have one country that has multiple values the third alternative is quite difficult to handle but the thing is that if you do not have any other choice then definitely you have to do that. Dear students, in today's lecture we have discussed different implementation of index files and as I mentioned at the start of the lecture the advantage of reading these implementation techniques is that as a database person as a database expert you should not simply use their benefits their advantages compare them with their cost. You should know that if I am going to use these features then its underlying cost is cost in terms of storage cost in terms of processing cost in terms of time what is that? So that you can use your resources and your options so in today's lecture we have studied the inverted files we have studied the link list or the pointer change and we have studied the tree index. We can implement indexes in different ways but these three are your major ways we generally implement indexes and every basic idea the advantages and disadvantages we have discussed. We will conclude this topic and we will start discussions on views in the next lecture I will leave now Allah Hafiz